参考 https://github.com/alibaba/canal
简介
工作原理
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 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
详细的可以去github上查看,或者自行百度,这里就不粘了,累!
安装
参考资料 https://github.com/alibaba/canal/wiki/Docker-QuickStart
这边就直接使用本地编译的方式
git clone git@github.com:alibaba/canal.git
cd canal/docker && sh build.sh
执行完就会像我这样阿巴阿巴的一大串
OK,这样就结束了,接下来按他文档里说的docker下面有run.sh的脚本,我们运行下
sh run.sh -e canal.auto.scan=false \
-e canal.destinations=test \
-e canal.instance.master.address=172.17.0.4:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=123456 \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
docker run -d -it -h 192.168.10.21 -e canal.auto.scan=false -e canal.destinations=test -e canal.instance.master.address=172.17.0.4:3306 -e canal.instance.dbUsername=canal -e canal.instance.dbPassword=123456 -e canal.instance.connectionCharset=UTF-8 -e canal.instance.tsdb.enable=true -e canal.instance.gtidon=false --name=canal-server -p 11110:11110 -p 11111:11111 -p 11112:11112 -p 9100:9100 -m 4096m canal/canal-server
3c3287051269a5775e48bc59d8875192f889601986a006348241cb5ad1d3a78e
docker: Error response from daemon: driver failed programming external connectivity on endpoint canal-server (0c94b850d47a039a92f291ca203233564d042ac8db7f51c6bcf18ad807ccf58f): Bind for 0.0.0.0:9100 failed: port is already allocated
问题:9100端口问题,本地eshead监听9100,先停掉
数据库创建用户
#连接msql
mysql -u -p
# 进行创建用户赋权
grant all privileges on *.* to canal@'%' identified by '123456';
#刷新
FLUSH PRIVILEGES;
不清楚的可以百度下Mysql创建用户及赋权
canal-php
本次测试canal-php
来实现,地址:https://github.com/xingwenge/canal-php
。
# 克隆
git clone https://github.com/xingwenge/canal-php.git
cd canal-php
# 更新
composer update
# 呃呃呃呃 又报错了
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.
Problem 1
- clue/socket-raw[v1.4.0, ..., v1.5.0] require ext-sockets * -> it is missing from your system. Install or enable PHP's sockets extension.
- Root composer.json requires clue/socket-raw ^1.4 -> satisfiable by clue/socket-raw[v1.4.0, v1.4.1, v1.5.0].
To enable extensions, verify that they are enabled in your .ini files:
-
- /usr/local/etc/php/conf.d/docker-php-ext-gd.ini
- /usr/local/etc/php/conf.d/docker-php-ext-pcntl.ini
- /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini
- /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
# 好吧 没有sockets扩展导致 安装下
docker-php-ext-install sockets
数据库配置
更新mysql
配置,参考
https://github.com/alibaba/canal/wiki/QuickStart
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
开始测试
接下来就开始测试了,进入刚刚的canal-php
目录,运行目录下src/sample/client.php
#进入目录
cd canal-php
# 运行 client里的配置 需要根据自己之前搭建的canal-server修改
# 上面运行的时候 canal.destinations=test 所以需要修改默认的destination 修改为 $client->subscribe("1001", "test", ".*\\..*");
# 修改完成 开始启动
php src/sample/client.php
这样就启动起来了。
我们先检测测试表user
CREATE TABLE `user` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`user