canal原理及使用
什么是canal
canal,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。这里我们可以简单地把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 流)
1、开启mysql binlog功能 开启之后对mysql的性能会有一定的影响 # 修改my.cnf vim /etc/my.cnf [mysqld] # 打开binlog log-bin=mysql-bin # 选择ROW(行)模式 binlog-format=ROW # 配置MySQL replaction需要定义,不要和canal的slaveId重复 server_id=1 # 改了配置文件之后,重启MySQL,使用命令查看是否打开binlog模式: service mysqld restart # 进入mysql命令行验证一下 show variables like 'log_bin'; 2、搭建canal # 解压到指定目录下 tar -xvf canal.deployer-1.1.4.tar.gz #修改配置文件conf/example/instance.properties # mysql地址 canal.instance.master.address=master:3306 # mysql用户名和密码 canal.instance.dbUsername=root canal.instance.dbPassword=123456 # 增加canal数据采集之后写入kafkatopic # 动态topic,每一个表自动创建一个topic canal.mq.dynamicTopic=bigdata\\..* # 修改配置文件conf/canal.properties # zookeeper的地址,如果有多台需要写多个使用逗号分隔 canal.zkServers = master:2181 # canal保存数据的位置 canal.serverMode = kafka # kafka地址列表 canal.mq.servers = master:9092 # 启动Canal 启动后会出现进程CanalLauncher # 启动canal之前需要先保证kafka处于启动状态 cd /usr/local/soft/canal/bin/ # 启动 ./startup.sh # 停止 stop.sh # 重启 restart.sh ## 测试 -- 在mysql创建表插入数据 mysql -uroot -p123456 use `bigdata`; -- 创建表 CREATE TABLE `order` ( id BIGINT UNIQUE PRIMARY KEY AUTO_INCREMENT COMMENT '主键', order_id VARCHAR(64) COMMENT '订单ID', amount DECIMAL(10, 2) COMMENT '订单金额', create_time DATETIME COMMENT '创建时间', UNIQUE uniq_order_id (`order_id`) ) COMMENT '订单表'; -- 插入数据 INSERT INTO `order`(order_id, amount) VALUES ('100', 66); UPDATE `order` SET amount = 88 WHERE order_id = '100'; DELETE FROM `order` WHERE order_id = '100'; -- 查看kafka中是否出现topic kafka-topics.sh --list --zookeeper master:2181,node1:2181,node2:2181 --会出现bigdata.order -- 消费数据 kafka-console-consumer.sh --bootstrap-server master:9092 --from-beginning --topic bigdata.order