canal: 阿里巴巴出品的mysql数据库binlog日志增量订阅&消费的组件。
在常有业务中数据量剧增的情况下,我们通常会采用数据库读写分离的方式来减轻项目对数据库的访问压力。如果想使用读写分离的方式需要增加mysql从库,并且同步主库数据才能确保数据的真实性。

mysql的主从复制:
1.master库做出数据或数据结构的变更会记录到binlog二进制日志中
2.slave从库有一个I/O线程去实时读取master库的binlog日志,并把新的日志写入relayLog 中继日志中
3.slave从库持续读取中继日志,并把发生数据或结构变化的SQL解析出来更新当前库
canal相当于把自身伪装成slave从库,从mysqlMaster的binlog中解析出数据后根据业务不同把数据推送向不同类型的数据存储数据库中。
canal-es同步部署:
github地址:https://github.com/alibaba/canal
canal的工作原理:canal server连接mysql,读取mysql的binlog;canal client 连接 canal server 去获取数据做相应更新操作。
1.Mysql服务端修改配置并启动
$ vi etc/my.cnf[mysqld]log-bin=mysql-binbinlog-format=ROWserver_id=1$ mysql -urootCREATE USER canal IDENTIFIED BY 'canal';GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;FLUSH PRIVILEGES;$ sudo service mysqld start
canal server需要连接mysql才能够抓取binlog日志,想使用canal我们首先需要设置mysql的binlog日志格式为ROW。其次,连接mysql需要使用的mysql用户必须拥有REPLICATION SLAVE, REPLICATION CLIENT权限,因此我们最好给canal连接mysql的账户全权限。
2.单机部署canal server
首先需要前往官方网站https://github.com/alibaba/canal/releases/tag/canal-1.1.5-alpha-1下载server端tar包

在linux系统中解压tar包,解压后的目录如下:

先看conf配置文件夹:

其中:
(1)canal_local.properties是canal1.1.4版本后新增的,因为在1.1.4版本后新增了admin配置模块,如果我们使用admin启动canal的话,需要配置的文件是canal_local.properties
(2)canal.properties是我们直接启动canal需要关注的配置文件,如果我们直接启动canal会使用canal.properties做为server的启动配置。
(3)example文件夹代表我们要启动的一个canal server下的instance,里面存放这个instance的配置文件。
(4)logback.xml 文件中存放canal server的日志配置。
(5)剩余两个文件夹metrics和spring中存放一些java的配置,无需理会。
canal.properties
(1)common配置

我们如果是单机server配置,不用做任何修改。
我们如果是集群环境配置canal server :
1> 需要追加canal.id=1
canal.id是canal的编号,在集群环境下,不同的canal server的id不同,它和mysql的server_id不同。
2> canal.ip
ip这里不指定,默认为本机ip
3> canal.port
canal server的端口号
4> canal.zkServers
如果要部署canal集群模式需要配置使用的zookeeper
(2) destinations配置

1> canal.destinations
这是canal server 的instance名称,同一个canal server可以有多个instance存在,但是每个instance的名称不能相同。可以设置多个,比如example,example1,example2。
但是,如果设置多个instance,则需要在解压后的conf文件夹下创建多个相同名称的文件夹,每个文件夹下必须有一个instance.properties文件来支持当前instance的配置。
2> canal.instance.global.spring.xml
全局canal instance的管理用spring,这里的file-instance.xml最终会实例化所有的destinations instance。
比如canal.instance.destination=example的时候就会加载example/instance.properties配置文件
conf/example/instance.properties

在这里,需要修改自己对应的数据库配置信息。并且如果是集群模式,canal.instance.mysql.slaveId不能够跟mysql集群中已有的server_id一样
如果系统是一个cpu,还需要设置canal.instance.parser.parallel = false
以下操作都在canal根目录下
canal server启动
sh bin/startup.sh
canal server关闭
sh bin/stop.sh
canal server 日志查看
vi logs/canal/canal.log
canal server instance 日志查看
vi logs/example/example.log
3.单机部署canal client
首先需要前往官方网站https://github.com/alibaba/canal/releases/tag/canal-1.1.5-alpha-1下载client端tar包

目录结构
在linux系统中解压tar包,解压后的目录结构如下:

1> bin
存放启动、关闭命令
2> conf
存放相关配置命令
3> lib
存放项目对应所需jar包
4> logs
存放对应的日志文件
5> plugin
存放对应适配器的jar包
配置文件讲解
canal client的配置文件存放在根目录的conf文件夹下,大体的目录结构如下:

1> es6、es7、hbase、rdb等文件夹
存放对应适配器(要同步到的载体)的相关配置
2> logback.xml
存放相关日志的配置文件
3> META-INF
设置BootstrapConfiguration
4> application.yml
client启动总配置文件
application.yml
服务配置

服务配置中主要需要注意canal.conf.mode 选择当前服务的连接模式(tcp、kafka、rocketMQ、rabbitMQ等),设置批次大小与同步批次大小,设置mysql同步主库地址。
适配器配置

instance:选择server的一个instance,写instance名称或者mq的topic名称
groups: 分组存放适配器
groupId: 如果设置的话适配器的配置文件中需要指定对应的id才能够获取对应数据
- name: 配置对应的适配器(匹配conf中适配器的文件夹名)
这里只讲es6
设置es的连接地址、连接方式和es的集群名称
/conf/es6/my_test.yml

dataSourceKey: 写对应client的srcDataSource的名称
destination: 对应canal server的实例名称
outerAdapterKey: 对应client中Adapter里指定的适配器的key
groupId: 如果指定的话,当前适配器只会接受对应id分组下的数据
es配置主要讲下sql ,这里拼接的sql有固定的要求(官网指出):
1. 主表不能为子查询语句
2. 只能使用left outer join即最左表一定要是主表
3. 关联从表如果是子查询不能有多张表
4. 主sql中不能有where查询条件(从表子查询中可以有where条件但是不推荐, 可能会造成数据同步的不一致, 比如修改了where条件中的字段内容)
5. 关联条件只允许主外键的'='操作不能出现其他常量判断比如: on a.role_id=b.id and b.statues=1
6. 关联条件必须要有一个字段出现在主查询语句中比如: on a.role_id=b.id 其中的 a.role_id 或者 b.id 必须出现在主select语句中
只有遵循要求的SQL才能够被解析并同步数据到es,否则适配器无法进行数据同步。
canal client启动
sh bin/startup.sh
canal client关闭
sh bin/stop.sh
canal client日志查看
vi logs/adapter/adapter.log
至此,canal server和 canal client就都已经搭建完毕了,开启canal server再开启canal client 我们就能够进行数据同步了。
以上为canal - es 同步的单机模式搭建过程。




