- maxwell
- 安装使用
- mysql配置和授权
- 修改maxwell配置文件
- 工作原理
- 与cannal差异
- 日志格式
- cannal
- 安装使用
- 开启mysql binlog
- mysql赋予canal权限
- canal安装
- 工作原理
- MySQL主从复制
- binlog
- canal 工作原理
- 日志格式
mysql配置和授权https://maxwells-daemon.io/quickstart/
步骤可以跟随上边链接的quickstart。
首先开启msyql的binlog
然后创建一个maxwell数据库,并创建一个maxwell账户并授予权限,设置密码。
CREATE DATABASE maxwell; GRANT ALL ON maxwell.* TO 'maxwell'@'%' IDENTIFIED BY '123456'; GRANT SELECT ,REPLICATION SLAVE , REPLICATION CLIENT ON *.* TO maxwell@'%';修改maxwell配置文件
cp config.properties.example config.properties vim config.properties #mysql 配置 host= m1 user= maxwell password= 123456 client_id=maxwell_1 producer=kafka kafka.bootstrap.servers= m1:9092,m2:9092,m3:9092 kafka_topic=gmall2020_db_m bin/maxwell --config config.properties > /dev/null 2>&1 &工作原理
与cannal差异maxwell 也是读取binlog发送到kafka等
日志格式canal只能抓取新数据,对于已经存在的数据没有办法。而maxwell提供了bootstrap功能,可以直接引导出整个完整的历史数据用于初始化,很好用。maxwell更轻量级。
当binlog_format= row时,canal会将同一次sql影响的row放到同一个json中,而maxwell则是将row分开到多个json中。cannal会带入表的结构,maxwell更简洁。
INSERT INTO z_user_info VALUES(30,'zhang3','13810001010'),(31,'li4','1389999999');
{"database":"gmall-2020-0
4","table":"z_user_info","ty
pe":"insert","ts":158938531
4,"xid":82982,"xoffset":0,"d
ata":{"id":30,"user_name":"
zhang3","tel":"1381000101
0"}}
{"database":"gmall-2020-0
4","table":"z_user_info","ty
pe":"insert","ts":158938531
4,"xid":82982,"commit":tru
e,"data":{"id":31,"user_nam
e":"li4","tel":"1389999999"}
}
cannal
安装使用
开启mysql binlog
vim /etc/my.cnf 可以通过locate my.cnf查找配置文件位置 在[mysqld]添加 log-bin=mysql-bin这表示生成的binlog文件前缀是mysql-bin.XXXXX类型。 添加binlog_format=row指定binlog类别 添加binlog-do-db=gmall指定需要binlog的数据库 #重启生效 sudo systemctl restart mysqld #该目录查看binlog文件 cd /var/lib/mysqlmysql赋予canal权限
set global validate_password_length=4; set global validate_password_policy=0; #其中*.*为 数据库.表名称,'canal'@'%' 为 用户名@地址,后边的IDENTIFIED BY 'canal'是指密码为 canal。授予在什么库什么表的权限给谁(名称,地址),密码是什么。 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'canal'canal安装
#目前使用1.1.4版本 https://github.com/alibaba/canal/releases 解压到目录 #canal分为单机版和高可用版本,但是高可用配置复杂,且只是提供了高可用,同一时间只有一个canal节点工作,所以一般直接用单机模式。 #修改配置 vim canal.properties #配置kafka地址 canal.serverMode=kafka canal.msq.servers= m1:9092,m2:9092,m3:9092 canan.msq.retries=0 canal.destinations= instance1,instance2 .... #canal可以配置多个instance,每个instance写一个instance.perperties然后在canal.propeties中的canal.destinations启用即可。 vim instance.perperties canal.instance.master.address=m1:3306 #前边的步骤在mysql中创建了此账户,并给予了权限。 canal.instance.dbUsername=canal canal.instance.dbPassword=cananl canal.mq.topic=gmall2020_db_c #如果要开启多个kafka分区,要在kafka中创建对应分区数的主题。多个分区只能保证分区内的有序性。 #cananl.mq.partition=0 canal.mq.partitionNum=4 #启动canal bin/startup.sh #停止 bin/stop.sh工作原理 MySQL主从复制
binlogMaster主库改变记录,写入到二进制日志binary log中。
Slave从库向mysql master发送dump 协议,将master主库的binary log events拷贝到它的中继日志relay log
Slave从库读取并重做中继日志的事件,把数据同步到自己的数据库
canal 工作原理MySQL的二进制日志记录了所有的DDL和DML语句,以事件形式记录,是事务安全型的。其主要使用场景1是主从复制,保证数据一致性2数据恢复,借助mysqlbinlog来恢复数据。binlog共有两类文件,1是日志索引(.index),记录有哪些二进制文件2二进制日志文件,记录DDL和DML的语句事件
binlog 分为三种,STATEMENT,MIXED,ROW。可以通过binlog_format= statement|mixed|row设置。
STATEMENT:语句级,binlog 会记录每次一执行写操作的语句。相对 row 模式节省空间,但是可能产生不一致性.
ROW: 行级, binlog 会记录每次操作后每行记录的变化。占用空间,保持了数据绝对一致性,记录执行语句的行结果。
MIXED:混合,正常用STATEMENT,特殊情况用ROW,例如UUID(),AUTO_INCREMENT字段。
日志格式canal伪装成Slave,从master读取binlog,复制数据。
INSERT INTO z_user_info VALUES(16,'zhang3','13810001010'),(17,'zhang3','13810001010');
#其日志分为data,database,table,字段信息,等其他信息。
{"data":[{"id":"16","user_name":"zhang3","tel":"13810001010"},{"id":"17","user_nam
e":"zhang3","tel":"13810001010"}],"database":"gmall-2020-04","es":158919650200
0,"id":4,"isDdl":false,"mysqlType":{"id":"bigint(20)","user_name":"varchar(20)","tel":"
varchar(20)"},"old":null,"pkNames":["id"],"sql":"","sqlType":{"id":-5,"user_name":12,"t
el":12},"table":"z_user_info","ts":1589196502433,"type":"INSERT"}



