canal-client+zookeeper实现数据库同步

Canal+zookeeper+client+mysql实现数据库同步

开发环境布署:

canal服务端布署:192.168.1.150:11111,路径:/usr/local/canal

主库192.168.1.136:3306,帐号root,密码123456,被同步的数据库是canal_tdb

canal客户端布署:192.168.1.150:8802,路径:/usr/local/canal-client,日志/usr/local/canal-client/logs/stu-out.log

从库192.168.1.36:3306,帐号root,密码123456,mysql数据库安装在docker

服务器帐号密码:

192.168.1.150:22 帐号root 密码 Sm!R18rdl

192.168.1.36:22 帐号root 密码Admin123

1、安装zookeeper3.4.5(canal版本是1.3的话zookeeper必须是这个版本,其他版本可能会有问题)

http://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz

2、复制conf的zoo_example.cfg并改名为zoo.cfg,并修改配置如下,创建data和logs文件夹。

dataDir=/usr/local/zookeeper/zookeeper-3.4.5/data #安装目录/data

dataLogDir=/usr/local/zookeeper/zookeeper-3.4.5/logs #安装目录/logs

admin.serverPort=2182 ##修改启动服务的端口添加此参数,不是对client端提供服务的端口2181

3、新建myid文件,输入一个数值作为id,保存在data目录下;

4、到bin目录启动zookeeper;

./zkServer.sh start

5、安装canal1.1.3(mysql8.0及以上的需要用这个版本)

https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz

6、修改数据库 /etc/my.cfg配置,有则修改无则添加。

[mysqld]

log-bin=mysql-bin # 开启 binlog

binlog-format=ROW # 选择 ROW 模式

binlog-rows-query-log-events = 1 ##开启sq模式,binlog显示完整sql

server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

7、登录mysql输入以下命令,canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限。

CREATE USER canal IDENTIFIED BY ‘canal’; ##创建从库的帐号密码

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘canal’@’%’; ##设置从库帐号的权限

– GRANT ALL PRIVILEGES ON . TO ‘canal’@’%’ ; ##视情况给予从库帐号所有权限

FLUSH PRIVILEGES; ##刷新

8、修改 canal/conf下的canal.properties配置文件

canal.id = 11110001 #canal的id,暂无意义,不过要和slave_id 的值不一样

canal.ip =192.168.1.150 #服务IP地址,集群必填,单机可不填,不能是127.0.0.1和localhost

canal.port = 11111 #端口

canal.metrics.pull.port = 11112 #默认就好,多个服务端视情况设置

canal.zkServers =127.0.0.1:2181 #zookeeper的地址和端口,可配置集群,用逗号隔开

#canal.instance.global.spring.xml = classpath:spring/file-instance.xml #默认单机

canal.instance.global.spring.xml = classpath:spring/default-instance.xml #集群选项(与上二选 一)

9、修改conf下的example/instance.properties

canal.instance.master.address=192.168.1.150:3310  #主库的IP和端口
......
# username/password	从库权限的帐号密码与编码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# table regex	白名单过滤
#多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\) 
#常见例子:
#1.  所有表:.*   or  .*\\..*
#2.  canal schema下所有表: canal\\..*
#3.  canal下的以canal打头的表:canal\\.canal.*
#4.  canal schema下的一张表:canal.test1
#5.  多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
#注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)
canal.instance.filter.regex=message\\..*
# table black regex 黑名单过滤,规则与白名单一致,这里最好过滤mysql表的数据,如下
canal.instance.filter.black.regex=mysql\\..*

# mq config mq的配置
canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=example:.*\\..*
canal.mq.partition=0
# hash partition config

10、回到bin目录下启动canal;

注意事项:

在canal.properties配置文件里canal.destinations的值是对应的一个数据库连接的Instance,必须要在canal的conf目录下创建一个名字一样的文件夹,并在文件夹里复制一个instance.properties文件。

#################################################

######### destinations #############

#################################################

canal.destinations = example,example1 ##添加实例名,逗号隔开

# conf root dir

canal.conf.dir = …/conf

# auto scan instance dir add/remove and start/stop instance

canal.auto.scan = true

canal.auto.scan.interval = 5

11、修改canal客户端的application.yml配置文件:

server:

  #客户端端口

  port: 8081

#JDBC配置

spring:

  datasource:

#JDBC驱动

	driver-class-name: com.mysql.cj.jdbc.Driver  

#要同步到的数据库地址

	url: jdbc:mysql://127.0.0.1:3306/trade?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&generateSimpleParameterMetadata=true&useSSL=false&&serverTimezone=UTC     
	username: root      #帐号

    password: 116334         #密码

#cannal配置

cannal1: 

  client:

    #单机配置 格式IP:PORT

    address: 

    #环境共用参数,instance实例名称

    destination: example 

    username:

    password:

    #集群配置,zookeeper的Ip与端口,格式IP:PORT,中间逗号隔开

    zkservers: 192.168.1.150:2181

# 同canal filter,用于过滤database或者table的相关数据不进行同步,用逗号隔开

    filter: 

12、启动客户端canal-client

​ 修改客户端rabbitmq的配置并启动,详细配置说明见项目目录下配置文件。

13、观察日志文件是否获取到sql,如果获取到sql说明启动成功,如果未获取到,可能是以下原因:

1、 Canal未注册到zookeeper。回到zookeeper的bin目录,输入zkServer.sh –server 127.0.0.1:2181进入zookeeper,然后再输入

get /otter/canal/destinations/example/running查看canal节点信息,要注意确认address必须要与本地地址一致。如果不一致,执行“rm /节点名”命令删除节点,然后查看canal安装目录下的canal.properties配置文件确认IP地址。

2、 Canal连接不上数据库。再次查看配置文件,确认无误后,在对应的Instance实例目录下,如example,删除meta.dat文件,重启canal。

你可能感兴趣的:(canal-client+zookeeper实现数据库同步)