https://github.com/alibaba/canal/releases
下载 canal.deployer-1.1.5

文档 https://github.com/alibaba/canal/wiki

准备mysql

  1. cat ./my.cnf
  2. [mysql]
  3. default-character-set=utf8mb4
  4. [client]
  5. default-character-set=utf8mb4
  6. [mysqld]
  7. default-time-zone='+08:00'
  8. character-set-client-handshake = FALSE
  9. character_set_server=utf8mb4
  10. collation-server = utf8mb4_unicode_ci
  11. log-bin=/var/lib/mysql/mysql-bin
  12. binlog_format=row
  13. # 双1配置, 刷盘, 方便调试
  14. innodb_flush_log_at_trx_commit=1
  15. sync_binlog=1
  16. # ==============
  17. binlog-ignore-db=information_schema
  18. binlog-ignore-db=mysql
  19. binlog-ignore-db=performance_schema
  20. binlog-ignore-db=sys
  21. binlog-do-db=gmall-2021
  22. binlog-do-db=gmall-2022

log-bin用于指定binlog日志文件名前缀,默认存储在/var/lib/mysql 目录下。
server-id用于标识唯一的数据库,不能和别的服务器重复,建议使用ip的最后一段,默认值也不可以。
binlog-ignore-db:表示同步的时候忽略的数据库。
binlog-do-db:指定需要同步的数据库(如果没有此项,表示同步所有的库)。

注意:binlog-do-db 根据自己的情况进行修改,指定具体要同步的数据库,如果不配置 则表示所有数据库均开启 Binlog

  1. 是否启用了日志
  2. mysql>show variables like 'log_bin';
  3. 怎样知道当前的日志
  4. mysql> show master status;
  5. 查看mysql binlog模式
  6. show variables like 'binlog_format';
  7. 获取binlog文件列表
  8. show binary logs;
  9. 查看当前正在写入的binlog文件
  10. show master status\G
  11. 查看指定binlog文件的内容
  12. show binlog events in 'mysql-bin.000001';

image.png

  1. mysql-binmysql-bin.index
  2. root@box1:/mydata/mysql57/data # ll
  3. total 188M
  4. -rw-r----- 1 999 docker 56 Feb 10 14:04 auto.cnf
  5. -rw------- 1 999 docker 1.7K Feb 10 14:04 ca-key.pem
  6. -rw-r--r-- 1 999 docker 1.1K Feb 10 14:04 ca.pem
  7. -rw-r--r-- 1 999 docker 1.1K Feb 10 14:04 client-cert.pem
  8. -rw------- 1 999 docker 1.7K Feb 10 14:04 client-key.pem
  9. -rw-r----- 1 999 docker 1.4K Feb 10 14:04 ib_buffer_pool
  10. -rw-r----- 1 999 docker 76M Feb 10 14:04 ibdata1
  11. -rw-r----- 1 999 docker 48M Feb 10 14:04 ib_logfile0
  12. -rw-r----- 1 999 docker 48M Feb 10 14:04 ib_logfile1
  13. -rw-r----- 1 999 docker 12M Feb 10 14:04 ibtmp1
  14. drwxr-x--- 2 999 docker 4.0K Feb 10 14:04 mysql
  15. -rw-r----- 1 999 docker 177 Feb 10 14:04 mysql-bin.000001
  16. -rw-r----- 1 999 docker 3.0M Feb 10 14:04 mysql-bin.000002
  17. -rw-r----- 1 999 docker 154 Feb 10 14:04 mysql-bin.000003
  18. -rw-r----- 1 999 docker 96 Feb 10 14:04 mysql-bin.index
  19. drwxr-x--- 2 999 docker 4.0K Feb 10 14:04 performance_schema
  20. -rw------- 1 999 docker 1.7K Feb 10 14:04 private_key.pem
  21. -rw-r--r-- 1 999 docker 452 Feb 10 14:04 public_key.pem
  22. -rw-r--r-- 1 999 docker 1.1K Feb 10 14:04 server-cert.pem
  23. -rw------- 1 999 docker 1.7K Feb 10 14:04 server-key.pem
  24. drwxr-x--- 2 999 docker 12K Feb 10 14:04 sys

赋予权限

  1. GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
  2. CREATE USER canal IDENTIFIED BY 'canal';
  3. GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
  4. GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
  5. FLUSH PRIVILEGES;

