Canal增量数据同步利器介绍与安装
Posted 杨 戬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Canal增量数据同步利器介绍与安装相关的知识,希望对你有一定的参考价值。
文章目录
Canal增量数据同步利器
Canal介绍
canal主要用途是基于 mysql 数据库增量日志解析,并能提供增量数据订阅和消费,应用场景十分丰富。
参考官方文档:
Canal应用场景
- 电商场景下商品、用户实时更新同步到至Elasticsearch、solr等搜索引擎;
- 价格、库存发生变更实时同步到redis;
- 数据库异地备份、数据同步;
- 代替使用轮询数据库方式来监控数据库变更,有效改善轮询耗费数据库资源。
Canal原理
Canal的工作原理与MySQL主从复制原理类似,首先我们来回顾下MySQL主从复制的原理:
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则是把自己伪装成 slave 节点与master进行交互
- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
Canal安装
参考文档:https://github.com/alibaba/canal/wiki/QuickStart
步骤1:MySQL Bin-log开启
1)MySQL开启bin-log
a.进入mysql容器
docker exec -it -u root mysql /bin/bash
b.开启mysql的binlog
cd /etc/mysql/mysql.conf.d
在mysqld.cnf最下面添加如下配置
# 开启 binlog
log-bin=/var/lib/mysql/mysql-bin
# 选择 ROW 模式
binlog-format=ROW
# 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
server-id=12345
c.创建账号并授权
授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant:
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
d.重启mysql
docker restart mysql
开启bin-log后,我们可以用sql语句查看下:
show variables like '%log_bin%'
效果如下:
步骤2:Canal安装
1)拉取镜像
docker pull canal/canal-server:v1.1.1
2)安装容器
a.安装canal-server容器
docker run -p 11111:11111 --name canal -d docker.io/canal/canal-server
b.配置canal-server
修改/home/admin/canal-server/conf/canal.properties,将它的id属性修改成和mysql数据库中server-id不同的值,如下图:
c.修改/home/admin/canal-server/conf/example/instance.properties
,配置要监听的数据库服务地址和监听数据变化的数据库以及表,修改如下:
指定监听数据库表的配置如下canal.instance.filter.regex
:
mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
常见例子:
1. 所有表:.* or .*\\\\..*
2. canal schema下所有表: canal\\\\..*
3. canal下的以canal打头的表:canal\\\\.canal.*
4. canal schema下的一张表:canal.test1
5. 多个规则组合使用:canal\\\\..*,mysql.test1,mysql.test2 (逗号分隔)
注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)
3)重启canal:
docker restart canal
以上是关于Canal增量数据同步利器介绍与安装的主要内容,如果未能解决你的问题,请参考以下文章
Docker安装canalmysql进行简单测试与实现redis和mysql缓存一致性
ElasticSearch实战(四十七)-Canal 实现 MySQL 数据实时同步方案