最近leader建议小组内每个成员选一个主题,一个月分享一次新技术的学习成果。于是就有了这篇文章的诞生。
0、canal原理
1.canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议;
2.mysql master收到dump请求,开始推送binary log给slave(也就是canal);
3.canal解析binary log对象(原始为byte流)
如下图:
参考:https://github.com/alibaba/canal/wiki/canal%E4%BB%8B%E7%BB%8D
具体:
1、mysql master节点将改变记录保存到二进制binlog文件中。
2、canal 把自己伪装成mysql slave节点,向master节点发送dump binlog请求。master节点收到请求并找到对应binlog文件及binlog位置pos。
3、master根据pos读取binlog event,不断发往slave节点(也就是canal)。
4、slave节点收到binlog events并拷贝到slave的中继日志。
5、slave结点回放中继日志中的event并同步。
6、新的binlog被master不断广播到slave节点,slave节点源源不断解析同步。
一、准备
1.MySQL 安装(指定版本)
Centos : yum install -y mysql-community-server
2.MySQL 相关命令
# 服务开启service mysql start
# 服务关闭service mysql stop
# 登录mysql -uxxx -p (xxx 为账号, yyy为密码)
3.MySQL 对应目录
数据库目录:/var/lib/mysql(我机器的目录是这个)
配置文件: /usr/share/mysql , /etc/mysql
相关命令: /usr/bin , /usr/sbin
启动脚本: etc/init.d/mysql
二、配置MySQL
1.在/var/lib/mysql/my.cnf 中添加
canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,并且配置binlog模式为row.
[mysqld]
log-bin=mysql-bin # binlog的文件名,也可以指定输出目录,默认/var/lib/mysql目录下
binlog-format=ROW # binlog格式,Mixed/Statement/Row,默认是Statement
server_id=1 # master的id,全局唯一。配置mysql replaction需要定义,不能和canal的slaveId重复
数据库重启后, 简单测试 my.cnf 配置是否生效:
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
2.在mysql中配置canal数据库管理用户,配置相应权限
canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限
#创建’canal’用户:
create user canal identified by 'canal';(网上大部分资料是这样的,但是我实践过后,启动canal失败。正确的是下面这个)
create user canal@localhost identified by 'canal'; #创建用户canal密码也是canal
(第一个’canal’是用户名,第二个’canal’是密码)
#授权部分需要的权限:
grant select, replication slave, replication client on *.* to 'canal'@'%'; (网上大部分资料是这样的,但是我实践过后,启动canal失败。正确的是下面这个)
grant select, replication slave, replication client on *.* to 'canal'@'localhost';
#刷新权限列表: