近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台。优先级比较高的一个任务就是需要近实时同步业务系统的数据(包括保存、更新或者软删除)到一个另一个数据源,持久化之前需要清洗数据并且构建一个相对合理的便于后续业务数据统计、标签系统构建等扩展功能的数据模型。基于当前团队的资源和能力,优先调研了Alibaba
开源中间件Canal
的使用。
这篇文章简单介绍一下如何快速地搭建一套Canal
相关的组件。
关于Canal#
下面的简介和下一节的原理均来自于Canal项目的README
:
Canal[kə'næl]
,译意为水道/管道/沟渠,主要用途是基于MySQL
数据库增量日志解析,提供增量数据订阅和消费。早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务trigger
获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括:
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 业务
Cache
刷新
- 带业务逻辑的增量数据处理
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
流),并且可以通过连接器发送到对应的消息队列等中间件中
关于Canal的版本和部件#
截止笔者开始编写本文的时候(2020-03-05
),Canal
的最新发布版本是v1.1.5-alpha-1
(2019-10-09
发布的),最新的正式版是v1.1.4
(2019-09-02
发布的)。其中,v1.1.4
主要添加了鉴权、监控的功能,并且做了一些列的性能优化,此版本集成的连接器是Tcp
、Kafka
和RockerMQ
。而v1.1.5-alpha-1
版本已经新增了RabbitMQ
连接器,但是此版本的RabbitMQ
连接器暂时不能定义连接RabbitMQ
的端口号,不过此问题已经在master
分支中修复(具体可以参看源码中的CanalRabbitMQProducer
类的提交记录)。换言之,v1.1.4
版本中目前能使用的内置连接器只有Tcp
、Kafka
和RockerMQ
三种,如果想尝鲜使用RabbitMQ
连接器,可以选用下面的两种方式之一:
- 选用
v1.1.5-alpha-1
版本,但是无法修改RabbitMQ
的port
属性,默认为5672
。
- 基于
master
分支自行构建Canal
。
目前,Canal
项目的活跃度比较高,但是考虑到功能的稳定性问题,笔者建议选用稳定版本在生产环境中实施,当前可以选用v1.1.4
版本,本文的例子用选用的就是v1.1.4
版本,配合Kafka
连接器使用。Canal
主要包括三个核心部件:
canal-admin
:后台管理模块,提供面向WebUI
的Canal
管理能力。
canal-adapter
:适配器,增加客户端数据落地的适配及启动功能,包括REST
、日志适配器、关系型数据库的数据同步(表对表同步)、HBase
数据同步、ES
数据同步等等。
canal-deployer
:发布器,核心功能所在,包括binlog
解析、转换和发送报文到连接器中等等功能都由此模块提供。
一般情况下,canal-deployer
部件是必须的,其他两个部件按需选用即可。
Kafka一般操作
kafka相关
##解决offsets问题(问题现象:日志一直报offsets)
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group group2 --reset-offsets --topic new_video_test --to-latest --execute
20200727 kafka问题解决
1)删除 kafka的data下的文件
2)执行上面offsets问题的命令
3)修改配置文件
##kafka停止服务
sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-stop.sh
##kafka启动服务并监控日志
sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-start.sh /data/kafka/kafka_2.13-2.4.0/config/server.properties
##kafka后台启动
sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-start.sh -daemon /data/kafka/kafka_2.13-2.4.0/config/server.properties
./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic world_tt_video
/data/kafka_jk/kafka_2.13-2.4.0/bin/kafka-server-start.sh -daemon /data/kafka_jk/kafka_2.13-2.4.0/config/server.properties
.
配置文件(主配置文件)
servser.properties
1、查询topic,进入kafka目录:
bin/kafka-topics.sh --list --zookeeper localhost:2181
2、查询topic内容:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topicName --from-beginning
查看 kafka 消息是否发送
sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 47.102.14.62:9092 --from-beginning --topic new_video_master
./kafka-console-consumer.sh --bootstrap-server 192.168.169.18:9092 --from-beginning --topic test_world1
./kafka-console-consumer.sh --bootstrap-server 192.168.169.18:9093 --from-beginning --topic test_score
./kafka-console-consumer.sh --bootstrap-server 192.168.169.19:9092 --from-beginning --topic test-word-playlist
sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --from-beginning --topic world_tt_video
sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --from-beginning --topic video-score
/data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 172.19.167.97:9092 --from-beginning --topic tt-user-task
##重新消费
./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092:9092 --group tt_video --reset-offsets --to-offset 0 --topic world_tt_video --execute
earliest latest
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 47.102.14.62:9092 --topic new_video_master --time -2
计算消息的消息堆积情况
kafka-consumer-groups --bootstrap-server master:9092 --describe --group test_kafka_game_x_g1
##查看消费者
./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --group tt_video
./kafka-run-class.sh kafka.admin.ConsumerGroupCommand --zookeeper 127.0.0.1:2181 --group intelligence_uat
${KAFKA_HOME}/bin/kafka-consumer-groups.sh --bootstrap-server ip:9092 --list
// 查看具体组的详细描述信息
${KAFKA_HOME}/bin/kafka-consumer-groups.sh --bootstrap-server 192.168.47.133:9092 --describe --group groupname
指定自己的分组 自己消费的topic会显示kafka总共有多少数据,以及已经被消费了多少条
结果:
GROUP TOPIC PID OFFSET LOGSIZE LAG
消费者组 话题id 分区id 当前已消费的条数 总条数 未消费的条数
/kafka/consumers/instance/offsets/world_tt_video/0 56128
/brokers/topics/world_tt_video/partitions/0
##查看副本
../bin/kafka-topics.sh --zookeeper 192.168.169.18:2181 --describe --topic test_world1
##查看group详情
./kafka-consumer-groups.sh --bootstrap-server 47.102.14.62:9092 --describe --group group2
./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9092 --describe --group logstash_test1
./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9093 --describe --group logstash_test_vv
./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9093 --describe --group logstash_test_community
./kafka-consumer-groups.sh --bootstrap-server 192.168.169.19:9092 --describe --group logstash_playlist_test
./kafka-consumer-groups.sh --bootstrap-server 172.19.167.97:9092 --describe --group logstash_task
./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --describe --group tt_video logstash_task_master
./kafka-consumer-groups.sh --bootstrap-server 172.19.167.97:9092 --describe --group logstash_task
./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --describe --group logstash_video_prd
./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --group tt_video --reset-offsets --to-latest --topic world_tt_video --execute
##删除group
./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9092 --delete --group console-consumer-62327
./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9093 --delete --group console-consumer-16161
##查看topic
./kafka-topics.sh --zookeeper 192.168.169.15:2181 --list
./kafka-topics.sh --bootstrap-server 192.168.169.18:9092 --list
./kafka-topics.sh --bootstrap-server 192.168.169.18:9093 --list
./kafka-topics.sh --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --list
./kafka-topics.sh --zookeeper 172.19.167.97:2181 --list
./bin/kafka-console-consumer.sh --zookeeper 192.168.169.19:2181 --topic testTopic --consumer.config config/consumer.properties
删除topic
./bin/kafka-topics --delete --zookeeper 【zookeeper server:port】 --topic 【topic name】
./kafka-topics.sh --zookeeper 192.168.169.18:2181 --delete --topic test1
./kafka-topics.sh --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --delete --topic test1
##查看partition(副本)
./kafka-topics.sh --zookeeper 192.168.169.15:2181 --topic new_video_master --describe
./kafka-topics.sh --zookeeper 192.168.169.18:2181 --topic test_world1 --describe
./kafka-topics.sh --zookeeper 192.168.169.18:3181 --topic test_score --describe
./kafka-topics.sh --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --topic world_tt_video --describe
./kafka-topics.sh --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --topic video-score --describe
##修改partition
./kafka-topics.sh --zookeeper 192.168.169.15:2181 --topic new_video_master --alter --partitions 10
./kafka-topics.sh --zookeeper 192.168.169.18:2181 --topic test_world1 --alter --partitions 10
./kafka-topics.sh --zookeeper 192.168.169.18:2181 --topic test_score --alter --partitions 10
./kafka-topics.sh --zookeeper 192.168.169.18:2181 --topic test_video --alter --partitions 10
##新建topic
./kafka-topics.sh --create --zookeeper 192.168.169.18:2181 --replication-factor 1 --partitions 10 --topic test_score
./kafka-topics.sh --create --zookeeper 192.168.169.18:2181 --replication-factor 1 --partitions 10 --topic test_video
./kafka-topics.sh --create --zookeeper 192.168.169.18:2181 --replication-factor 1 --partitions 10 --topic test-tt-user-task
./kafka-topics.sh --create --zookeeper 192.168.169.19:2181 --replication-factor 1 --partitions 10 --topic test_topic_playlist
./kafka-topics.sh --create --zookeeper 192.168.169.19:2181 --replication-factor 1 --partitions 10 --topic master_topic_playlist
./kafka-topics.sh --create --zookeeper 192.168.169.18:3181 --replication-factor 1 --partitions 10 --topic test_video
./kafka-topics.sh --create --zookeeper 192.168.169.18:3181 --replication-factor 1 --partitions 10 --topic master_score
./kafka-topics.sh --create --zookeeper 192.168.169.18:3181 --replication-factor 1 --partitions 10 --topic test_community_own
./kafka-topics.sh --create --zookeeper 172.19.167.97:2181 --replication-factor 1 --partitions 10 --topic topic-playlist
./kafka-topics.sh --create --zookeeper 172.19.167.97:2181 --replication-factor 1 --partitions 10 --topic topic-playlist-words
./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 5 --topic topic-playlist-words6
./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic world_tt_video
./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic video-score
./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic tt-user-task
./kafka-topics.sh --create --zookeeper 172.19.167.100:2181,172.19.167.105:2181,172.19.167.106:2181 --replication-factor 3 --partitions 15 --topic task-tttt
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test1
##消费者消费数据
./kafka-console-consumer.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --from-beginning --topic world_tt_video
##查看group列表
./kafka-consumer-groups.sh --bootstrap-server 192.168.169.15:9092 --list
./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9092 --list
./kafka-consumer-groups.sh --bootstrap-server 192.168.169.18:9093 --list
./kafka-consumer-groups.sh --bootstrap-server 172.19.167.97:9092 --list
./kafka-consumer-groups.sh --bootstrap-server 172.19.167.100:9092,172.19.167.105:9092,172.19.167.106:9092 --list --new-consumer
./kafka-create-topic.sh --partition 1 --replica 1 --zookeeper localhost:2181 --topic test
latest
earliest