canal
canal
canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
canal的数据同步不是全量的,而是增量。基于binary log增量订阅和消费,canal可以做:
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护
- 业务cache(缓存)刷新
- 带业务逻辑的增量数据处理

canal 的搭建
1、开启 MySQL binlog
默认没有开启,开启之后mysql的性能会下降
修改my.cnf
my.cnf 这个文件可能会没有,没有的时候可以通过下面的代码复制一个
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
my-medium.cnf 和 my.cnf 实际上是一个东西,如果两个文件都没有,那就在 /etc/ 下面自己创建一个 my.cnf
vim /etc/my.cnf
在[mysqld]下增加几行配置,如下
[mysqld]
# 打开binlog
log-bin=mysql-bin
# 选择ROW(行)模式
binlog-format=ROW
# 配置MySQL replaction需要定义,不要和canal的slaveId重复
server_id=1
改完之后,需要看一下后面有没有和这三个新添加的配置重复的,重复的需要删除
改了配置文件之后,重启MySQL,使用命令查看是否打开binlog模式:
service mysqld restart
show variables like 'log_bin';
2、上传解压
cd /usr/local/module
mkdir /usr/local/soft/canal
tar -zxvf /usr/local/module/canal.deployer-1.1.4.tar.gz -C /usr/local/soft/canal
3、修改配置文件
vim /usr/local/soft/canal/conf/example/instance.properties
#修改以下几个地方
# mysql 地址
canal.instance.master.address=master:3306
# mysql用户名
canal.instance.dbUsername=root
# mysql密码
canal.instance.dbPassword=123456
# 数据写入 kafka 的topic
canal.mq.topic=example #在这下面插入一条动态topic
# 监控bigdata数据库,不同的表发送到对应表名的topic上, bigdata -- mysql的库名
# bigdata -- MySQL数据库名
# ..* -- 为每一个表都动态的创建一个对应名称的topic
canal.mq.dynamicTopic=bigdata\\..*
-------------------------------------------------------------------------------
vim /usr/local/soft/canal/conf/canal.properties
#修改以下几个地方
# zk地址
canal.zkServers = master:2181,node1:2181,node2:2181
# 数据保存到kafka
canal.serverMode = kafka
# kafka集群地址
canal.mq.servers = master:9092,node1:9092,node2:9092
4、canal 基本命令
# 需要先启动Kafka
cd /usr/local/soft/canal/bin
./startup.sh -- 启动
./restart.sh -- 重启
./stop.sh -- 停止
启动之后,只要数据库中有更新,他就会自动的采集
5、测试使用
在 MySQL test 数据库创建一个订单表,并且执行几个简单的DML:
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 ('10087', 999);
UPDATE `order` SET amount = 99 WHERE order_id = '10087';
DELETE FROM `order` WHERE order_id = '10087';
可以利用Kafka的kafka-console-consumer或者Kafka Tools查看test这个topic的数据:
kafka-topics.sh --list --zookeeper master:2181,node1:2181,node2:2181
kafka-console-consumer.sh --bootstrap-server master:9092,node1:9092,node2:9092 --from-beginning --topic bigdata.order
使用flink sql读取canal-json格式的数据,构建动态表
# 1、启动flink集群
yarn-session.sh -jm 1024m -tm 1096m
@ 进入flink-sql的命令行
sql-client.sh embedded
# 动态表的表结构和数据库中表的结构保持一致
# 基于canal-json创建的动态表是一个不断更新的表,不是一个append表
CREATE TABLE canal_student (
id STRING,
name STRING,
age BIGINT,
gender STRING,
clazz STRING
) WITH (
'connector' = 'kafka',
'topic' = 'bigdata.student2',
'properties.bootstrap.servers' = 'master:9092,node1:9092,node2:9092',
'properties.group.id' = 'testGroup',
'format' = 'canal-json',
'scan.startup.mode' = 'earliest-offset',
'canal-json.ignore-parse-errors' = 'true' # 解析异常的数据自动跳过
);
select clazz,count(1) from canal_student group by clazz;

浙公网安备 33010602011771号