canal

canal

canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
canal的数据同步不是全量的,而是增量。基于binary log增量订阅和消费,canal可以做:

  1. 数据库镜像
  2. 数据库实时备份
  3. 索引构建和实时维护
  4. 业务cache(缓存)刷新
  5. 带业务逻辑的增量数据处理

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;
posted @ 2022-04-02 15:59  赤兔胭脂小吕布  阅读(163)  评论(0)    收藏  举报