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 流)
mysql的binlog
什么binlog
MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
一般来说开启二进制日志大概会有1%的性能损耗。二进制有两个最重要的使用场景:
- MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
- 自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。
二进制日志包括/两类文件:A: 二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制的文件,B:二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
开启binlog
默认情况下, mysql是没有开启binlog的, 需要手动开启.
开启步骤:
- 找到mysql的配置文件:
my.cnf.
大部分的mysql版本默认在:/etc/my.cnf
.如果没有找到, 则可以通过下面的命令查找:
sudo find / -name my.cnf
- 修改my.cnf. 在my.cnf文件中增加如下内容:
server-id= 1
log-bin=mysql-bin
binlog_format=row
binlog-do-db=gmall
配置说明
server-id:
mysql主从复制的时候, 主从之间每个实例必须有独一无二的id
log-bin:
这个表示binlog日志的前缀是mysql-bin ,以后生成的日志文件就是 mysql-bin.123456 的文件后面的数字按顺序生成。 每次mysql重启或者到达单个文件大小的阈值时,新生一个文件,按顺序编号。
Binlog_format:
mysql binlog的格式,有三种值,分别是statement, row, mixed
三者区别:
statement:
语句级,binlog会记录每次一执行写操作的语句。
相对row模式节省空间,但是可能产生不一致性,比如
update tt set create_date=now()
如果用binlog日志进行恢复,由于执行时间不同可能产生的数据就不同。
优点: 节省空间
缺点: 有可能造成数据不一致。
row:
行级, binlog会记录每次操作后每行记录的变化。
优点:保持数据的绝对一致性。因为不管sql是什么,引用了什么函数,
他只记录执行后的效果。
缺点:占用较大空间
mixed:
statement的升级版,一定程度上解决了,因为一些情况而造成的statement
模式不一致问题
在某些情况下譬如:
当函数中包含 UUID() 时, 包含 AUTO_INCREMENT 字段的表被
更新时;执行 INSERT DELAYED 语句时;用 UDF 时;会按照
ROW的方式进行处理
优点:节省空间,同时兼顾了一定的一致性。
缺点:还有些极个别情况依旧会造成不一致,另外statement和mixed对于需要对binlog的监控的情况都不方便。
由于canal不是数据库, 是不能执行sql语句的, 所以, 只能设置为row格式
binlog-do-db:
设置把哪个database的变化写入到binlog, 如果不配置, 则所有database的变化都会写入到binlog.
如果要设置多个数据库需要, 需要写多次这个参数的配置
binlog-do-db = a
binlog-do-db = b
检测配置是否成功
A: 重启mysql服务器.
sudo systemctl restart mysqld
B: 启动msyql客户端, 执行sql语句:
show variables like'%log_bin%'
C: 也可以去对应的目录下查看是否生成log_bin文件