一、准备
-
针对阿里云RDS for MySQL , 默认打开了 binlog , 并且reader账号默认具有 binlog dump 权限 , 不需要任何权限或者 binlog 设置,可以直接使用
-
确保创建reader用户并授权以下相关权限
CREATE USER canal IDENTIFIED BY '密码'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
-
获取阿里云rds的accesskey和access secret
- 登录主账号
- 进入AccessKey管理
- 选择RAM子账号访问控制
- 创建canal子账户
- 对canal子账户设置权限,加入
AliyunRDSReadOnlyAccess
权限和AliyunOSSReadOnlyAccess
权限
-
确保安装了jdk
# yum install java-11-openjdk
-
安装zookeeper
- 到Release页面下载stable版本
- 解压压缩文件
- 重命名conf文件,将
conf/zoo_sample.cfg
重命名为conf/zoo.cfg
- 创建一个zookeeper数据目录,例如:
/var/lib/zookeeper
- 将配置文件
conf/zoo.cfg
中的配置修改为如下:dataDir=/var/lib/zookeeper
- 启动zookeeper
# sh bin/zkServer.sh start
二、启动canal server
-
访问release页面,下载最新的canal.deployer的release包
-
配置
conf/example/instance.properties
文件# position info canal.instance.master.address=阿里云rds服务器的内网地址:3306 ... # rds oss binlog canal.instance.rds.accesskey=RAM子账号的access key canal.instance.rds.secretkey=RAM子账号的secret key canal.instance.rds.instanceId=阿里云RDS的instance id # table meta tsdb info canal.instance.tsdb.dbUsername=reader canal.instance.tsdb.dbPassword=reader账号的密码 # username/password canal.instance.dbUsername=reader canal.instance.dbPassword=reader账号的密码 # table regex canal.instance.filter.regex=.\.. # table black regex canal.instance.filter.black.regex=
-
配置
conf/canal.properties
- 在Mysql中获取客户端使用的密码
SELECT PASSWORD('密码');
# canal instance user/passwd canal.user = canal canal.passwd = 使用mysql中的password函数生成的密码
- 在Mysql中获取客户端使用的密码
三、FAQ
1. 为什么canal启动了后获取不到binlog日志?
- 首先检查logs/canal/canal.log中日志是否正常
- 然后检查logs/example/example.log中日志是否正常
e,g: 例如在logs/example/example.log
中有如下日志,提示binglog时间解析出错
[destination = example , address = rm*.aliyuncs.com/*.*.*.*:3306 , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:example[com.alibaba.otter.canal.parse.exception.CanalParseException: java.io.IOException: ErrorPacket [errorNumber=1146, fieldCount=-1, message=Table '*.* TABLE' doesn't exist, sqlState=42S02, sqlStateMarker=#]
with command: show create table `*`.`*`;show create table `*`.`* TABLE`;show create table `*`.`*`;show create table `*`.`* TABLE`;
Caused by: java.io.IOException: ErrorPacket [errorNumber=1146, fieldCount=-1, message=Table 'hdmall_asynctask.BASE TABLE' doesn't exist, sqlState=42S02, sqlStateMarker=#]
with command: show create table `*`.`*`;show create table `*`.`* TABLE`;show create table `*`.`*`;show create table `*`.`* TABLE`;
at com.alibaba.otter.canal.parse.driver.mysql.MysqlQueryExecutor.queryMulti(MysqlQueryExecutor.java:109)
at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.queryMulti(MysqlConnection.java:111)
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.dumpTableMeta(DatabaseTableMeta.java:233)
at com.alibaba.otter.canal.parse.inbound.mysql.tsdb.DatabaseTableMeta.rollback(DatabaseTableMeta.java:174)
at com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.processTableMeta(AbstractMysqlEventParser.java:142)
at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$1.run(AbstractEventParser.java:197)
at java.base/java.lang.Thread.run(Thread.java:829)
]
解决方案:
- 停止canal server服务sh bin/stop.sh
- 删除掉conf/example/meta.dat
文件
- 重新启动canal server服务sh bin/start.sh
2. 为什么注册的ip是不正确的ip?
需要修改register_ip为正确的值