MySQL之binlog
参考连接:https://www.cnblogs.com/xhyan/p/6530861.html、https://www.cnblogs.com/martinzhang/p/3454358.html
1>> MySQL Binlog详解
Mysql的binlog日志作用是用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被binlog日志记录;主要用于数据库的主从复制以及增量恢复。
mysql的binlog日志必须打开log-bin功能才能生存binlog日志
2>> Mysqlbinlog解析工具
Mysqlbinlog功能是将Mysql的binlog日志转换成Mysql语句,默认情况下binlog日志是二进制文件,无法直接查看。
3>> MySQL binlog的三种工作模式
(1)Row level
日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改。
优点:能清楚的记录每一行数据修改的细节
缺点:数据量太大
(2)Statement level(默认)
每一条被修改数据的sql都会记录到master的bin-log中,
slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql再次执行
优点:解决了 Row level下的缺点,不需要记录每一行的数据变化,
减少bin-log日志量,节约磁盘IO,提高新能
缺点:容易出现主从复制不一致
(3)Mixed(混合模式)
结合了Row level和Statement level的优点
4>> MySQL企业binlog模式的选择
互联网公司使用MySQL的功能较少(不用存储过程、触发器、函数),选择默认的Statement level
用到MySQL的特殊功能(存储过程、触发器、函数)则选择Mixed模式
用到MySQL的特殊功能(存储过程、触发器、函数),又希望数据最大化一直则选择Row模式
为什么要引入mysql的binlog呢?
如果上面叙述的不是很清楚,请自己手动查资料,如果不是因为搞实时的项目,我也不想玩这个坑爹的玩意儿。搞了一星期,从压根不知道有这个东西到做出成品。
下面我来介绍一下解析binlog的第一个中间件,就是canal
canal是什么?
Canal:(阿里巴巴)--(服务端)+ 外置客户端
纠正一句:(以前是这样,现在已经很完善了,现在canal也支持了输出到kafka等相关消息队列里了!)
官方地址:
https://github.com/alibaba/canal/wiki/Introduction
Github地址:
https://github.com/alibaba/canal
解析canal客户端(外置客户端):
https://github.com/sasou/syncClient
名称:canal [kə'næl] 译意: 水道/管道/沟渠
语言: 纯java开发
定位: 基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql
关键词: mysql binlog parser / real-time / queue&topic
工作原理
mysql主备复制实现
从上层来看,复制分成三步:master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
slave将master的binary log events拷贝到它的中继日志(relay log);
slave重做中继日志中的事件,将改变反映它自己的数据。
canal的工作原理:
原理相对比较简单:
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
mysql master收到dump请求,开始推送binary log给slave(也就是canal)
canal解析binary log对象(原始为byte流)
还有后续的哦!
https://blog.csdn.net/MrZhangBaby/article/details/87635420
https://blog.csdn.net/MrZhangBaby/article/details/87636104