准备mysql数据

  1. CREATE TABLE `user_info` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  4. `sex` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  7. INSERT INTO `gmall`.`user_info` (`id`, `name`, `sex`) VALUES (1, 'abc', '0');
  8. INSERT INTO `gmall`.`user_info` (`id`, `name`, `sex`) VALUES (2, 'jdxia', '1');

canal.properties配置

canal.serverMode = tcp

这个文件是 canal 的基本通用配置,canal 端口号默认就是 11111,修改 canal 的 输出 model,默认 tcp

多实例配置如果创建多个实例,通过前面 canal 架构,我们可以知道,一个 canal 服务 中可以有多个 instance,conf/下的每一个 example 即是一个实例,每个实例下面都有独立的 配置文件。默认只有一个实例 example,如果需要多个实例处理不同的 MySQL 数据的话,直 接拷贝出多个 example,并对其重新命名,命名和配置文件中指定的名称一致,然后修改 canal.properties 中的 canal.destinations=实例 1,实例 2,实例 3。

  1. #################################################
  2. ######### destinations#############
  3. #################################################
  4. # 这个可以配多个的, 监控多个
  5. canal.destinations = example

instance.properties配置

只读取一个 MySQL 数据, 所以只有一个实例, 这个实例的配置文件在 conf/example 目录下
/opt/module/canal/conf/example
当前实例的配置信息

  1. #################################################
  2. ## mysql serverId , v1.0.26+ will autoGen
  3. # 修改为和mysql不一样的
  4. canal.instance.mysql.slaveId=219
  5. # enable gtid use true/false
  6. canal.instance.gtidon=false
  7. # position info
  8. # 需要改为MySQL实例所在的的IP,若为集群以逗号分隔
  9. canal.instance.master.address=192.168.33.151:3306
  10. # table regex
  11. canal.instance.filter.regex = .*\\..*
  12. # table black regex
  13. canal.instance.filter.black.regex =

设置规则方式为:

  1. mysql 数据解析关注的表,Perl正则表达式.
  2. 多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
  3. 常见例子:
  4. 1. 所有表:.* or .*\\..*
  5. 2. canal schema下所有表:canal\\..*
  6. 3. canal下的以canal打头的表:canal\\.canal.*
  7. 4. canal schema下的一张表:canal.test1
  8. 5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)

配置连接 MySQL 的用户名和密码,默认就是我们前面授权的 canal

  1. # username/password
  2. canal.instance.dbUsername=canal
  3. canal.instance.dbPassword=canal
  4. canal.instance.connectionCharset = UTF-8
  5. # enable druid Decrypt database password
  6. canal.instance.enableDruid=false

java导包

  1. <!-- https://mvnrepository.com/artifact/com.alibaba.otter/canal.client -->
  2. <dependency>
  3. <groupId>com.alibaba.otter</groupId>
  4. <artifactId>canal.client</artifactId>
  5. <version>1.1.5</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
  8. <dependency>
  9. <groupId>org.apache.kafka</groupId>
  10. <artifactId>kafka-clients</artifactId>
  11. <version>3.1.0</version>
  12. </dependency>

启动

在这个shell文件里面, 去掉 UseCMSCompactAtFullCollection 这个java8 搞版本不支持
-Xss调大一点, 改为512k, 不然启动不了

  1. ./bin/startup.sh
  2. 停止是
  3. ./bin/stop.sh

查看日志

查看instance日志

  1. cat ./logs/example/example.log

查看server日志

  1. cat ./logs/canal/canal.log

mysql5.6注意

mysql版本为5.6时,
这个错误一般出现在master5.6,slave在低版本的情况下。这是由于5.6使用了crc32做binlog的checksum;
当一个event被写入binary log(二进制日志)的时候,checksum也同时写入binary log,然后在event通过网络传输到从服务器(slave)之后,再在从服务器中对其进行验证并写入从服务器的relay log.
由于每一步都记录了event和checksum,所以我们可以很快地找出问题所在。
在master中设置binlog_checksum =none;

  1. mysql> set global binlog_checksum='NONE';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> show variables like "%sum%";
  4. +---------------------------+-------+
  5. | Variable_name | Value |
  6. +---------------------------+-------+
  7. | binlog_checksum | NONE |
  8. | innodb_checksum_algorithm | crc32 |
  9. | innodb_checksums | ON |
  10. | innodb_log_checksums | ON |
  11. | master_verify_checksum | OFF |
  12. | slave_sql_verify_checksum | ON |
  13. +---------------------------+-------+
  14. 6 rows in set (0.01 sec)