Skip to content

HA配置

yangyp8110 edited this page Jan 17, 2018 · 1 revision

注意: 两台机器上的instance目录的名字需要保证完全一致,HA模式是依赖于instance name进行管理,同时必须都选择default-instance.xml配置

环境准备

机器准备

  • mysql master :192.168.74.129 端口 3306
  • 两个canal :192.168.74.129、 192.168.74.131
  • zookeeper :192.168.74.129:2181

HA模式配置

分别配置canal文件夹conf下的canal.properties和instance文件夹下的instance.properties保持两个canal的instance name相同

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

canal.zkServers=192.168.74.129:2181
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

b. 创建example目录(如果不存在example文件夹),并修改instance.properties

canal.instance.mysql.slaveId = 1234 ##另外一台机器改成1235,保证slaveId不重复即可
canal.instance.master.address = 192.168.74.129:3306 ## mysql

canal配置参考如下:

启动服务器

  • 启动mysql
  • 启动zookeeper集群
  • 启动两台canal

启动 192.168.74.129

[root@localhost canal]# sh bin/startup.sh

启动 192.168.74.131

[root@localhost canal]# sh bin/startup.sh

查看启动日志发现只会有一台canal启动(192.168.74.129启动日志)

[root@yyp canal]# tail -1000f logs/example/example.log
2017-07-15 23:06:14.842 [main] INFO  c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [canal.pro
perties]2017-07-15 23:06:14.849 [main] INFO  c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [example/i
nstance.properties]2017-07-15 23:06:14.984 [main] WARN  org.springframework.beans.TypeConverterDelegate - PropertyEditor [com.sun.beans.editors.EnumEditor] found through de
precated global PropertyEditorManager fallback - consider using a more isolated form of registration, e.g. on the BeanWrapper/BeanFactory!2017-07-15 23:06:15.237 [main] INFO  c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example 
2017-07-15 23:06:15.277 [main] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - start successful....
2017-07-15 23:06:15.426 [destination = example , address = /192.168.74.129:3306 , EventParser] WARN  c.a.otter.canal.parse.inbound.mysql.MysqlEventParser
 - prepare to find start position just show master status
  • zookeeper查看当前运行的节点信息

登陆zookeeper(192.168.74.129:2181),切到bin目录,执行zkCli.cmd 或zkCli.sh 命令

再执行命令查看节点状态

[zk: localhost:2181(CONNECTED) 2] get /otter/canal/destinations/example/running
{"active":true,"address":"192.168.74.129:11111","cid":1}
cZxid = 0x20000003a
ctime = Sat Jul 15 23:21:36 EDT 2017
mZxid = 0x20000003a
mtime = Sat Jul 15 23:21:36 EDT 2017
pZxid = 0x20000003a
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x15d495b78580003
dataLength = 56
numChildren = 0
[zk: localhost:2181(CONNECTED) 3] 

客户端连接,消费数据

a. 可以直接指定zookeeper地址和instance name,canal client会自动从zookeeper中的running节点,获取当前服务的工作节点,然后与其建立链接:(此处使用集群client测试:com.alibaba.otter.canal.example.ClusterCanalClientTest)

        String destination = "example";

        // 基于固定canal server的地址,建立链接,其中一台server发生crash,可以支持failover
        // CanalConnector connector = CanalConnectors.newClusterConnector(
        // Arrays.asList(new InetSocketAddress(
        // AddressUtils.getHostIp(),
        // 11111)),
        // "stability_test", "", "");

        // 基于zookeeper动态获取canal server的地址,建立链接,其中一台server发生crash,可以支持failover
        CanalConnector connector = CanalConnectors.newClusterConnector("192.168.74.129:2181", destination, "", "");

b. 链接成功后,canal server会记录当前正在工作的canal client信息,比如客户端ip,链接的端口信息等

[zk: localhost:2181(CONNECTED) 2] get /otter/canal/destinations/example/1001/running
{"active":true,"address":"192.168.74.1:32846","clientId":1001}

c. 登陆mysql mater,插入一条数据

mysql> insert into person values(5,'use zookeeper HA');
Query OK, 1 row affected (0.60 sec)

mysql> 

d. 数据消费成功后,canal server会在zookeeper中记录下当前最后一次消费成功的binlog位点. (下次你重启client时,会从这最后一个位点继续进行消费)

