- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解监听MySQL的binlog日志工具分析:Canal由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Canal是阿里巴巴旗下的一款开源项目,利用Java开发。主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费,目前主要支持MySQL.
GitHub地址:https://github.com/alibaba/canal 。
在介绍Canal内部原理之前,首先来了解一下MySQL Master/Slave同步原理:
MySQL master启动binlog机制,将数据变更写入二进制日志(binary log, 其中记录叫做二进制日志事件binary log events,可以通过show binlog events进行查看)MySQL slave(I/O thread)将master的binary log events拷贝到它的中继日志(relay log)MySQL slave(SQL thread)重放relay log中事件,将数据变更反映它自己的数据中 。
Canal工作原理:
Canal模拟MySQL slave的交互协议,伪装自己为MySQL slave,向MySQL master发送dump协议MySQL master收到dump请求,开始推送binary log给slave(也就是canal)Canal解析binary log对象(原始为byte流) 。
简而言之,Canal是通过模拟成为MySQL的slave,监听MySQL的binlog日志来获取数据。当把MySQL的binlog设置为row模式以后,可以获取到执行的每一个Insert/Update/Delete的脚本,以及修改前和修改后的数据,基于这个特性,Canal就能高效的获取到MySQL数据的变更。 Canal架构:
说明: server代表一个Canal运行实例,对应于一个jvm instance对应于一个数据队列(1个server对应1..n个instance) 。
EventParser:数据源接入,模拟slave协议和master进行交互,协议解析 。
EventSink:Parser和Store连接器,主要进行数据过滤,加工,分发的工作 。
EventStore:负责存储 。
MemoryMetaManager:增量订阅和消费信息管理器 。
Event Parser设计:
整个parser过程大致可分为以下几步:
Connection获取上一次解析成功的log position(如果是第一次启动,则获取初始指定的位置或者是当前数据库的binlog log position)Connection建立连接,向MySQL master发送BINLOG_DUMP请求MySQL开始推送binary Log接收到的binary Log通过BinlogParser进行协议解析,补充一些特定信息。如补充字段名字、字段类型、主键信息、unsigned类型处理等将解析后的数据传入到EventSink组件进行数据存储(这是一个阻塞操作,直到存储成功)定时记录binary Log位置,以便重启后继续进行增量订阅 。
如果需要同步的master宕机,可以从它的其他slave节点继续同步binlog日志,避免单点故障。 Event Sink设计:
EventSink主要作用如下:
数据过滤:支持通配符的过滤模式,表名,字段内容等 。
数据路由/分发:解决1:n(1个parser对应多个store的模式) 。
数据归并:解决n:1(多个parser对应1个store) 。
数据加工:在进入store之前进行额外的处理,比如join 数据1:n业务 。
为了合理的利用数据库资源, 一般常见的业务都是按照schema进行隔离,然后在MySQL上层或者dao这一层面上,进行一个数据源路由,屏蔽数据库物理位置对开发的影响,阿里系主要是通过cobar/tddl来解决数据源路由问题。所以,一般一个数据库实例上,会部署多个schema,每个schema会有由1个或者多个业务方关注.
数据n:1业务 。
同样,当一个业务的数据规模达到一定的量级后,必然会涉及到水平拆分和垂直拆分的问题,针对这些拆分的数据需要处理时,就需要链接多个store进行处理,消费的位点就会变成多份,而且数据消费的进度无法得到尽可能有序的保证。所以,在一定业务场景下,需要将拆分后的增量数据进行归并处理,比如按照时间戳/全局id进行排序归并。 Event Store设计:
支持多种存储模式,比如Memory内存模式。采用内存环装的设计来保存消息,借鉴了Disruptor的RingBuffer的实现思路。 RingBuffer设计:
定义了3个cursor:
put:Sink模块进行数据存储的最后一次写入位置(同步写入数据的cursor) 。
get:数据订阅获取的最后一次提取位置(同步获取的数据的cursor) 。
ack:数据消费成功的最后一次消费位置 。
借鉴Disruptor的RingBuffer的实现,将RingBuffer拉直来看:
实现说明:
put/get/ack cursor用于递增,采用long型存储。三者之间的关系为put>=get>=ackbuffer的get操作,通过取余或者&操作。(&操作:cusor & (size - 1) , size需要为2的指数,效率比较高) 。
Instance设计:
instance代表了一个实际运行的数据队列,包括了EventPaser、EventSink、EventStore等组件。抽象了CanalInstanceGenerator,主要是考虑配置的管理方式:
manager方式:和你自己的内部web console/manager系统进行对接。(目前主要是公司内部使用) 。
spring方式:基于spring xml + properties进行定义,构建spring配置。 Server设计:
server代表了一个Canal运行实例,为了方便组件化使用,特意抽象了Embeded(嵌入式)/Netty(网络访问)的两种实现.
增量订阅/消费设计:
具体的协议格式,可参见:CanalProtocol.proto。数据对象格式:EntryProtocol.proto 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
Entry
Header
logfileName [binlog文件名]
logfileOffset [binlog position]
executeTime [binlog里记录变更发生的时间戳]
schemaName [数据库实例]
tableName [表名]
eventType [
insert
/
update
/
delete
类型]
entryType [事务头
BEGIN
/事务尾
END
/数据ROWDATA]
storeValue [byte数据,可展开,对应的类型为RowChange]
RowChange
isDdl [是否是ddl变更操作,比如
create
table
/
drop
table
]
sql [具体的ddl sql]
rowDatas [具体
insert
/
update
/
delete
的变更数据,可为多条,1个binlog event事件可对应多条变更,比如批处理]
beforeColumns [
Column
类型的数组]
afterColumns [
Column
类型的数组]
Column
index
[
column
序号]
sqlType [jdbc type]
name
[
column
name
]
isKey [是否为主键]
updated [是否发生过变更]
isNull
[值是否为
null
]
value [具体的内容,注意为文本]
|
针对上述的补充说明:
1.可以提供数据库变更前和变更后的字段内容,针对binlog中没有的name、isKey等信息进行补全 。
2.可以提供ddl的变更语句 。
Canal HA机制:
Canal的HA实现机制是依赖zookeeper实现的,主要分为Canal server和Canal client的HA。 Canal server:为了减少对MySQL dump的请求,不同server上的instance要求同一时间只能有一个处于running状态,其他的处于standby状态.
Canal client:为了保证有序性,一份instance同一时间只能由一个Canal client进行get/ack/rollback操作,否则客户端接收无法保证有序。 Canal Server HA架构图:
大致步骤:
Canal Client的方式和Canal server方式类似,也是利用Zookeeper的抢占EPHEMERAL节点的方式进行控制.
到此这篇关于详解监听MySQL的binlog日志工具分析:Canal的文章就介绍到这了,更多相关MySQL的binlog日志内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/bigdatalearnshare/p/13832709.html 。
最后此篇关于详解监听MySQL的binlog日志工具分析:Canal的文章就讲到这里了,如果你想了解更多关于详解监听MySQL的binlog日志工具分析:Canal的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
1、binlog简介 binlog即binary log,二进制日志文件。它记录了数据库所有执行的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制
如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一个指定的时间点的数据。“mysqlbinlog:用于处理二
我想编写一个服务来跟踪 mysql bin 日志以获取有关数据库更改的通知。 有没有开源的库可以读取和解析ROW格式的mysql bin log? 最佳答案 使用mysqlbinlog。 The se
canal 定位:基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql。 原理: canal模拟mysql slave的交互协议,伪装自己为mysql sla
以前备份binlog时,都是先在本地进行备份压缩,然后发送到远程服务器中。但是这其中还是有一定风险的,因为日志的备份都是周期性的,如果在某个周期中,服务器宕机了,硬盘损坏了,就可能导致这段时间的bi
mysql binlog3种格式,row,mixed,statement. 解析工作 mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.00
要禁用给定表的 bin 日志记录,我知道我可以使用以下命令: replicate-ignore-table=db_name.tbl_name 但是我不确定需要在哪里执行它? 谢谢 最佳答案 您必须将其
我正在设置复制,但我面临的问题是,当我执行插入更新的任何查询甚至创建表时,二进制日志文件没有被更新。这里是我的主人 my.cnf server-id = 1 log_bin
如果我正在读取 MySql binlog,我可以获得同一事务中发生哪些语句的指示吗? 最佳答案 有nothing built-in yet ,但也许this page会提供一些帮助。他们提供了一个 a
我不同意这个问题得到了有效的回答:decode mysqlbinlog in C# . 我有,我认为是同一个问题:我想从 C# 应用程序中读取 MySql 二进制日志,但不知道文件的格式。如何正确解析
我有许多运行 5.1.63 版的 mysql 服务器,本周早些时候在对从属服务器运行一些查询时,我注意到从属服务器上的一些数据本应使用主服务器上的更新语句删除。 我最初的想法是: 团队中的某个人正在更
在mysql中,我通过做来调试记录是如何改变的 mysqlbinlog bin-88.log | grep "record-id"--before=2 --after=2 我如何用 mongo 做类似
例如,在创建新表或更新现有表上的数据时,这些事件将存储在mysql binlog中,也就是MySQL数据库的二进制日志。 二进制日志在MySQL复制中非常有用,主服务器将数据从二进制日志发送到远
我读到过,MariaDB 的 Maxscale(BinLog Server) 可用于将 bin 日志从 MySQL 集群中继到单个 BinLog Server,但是我想知道是否可以从不同的 MySQL
抱歉,这个问题可能非常基本,但我找不到任何东西来解决这个问题。 我有一个 aws rds,当我尝试获取我的 binlog 列表时,它只向我显示 2 个最新的列表。 SHOW BINARY LOGS;
我正在尝试查看 MySQL binlog 文件以追踪特定查询的来源。我使用 SHOW BINARY LOGS 查询来获取现有日志文件的名称,但是当尝试使用 mysqlbinlog 命令访问时,我不断收
我们希望打开查询日志记录,以便我们可以找到更改数据的查询。 是否可以将事务日志写入数据库?binlog和普通查询日志有什么区别? 最佳答案 如果启用,二进制日志将包含所有修改数据的查询。但您应该注意格
我有几个实时数据库需要迁移到新服务器。这些是经常使用的大型数据库。 我想在新服务器上使用从服务器设置复制并开始跨服务器移植数据。但是,我想尝试避免对当前主数据执行 mysqldump 以获得初始 bi
我在一对服务器上设置了复制。一个是主人,第二个是奴隶。 最近在 master 上,binlog 文件被过早清除(通过文件名,所以 mysql 没有阻止过早删除文件)。 现在 SLAVE 有状态: Go
如果全过程使用的是Mysql用户,应该可以正常启动。 如果用的ROOT用户,可能不能正常启动,原因是新建的目录权限不对。 可能会这样的错误提示: /usr/loc
我是一名优秀的程序员,十分优秀!