canal

浅析数据库与缓存的双写一致性问题

余生长醉 提交于 2019-11-30 08:12:27
缓存由于其高并发和高性能的特性,在项目中被广泛使用。读缓存流程如下图: 双写一致性有以下三个要求: 缓存不能读到脏数据 缓存可能会读到过期数据,但要在可容忍时间内实现最终一致 这个可容忍时间尽可能的小 要想同时满足上面三条,可以采用读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况。但是,串行化之后,就会导致系统的吞吐量会大幅度的降低,要用比正常情况下多几倍的机器去支撑线上请求。 所以,在这里,我们讨论三种常见方法: 先更新数据库,再更新缓存 先删除缓存,再更新数据库 先更新数据库,再删除缓存 1. 先更新数据库,再更新缓存 这种方法是大家普遍反对的,原因集中在下面两点: 原因1:线程安全角度。 同时有请求A和请求B进行更新操作,那么会出现: 线程A更新了数据库 线程B更新了数据库 线程B更新了缓存 线程A更新了缓存 这就出现请求A更新缓存应该比请求B更新缓存早才对,但是因为网络等原因,B却比A更早更新了缓存。这就导致了脏数据,因此不考虑。 > "先更新缓存,再更新数据库"这种方案同理,也是造成脏数据,所以不被考虑 原因2:业务场景角度。 有如下两点: 如果你是一个写数据库场景比较多,而读数据场景比较少的业务需求,采用这种方案就会导致数据压根还没读到,缓存就被频繁的更新,浪费性能。 如果你写入数据库的值,并不是直接写入缓存的

阿里Canal框架(数据同步中间件)初步实践

ε祈祈猫儿з 提交于 2019-11-30 03:28:41
背景介绍 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。 适用版本 支持mysql5.7及以下版本 传统的主从同步原理 master将数据记录到了binlog日志里面,然后slave会通过一个io线程去读取master那边指定位置点开始的binlog日志内容,并将相应的信息写会到slave这边的relay日志里面,最后slave会有单独的sql线程来读取这些master那边执行的sql语句记录,达成两端的数据同步。 传统的mysql主从同步实现的原理图如下所示: Canal中间件功能 基于纯java语言开发,可以用于做增量数据订阅和消费功能。 相比于传统的数据同步,我们通常需要进行先搭建主从架构,然后使用binlog日志进行读取,然后指定需要同步的数据库,数据库表等信息。但是随着我们业务的不断复杂,这种传统的数据同步方式以及开始变得较为繁琐,不够灵活。 canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议mysql master收到dump请求,开始推送binary

mysql跨机房异地区的主从数据库同步备份业务实现解决方案

情到浓时终转凉″ 提交于 2019-11-30 03:28:30
mysql跨机房异地区的主从数据库同步备份业务实现解决方案 2018年11月14日 17:16:02 南通SEO 阅读数 1857 mysql跨机房异地区的主从数据库同步备份业务实现解决方案 背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。 ps. 目前内部版本已经支持mysql和oracle部分版本的日志解析,当前的canal开源版本支持5.7及以下的版本(阿里内部mysql 5.7.13, 5.6.10, mysql 5.5.18和5.1.40/48) 基于日志增量订阅&消费支持的业务: 数据库镜像 数据库实时备份 多级索引 (卖家和买家各自分库索引) search build 业务cache刷新 价格变化等重要业务消息 项目介绍 名称:canal [kə'næl] 译意: 水道/管道/沟渠 语言: 纯java开发 定位: 基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql 关键词: mysql binlog parser / real-time / queue&topic 工作原理 mysql主备复制实现

canal使用记录

我们两清 提交于 2019-11-29 21:39:50
canal是阿里巴巴的来源项目。我们可以通过配置binlog实现数据库监控,得到数据库表或者数据的更新信息。 参考我的文档前先去官网看下,可能已经支持更高版本的MySQL了 1. 查看官方开源项目 https://github.com/alibaba/canal 2. 下载最新的canal.deployer-XXXX-SNAPSHOT.tar.gz https://github.com/alibaba/canal/releases 3. 查看wiki ps. 目前内部版本已经支持mysql和oracle部分版本的日志解析,当前的canal开源版本支持5.7及以下的版本(阿里内部mysql 5.7.13, 5.6.10, mysql 5.5.18和5.1.40/48) 所以需要安装mysql5.7以下的版本稳妥些 4. 去MySQL官网下载mysql并安装 5. 查看mysql安装目录 image.png 6. 复制一个my-default.ini改名叫my.ini 修改对应位置: 添加: image.png #添加这一行就ok log-bin=mysql-bin #选择row模式 binlog-format=ROW #配置mysql replaction需要定义,不能和canal的slaveId重复 server_id=1 character-set-server=utf8

canal redis mysql实现数据同步

和自甴很熟 提交于 2019-11-29 17:16:02
canal 原理【 官方文档 】 简介 canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务 基于日志增量订阅和消费的业务包括 数据库镜像 数据库实时备份 索引构建和实时维护(拆分异构索引、倒排索引等) 业务 cache 刷新 带业务逻辑的增量数据处理 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看) MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log) MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据 canal 工作原理 canal 模拟 MySQL slave 的交互协议

