背景介绍
跨机房数据库数据备份
数据库增量异构系统分发(cache,mq等)
数据内容聚合分析组件
摘录作者的描述
原理图
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
canal 解析 binary log 对象(原始为 byte 流)
环境说明
服务
ip
版本
端口
备注
mysql
10.159.37.179
5.6.1
3306
数据库主库
canal-server
10.199.96.148
1.1.3
11111
canal服务端binlog程序
zookeeper
10.199.96.148
3.4.14
2181
HA服务
zookeeperUI
10.199.96.148
1.0.0
2181
HA服务前端展示
canal-admin
10.199.96.148
1.1.4
8090
canal管理控制系统
file-beats
10.199.96.148
1.1.4
8090
canal日志文件读取服务
logbash
10.199.96.148
1.1.4
8090
canal日志搜集传输服务
elasticsearch
10.199.96.148
1.1.4
8090
搜索引擎
kabana
10.199.96.148
1.1.4
8090
搜索引擎前端展示
整体架构
canal-server集群部署,使用zookeeper作为ha组件,有server当机时客户端自动根据心跳切换到可用server上。
canal-server充当数据库slave角色,把binlog日志转换为结构化数据,canal-client连接server接收数据库变化日志,自行处理,本案例打印固定格式的日志:
2019-09-05 01:19:26.294|[INFO] [pool-6-thread-1] DBSQL_LOGGER [SimpleCanalClient.java : 68]|INSERT INTO intelligent-family.biz_device_message (id,user_id,biz_devices_id,tel,mac,message_name,message_type,message_val,message_aos,message_content,message_content_url,create_time) VALUES ('2961971',null,null,'13818424752','38D269B0677DFC9E2900','被拆报警,请您尽快处理!','infTamperAlarm','infTamperAlarm','0','您家于2019-09-05 01:19:25被拆报警,请您尽快处理!',null,'2019-09-05 01:19:25')
filebeats/logstash收集canal-client数据库变更日志,统一发送到搜索引擎elasticsearch中构建索引。
kabana通过http请求查询搜索引擎中日志索引展示数据库变更日志。
部署及配置
mysql
当前的canal开源版本支持5.7及以下的版本(阿里内部mysql 5.7.13, 5.6.10, mysql 5.5.18和5.1.40/48),ps. mysql4.x版本没有经过严格测试,理论上是可以兼容
canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,并且配置binlog模式为row.
[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
重启
service mysqld restart
数据库重启后, 简单测试 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 |
+---------------+-------+
canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
#针对已有的账户可通过grants查询权限
show grants for 'canal'
canal-server
安装
配置
启动/停止
zookeeper & zkui
默认账号:admin/manager
canal-admin
默认账号:admin/123456
canal-client
依赖
代码
运行
A&Q&总结
参考