admin管理员组文章数量:1641856
Canal 采集MySQL binlog日志
1、Canal 数据同步之MySQL binlog日志
Canal是阿里巴巴开发数据实时同步框架,原理与OGG基本类似,都是捕获数据库日志数据,进行解析,将其发送到目标端(比如Kafka 消息队列)。新版Canal 1.1版本
针对MySQL数据库来说,日志数据:binlog日志,二进制日志。
binlog中存储四种类型日志数据:插入
insert
、更新update
、删除delete
和清空truncate
。
默认情况下,MySQL数据库没有开启binlog日志,向表中CUDT操作时,不会记录日志到文件中。
[root@node1 ~]# docker exec -it mysql /bin/bash
root@8b5cd2152ed9:/#
root@8b5cd2152ed9:/# more /etc/mysql/myf
## 相关配置解析:
## [mysqld]
## log-bin=mysql-bin #添加这一行就ok
## binlog-format=ROW #选择row模式
## server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
## expire_logs_days=7 # binlog文件保存7天
## max_binlog_size=500m # 每个binlog日志文件大小
root@8b5cd2152ed9:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.30-log MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
可以查看MySQL数据库binlog日志文件存储目录
root@8b5cd2152ed9: ~# cd /var/lib/mysql
root@8b5cd2152ed9:/var/lib/mysql# ls -l
total 205364
-rw-r-----. 1 mysql mysql 56 May 29 2020 autof
-rw-------. 1 mysql mysql 1676 May 29 2020 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 May 29 2020 ca.pem
drwxr-x---. 2 mysql mysql 20 Jul 4 2020 canal_tsdb
-rw-r--r--. 1 mysql mysql 1112 May 29 2020 client-cert.pem
-rw-------. 1 mysql mysql 1676 May 29 2020 client-key.pem
drwxr-x---. 2 mysql mysql 186 Jul 4 2020 crm
-rw-r-----. 1 mysql mysql 576 Mar 13 08:50 ib_buffer_pool
-rw-r-----. 1 mysql mysql 50331648 Mar 15 02:18 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Mar 15 02:18 ib_logfile1
-rw-r-----. 1 mysql mysql 79691776 Mar 15 02:18 ibdata1
-rw-r-----. 1 mysql mysql 12582912 Mar 15 02:22 ibtmp1
drwxr-x---. 2 mysql mysql 4096 May 29 2020 mysql
-rw-r-----. 1 mysql mysql 17271182 Mar 13 16:47 mysql-bin.000004
-rw-r-----. 1 mysql mysql 177 Mar 13 08:50 mysql-bin.000005
-rw-r-----. 1 mysql mysql 154 Mar 15 02:18 mysql-bin.000006
-rw-r-----. 1 mysql mysql 57 Mar 15 02:18 mysql-bin.index
drwxr-x---. 2 mysql mysql 8192 May 29 2020 performance_schema
-rw-------. 1 mysql mysql 1680 May 29 2020 private_key.pem
-rw-r--r--. 1 mysql mysql 452 May 29 2020 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 May 29 2020 server-cert.pem
-rw-------. 1 mysql mysql 1676 May 29 2020 server-key.pem
drwxr-x---. 2 mysql mysql 8192 May 29 2020 sys
drwxr-x---. 2 mysql mysql 60 May 29 2020 test
2、Canal 数据同步之工作原理
Canal
[kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
Canal起源于,阿里巴巴杭州和美国机房数据同步备份,衍生框架,目前支持功能与版本如下:
Canal框架原理,参考MySQL数据主从复制原理。
- 1)、MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过
show binlog events
进行查看);变更数据,记录日志:biglog- 2)、MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log);IO 线程,获取binlog
- 3)、MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据;SQL线程,执行语句
- 1)、canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- 2)、MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- 3)、canal 解析 binary log 对象(原始为 byte 流);
上图中功能,属于Canal新版才有的(解析binlog日志,发送到Kafka消息队列)。
3-Canal 数据同步之Canal 架构
Canal框架使用Java语言编写,启动
服务Server
,每个服务配置多个实例Instance,如下结构所示:
- 1)、Canal Server 代表一个 Canal 运行实例,对应于一个 JVM;
- 2)、Instance 对应于一个数据队列 (1个 Canal Server 对应 1…n 个 Instance)
- 监控某个数据库database binlog日志,需要将数据,发送到Kafka消息队列和Es索引index
- 发送到Kafka,称为1个实例:
instance
(binlog -> instance -> kafka)- 发送到Es,称为1个实例:
instance
(binlog -> instance -> es)- 3)、Instance下的子模块
eventParser
: 数据源接入,模拟 slave 协议和 master 进行交互,协议解析eventSink
: Parser 和 Store 链接器,进行数据过滤,加工,分发的工作eventStore
:数据存储metaManager
:增量订阅 & 消费信息管理器
总结:CanalServer来说,启动1个服务,运行多个instance实例(每个实例对应一个sink),每个实例instance包含四个部分:
eventParse、eventSink、eventStore、metaManager
。EventParser在向MySQL发送dump命令之前会先从Log Position中获取上次解析成功的位置(如果是第一次启动,则获取初始指定位置或者当前数据段binlog位点)。
- 1)、EventSink起到一个类似channel的功能,可以对数据进行过滤、分发/路由(1:n)、归并(n:1)和加
工。EventSink是连接EventParser和EventStore的桥梁- 2)、EventStore实现模式是内存模式,内存结构为环形队列,由三个指针(Put、Get和Ack)标识数据
存储和读取的位置。
4-Canal 数据同步之Docker 安装部署
Canal 1.1.x版本开始,支持Docker容器部署,所以本项目中,采用Docker容器部署CanallServer。
在node1.itcast机器上安装部署CanalServer,首先搜索获取canal镜像,然后pull拉取镜像,最后创建容器
文档:https://github/alibaba/canal/wiki/Docker-QuickStart、
Canal的好处在于对业务代码没有侵入,因为是基于监听binlog日志去进行同步数据的。实时性也能做到准实时,其实是很多企业一种比较常见的数据同步的方案。
具体安装部署,已经完成,只需要启动CanalServer容器即可,再启动Server服务,但是需要掌握如何配置,以及一些参数含义。
# 拉取镜像
docker pull canal/canal-server:v1.1.2
# 创建容器
docker run -d --name canal-server \
-e canal.instance.master.address=192.168.88.10:3306 \
-e canal.instance.dbUsername=root \
-e canal.instance.dbPassword=123456 \
-p 11111:11111 \
canal/canal-server:v1.1.2
# 进入容器
docker exec -it canal-server /bin/bash
# 切换到canal-server安装目录bin下,重启服务
[root@28888fad98c9 admin]# cd canal-server/bin/
[root@28888fad98c9 bin]# ./restart.sh
[root@28888fad98c9 bin]# jps
305 CanalLauncher
321 Jps
接下来,查看CanalServer配置:
- 1)、CanalServer配置文件:
canal-server/conf/canal.properties
- 2)、Instance实例配置文件:
canal-server/conf/example/instance.properties
启动
node2.itcast
中Kafka消息队列,准备测试,看是否将MySQL表数据实时同步到Kafka中。
5-Canal 数据同步之CRM数据同步Kafka
测试Canal功能,首先启动MySQL数据库,然后启动Kafka消息队列,最后启动CanalServer服务。
同步MySQL数据库表的数据。
- 1)、插入数据测试
-- 插入数据INSERT
INSERT INTO `crm_address` VALUES (10001, '葛秋红', null, '17*******47', '恒大影城南侧小金庄', '130903', null, '2020-02-02 18:51:39', '2020-02-02 18:51:39', null);
插入数据到MySQL数据库表,Kafka中数据:
{
"data": [
{
"id": "10001",
"name": "葛秋红",
"tel": null,
"mobile": "17*******47",
"detail_addr": "恒大影城南侧小金庄",
"area_id": "130903",
"gis_addr": null,
"cdt": "2020-02-02 18:51:39",
"udt": "2020-02-02 18:51:39",
"remark": null
}
],
"database": "crm",
"es": 1615794443000,
"id": 2,
"isDdl": false,
"mysqlType": {
"id": "bigint(20)",
"name": "varchar(50)",
"tel": "varchar(20)",
"mobile": "varchar(20)",
"detail_addr": "varchar(100)",
"area_id": "bigint(20)",
"gis_addr": "varchar(20)",
"cdt": "datetime",
"udt": "datetime",
"remark": "varchar(100)"
},
"old": null,
"sql": "",
"sqlType": {
"id": -5,
"name": 12,
"tel": 12,
"mobile": 12,
"detail_addr": 12,
"area_id": -5,
"gis_addr": 12,
"cdt": 93,
"udt": 93,
"remark": 12
},
"table": "crm_address",
"ts": 1615794443644,
"type": "INSERT"
}
- 2)、更新数据
更新MySQL数据库表的数据,查看Kafka中数据格式:
{
"data": [
{
"id": "10001",
"name": "葛红红",
"tel": null,
"mobile": "17*******47",
"detail_addr": "恒大影城南侧小金庄",
"area_id": "130903",
"gis_addr": null,
"cdt": "2020-02-02 18:51:39",
"udt": "2020-02-02 18:51:39",
"remark": null
}
],
"database": "crm",
"es": 1615794537000,
"id": 3,
"isDdl": false,
"mysqlType": {
"id": "bigint(20)",
"name": "varchar(50)",
"tel": "varchar(20)",
"mobile": "varchar(20)",
"detail_addr": "varchar(100)",
"area_id": "bigint(20)",
"gis_addr": "varchar(20)",
"cdt": "datetime",
"udt": "datetime",
"remark": "varchar(100)"
},
"old": [
{
"name": "葛秋红"
}
],
"sql": "",
"sqlType": {
"id": -5,
"name": 12,
"tel": 12,
"mobile": 12,
"detail_addr": 12,
"area_id": -5,
"gis_addr": 12,
"cdt": 93,
"udt": 93,
"remark": 12
},
"table": "crm_address",
"ts": 1615794537264,
"type": "UPDATE"
}
- 3)、删除数据测试
删除MySQL数据库表的数据,查看Kafka中数据:
{
"data": [
{
"id": "10001",
"name": "葛红红",
"tel": null,
"mobile": "17*******47",
"detail_addr": "恒大影城南侧小金庄",
"area_id": "130903",
"gis_addr": null,
"cdt": "2020-02-02 18:51:39",
"udt": "2020-02-02 18:51:39",
"remark": null
}
],
"database": "crm",
"es": 1615794586000,
"id": 4,
"isDdl": false,
"mysqlType": {
"id": "bigint(20)",
"name": "varchar(50)",
"tel": "varchar(20)",
"mobile": "varchar(20)",
"detail_addr": "varchar(100)",
"area_id": "bigint(20)",
"gis_addr": "varchar(20)",
"cdt": "datetime",
"udt": "datetime",
"remark": "varchar(100)"
},
"old": null,
"sql": "",
"sqlType": {
"id": -5,
"name": 12,
"tel": 12,
"mobile": 12,
"detail_addr": 12,
"area_id": -5,
"gis_addr": 12,
"cdt": 93,
"udt": 93,
"remark": 12
},
"table": "crm_address",
"ts": 1615794586746,
"type": "DELETE"
}
可以发现,Canal数据同步实时性很高,针对插入数据:
INSERT
、更新数据:UPDATE
和删除数据:DELETE
。
- 4)、清空表数据测试
- 执行DDL语句:
TRUNCATE TABLE crm_address ;
- 执行DDL语句:
{
"data": null,
"database": "crm",
"es": 1615794718000,
"id": 5,
"isDdl": true,
"mysqlType": null,
"old": null,
"sql": "/* ApplicationName\u003dDBeaver 6.3.4 - SQLEditor \u003cScript-4.sql\u003e */ TRUNCATE TABLE crm_address",
"sqlType": null,
"table": "crm_address",
"ts": 1615794719249,
"type": "TRUNCATE"
}
16-Canal 数据同步之集群高可用HA
Canal 1.1.4版本开始,提供集群高可用HA,运行2个CanalServer服务,一个为Active,一个为Standby,当Active宕掉以后,Standby接收工作,继续进行数据实时同步功能。
-
1)、首先,Canal集群同步数据数据流转示意图:
业务系统 -> MySQL(业务主库) -> Canal 集群 -> Kafak Topic -> 实时应用程序 :统计分析 -> Redis
Canal 集群高可用如何实现的,如下图所示,核心点2个:
- 1)、CanalServer服务启动2个:running(active)、Standby
- 2)、依赖Zookeeper监控CanalServer状态,并且存储状态
比如CanalServer中有2个Instance实例时,高可用集群如何工作:
版权声明:本文标题:Canal 采集MySQL binlog日志 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1729329843a1196249.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论