拆解大数据总线平台DBus的系统架构

孤街浪徒 提交于 2019-11-29 09:38:14
拓展阅读: 如何基于日志,同步实现数据的一致性和实时抽取? 快速部署DBus体验实时数据流计算 Dbus所支持两类数据源的实现原理与架构拆解。 大体来说,Dbus支持两类数据源: RDBMS数据源 日志类数据源 一、RMDBMS类数据源的实现 以mysql为例子. 分为三个部分: 日志抽取模块 增量转换模块 全量拉取模块 1.1 日志抽取模块(Extractor) mysql 日志抽取模块由两部分构成: canal server:负责从mysql中抽取增量日志。 mysql-extractor storm程序:负责将增量日志输出到kafka中,过滤不需要的表数据,保证at least one和高可用。 我们知道,虽然mysql innodb有自己的log,mysql主备同步是通过binlog来实现的。而binlog同步有三种模式:Row 模式,Statement 模式,Mixed模式。因为statement模式有各种限制,通常生产环境都使用row模式进行复制,使得读取全量日志成为可能。 通常我们的mysql布局是采用 2个master主库(vip)+ 1个slave从库 + 1个backup容灾库 的解决方案,由于容灾库通常是用于异地容灾,实时性不高也不便于部署。 为了最小化对源端产生影响,我们读取binlog日志从slave从库读取。 读取binlog的方案比较多

Canal使用RocketMQ同步MySQL到Redis(二)

那年仲夏 提交于 2019-11-29 08:04:31
一、Canal使用RocketMQ同步MySQL Canal结合RocketMQ同步MySQL 二、 同步数据到Redis 2.1 安装Redis 略 2.2 Redis配置 略 2.3 SpringBoot配置 2.3.1 引入依赖 <dependency> <groupId>com.alibaba.otter</groupId> <artifactId>canal.client</artifactId> <version>1.1.4</version> </dependency> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.0.2</version> </dependency> <!-- 根据个人需要依赖 --> <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> </dependency> 2.3.2 通用代码 SQLType.java import lombok.AccessLevel; import lombok.NoArgsConstructor; /**

Docker 安装单机 Canal

北城以北 提交于 2019-11-29 07:22:49
一、 Docker安装 略 二、 修改MySQL配置 2.1 修改my.cnf配置 对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下 log-bin=mysql-bin # 开启 binlog binlog-format=ROW # 选择 ROW 模式 server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复 记得重启MySQL 2.2 新建MySQL用户 授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant -- 新建用户 CREATE USER canal IDENTIFIED BY 'canal'; -- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; -- 刷新权限 FLUSH PRIVILEGES; 三、 Canal Admin部署 2.1 下载镜像 docker hub #拉取 canal Admin镜像 $ docker pull canal/canal-admin

使用canal通过mysql的binlog日志对mysql进行监控(同步服务)

ぐ巨炮叔叔 提交于 2019-11-29 02:29:01
一、环境介绍 canal是阿里开源的中间件,主要用于同步mysql数据库变更。具体参见:https://github.com/alibaba/canal/releases 搭建环境: vmware centos7 部署mysql和canal windows开发canal client,自动捕获mysql数据库变更 二、Centos安装Mysql 1、尝试用yum安装mysql wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm sudo rpm -Uvh mysql57-community-release-el7-10.noarch.rpm sudo yum install -y mysql-community-server 如果执行顺利,安装mysql server 成功。 2.改用阿里源安装 可是官方的yum源在国内访问效果不佳,我下载mysql server的速度太慢了,决定改用阿里源 #下载wget yum install wget -y #备份当前的yum源 mv /etc/yum.repos.d /etc/yum.repos.d.backup4comex #新建空的yum源设置目录 mkdir /etc/yum.repos.d #下载阿里云的yum源配置 wget -O /etc