mysql数据同步实践

数据同步是开发中常会遇到的问题,本人目前用过的实现方式有两种方式,一种是基于mq实现,一种是基于canal来实现,下面就介绍一下canal的实践过程


一、整体部署结构




1.目前canal测试已支持mysql 5.7.13/5.6.10及以下的版本,mariadb 5.5.35和10.0.7(理论上可支持以下版本), jdk建议使用1.6.25以上的版本,稳定可靠。


2.canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,配置binlog模式为row
[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
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;

针对已有的账户可通过grants查询权限:


show grants for 'canal'

二、canal HA模式配置

机器准备

a. 运行canal的机器两台(一主一从)

b. zookeeper集群(三个实例)

c. mysql(需要监听的数据库主库)

按照部署和配置,在单台机器上各自完成配置

a. 修改canal.properties,加上zookeeper配置

canal.id= #保证唯一id
canal.port= #端口
canal.zkServers= #zookeeper集群地址(需要告诉开发人员)
canal.instance.filter.query.dcl = true #过滤掉dcl语句
canal.instance.filter.query.ddl = true #过滤掉ddl语句
canal.destinations= example #canal实例名称(需要告诉开发人员)
canal.auto.scan = false #禁用自动扫描instance实例目录
canal.instance.global.spring.xml = classpath:spring/default-instance.xml #instance实例配置文件
b. 创建example目录(和canal实例名称保持一致,如果已经存在就不需要创建了),并修改instance.properties

canal.instance.mysql.slaveId = 1234 #另外一台机器改成1235,保证slaveId不重复即可
canal.instance.master.address = #mysql主的地址
canal.instance.dbUsername = canal #数据库名称
canal.instance.dbPassword = canal #数据库密码
canal.instance.defaultDatabaseName = #监控的默认数据库(开发人员提供)
canal.instance.connectionCharset = UTF-8
canal.instance.filter.regex = #需要监听的数据的表(开发人员提供),mysql 数据解析关注的表,Perl正则表达式,多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
常见例子:

所有表:.* or .*\\..*

canal schema下所有表: canal\\..*

canal下的以canal打头的表:canal\\.canal.*

canal schema下的一张表:canal.test1

多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
注意: 两台机器上的instance目录的名字需要保证完全一致,HA模式是依赖于instance name进行管理,同时必须都选择default-instance.xml配置

启动两台机器的canal

sh bin/startup.sh
启动后,你可以查看logs/example/example.log,只会看到一台机器上出现了启动成功的日志。

比如我这里启动成功的

2013-03-19 18:18:20.590 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [canal.properties]
2013-03-19 18:18:20.596 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [example/instance.properties]
2013-03-19 18:18:20.831 [main] INFO c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example
2013-03-19 18:18:20.845 [main] INFO c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start successful...
查看一下zookeeper中的节点信息,也可以知道当前工作的节点

[zk: localhost:2181(CONNECTED) 15] get /otter/canal/destinations/example/running
{"active":true,"address":"10.20.144.51:11111","cid":1}

三.canal高可用实现方式的分析

1.服务端高可用

Canal服务端目前是一主一从两个实例,基于zookeeper集群实现高可用,具体逻辑:

首先最先启动连接到zookeeper集群的canal服务端实例作为主,会在zookeeper上建立/otter/canal/destinations/canal实例名/running节点,并且保存数据{"active":true,"address":"192.168.4.181:10001","cid":1}来标识主canal的信息;

主canal服务端如果挂了,会触发此节点删除事件,从canal服务端会去抢占建立runnging节点成为主canal服务端;

2. 客户端高可用

Canal客户端目前是一主一备两个实例,基于zookeeper集群实现高可用,具体逻辑:

首先最先启动连接到zookeeper集群的canal客户端实例作为主,会在zookeeper上建立/otter/canal/destinations/canal服务端实例名/1001/running节点;

主canal客户端如果挂了,会触发此节点删除事件,从canal客户端会去抢占建立runnging节点成为主canal客户端。




转载于:https://juejin.im/post/5ab8de7c51882577b45f046c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值