[zk: localhost:2181(CONNECTED) 3] get /otter/canal/destinations/example/1001/cursor 
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"192.168.74.129","port":3306}},"post
ion":{"included":false,"journalName":"mysql-binlog.000002","position":3985,"serverId":1,"timestamp":1500176724000}}

e. 查看mysql slave同步成功,并且idel同时输出信息:

****************************************************
* Batch Id: [1] ,count : [3] , memsize : [164] , Time : 2017-07-16 11:39:24
* Start : [mysql-binlog.000002:3797:1500176724000(2017-07-16 11:45:24)] 
* End : [mysql-binlog.000002:3985:1500176724000(2017-07-16 11:45:24)] 
****************************************************

================> binlog[mysql-binlog.000002:3797] , executeTime : 1500176724000 , delay : -359418ms
 BEGIN ----> Thread id: 51
----------------> binlog[mysql-binlog.000002:3927] , name[test_db,person] , eventType : INSERT , executeTime : 1500176724000 , delay : -359397ms
pId : 5    type=int(11)    update=true
pName : use zookeeper HA    type=varchar(100)    update=true
----------------
 END ----> transaction id: 389
================> binlog[mysql-binlog.000002:3985] , executeTime : 1500176724000 , delay : -359293ms

canal HA验证

停止 192.168.74.129 canal

[root@yyp canal]# sh bin/stop.sh 

192.168.74.129 canal日志停止成功

2017-07-15 23:10:11.084 [Thread-4] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - stop CannalInstance for null-example 
2017-07-15 23:10:11.107 [Thread-4] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - stop successful....

此时登陆 192.168.74.131 canal,查看日志

2017-07-15 23:10:23.730 [pool-5-thread-1] INFO  c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Lo
ading properties file from class path resource [canal.properties]2017-07-15 23:10:23.743 [pool-5-thread-1] INFO  c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Lo
ading properties file from class path resource [example/instance.properties]2017-07-15 23:10:23.747 [pool-5-thread-1] WARN  org.springframework.beans.TypeConverterDelegate - PropertyE
ditor [com.sun.beans.editors.EnumEditor] found through deprecated global PropertyEditorManager fallback - consider using a more isolated form of registration, e.g. on the BeanWrapper/BeanFactory!2017-07-15 23:10:23.750 [pool-5-thread-1] INFO  c.a.otter.canal.instance.spring.CanalInstanceWithSpring - s
tart CannalInstance for 1-example 2017-07-15 23:10:23.782 [pool-5-thread-1] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - start
 successful....2017-07-15 23:10:23.862 [destination = example , address = /192.168.74.129:3306 , EventParser] WARN  c.a.ot
ter.canal.parse.inbound.mysql.MysqlEventParser - prepare to find start position just show master status
  • HA验证结果:
    • 这时192.168.74.131会立马启动example instance,提供新的数据服务
    • 客户端也会随着canal server的切换,通过获取zookeeper中的最新地址,与新的canal server建立链接,继续消费数据,整个过程自动完成*

触发HA自动切换场景 (server/client HA模式都有效)

  1. 正常场景

    a. 正常关闭canal server(会释放instance的所有资源,包括删除running节点)

    b. 平滑切换(gracefully)

操作:更新对应instance的running节点内容,将"active"设置为false,对应的running节点收到消息后,会主动释放running节点,让出控制权但自己jvm不退出,gracefully.

  1. 异常场景

    a. canal server对应的jvm异常crash,running节点的释放会在对应的zookeeper session失效后,释放running节点(EPHEMERAL节点) ps. session过期时间默认为zookeeper配置文件中定义的tickTime的20倍,如果不改动zookeeper配置,那默认就是40秒

    b. canal server所在的网络出现闪断,导致zookeeper认为session失效,释放了running节点,此时canal server对应的jvm并未退出,(一种假死状态,非常特殊的情况)

ps. 为了保护假死状态的canal server,避免因瞬间runing失效导致instance重新分布,所以做了一个策略:canal server在收到running节点释放后,延迟一段时间抢占running,原本running节点的拥有者可以不需要等待延迟,优先取得running节点,可以保证假死状态下尽可能不无谓的释放资源。 目前延迟时间的默认值为5秒,即running节点针对假死状态的保护期为5秒.

mysql多节点解析配置(parse解析自动切换)

Clone this wiki locally