• 数据同步canal服务端HA配置


    canal服务端HA模式,本人并未使用过,为保证文章的完整性,从以下地址摘抄该部分内容,待以后验证及使用

    https://github.com/alibaba/canal/wiki/AdminGuide

    1、机器准备

    ① 2个canal服务端节点  10.20.144.22, 10.20.144.51

    ② zookeeper地址为10.20.144.51:2181

    ③ mysql地址:10.20.144.15:3306

    2、按照部署和配置,在单台机器上各自完成配置,演示时instance name为example

    ① 修改canal.properties,加上zookeeper配置,spring配置选择default-instance.xml

    1 canal.zkServers=10.20.144.51:2181
    2 canal.instance.global.spring.xml = classpath:spring/default-instance.xml

    ② 创建example目录,并修改instance.properties

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

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

    3、启动两台机器的canal

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

    查看一下zookeeper中的节点信息,也可以知道当前工作的节点为10.20.144.51:11111

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

    4、客户端链接, 消费数据

    可以直接指定zookeeper地址和instance name,canal client会自动从zookeeper中的running节点,获取当前服务的工作节点,然后与其建立链接:

    1 CanalConnector connector = CanalConnectors.newClusterConnector("10.20.144.51:2181", "example", "", "");

    链接成功后,canal server会记录当前正在工作的canal client信息,比如客户端ip,链接的端口信息等 (聪明的你,应该也可以发现,canal client也可以支持HA功能)

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

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

    1 [zk: localhost:2181(CONNECTED) 16] get /otter/canal/destinations/example/1001/cursor
    2 {"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"10.20.144.15","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.002253","position":2574756,"timestamp":1363688722000}}

    5、重启一下canal server

    停止正在工作的10.20.144.51的canal server

    这时10.20.144.22会立马启动example instance,提供新的数据服务

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

    与此同时,客户端也会随着canal server的切换,通过获取zookeeper中的最新地址,与新的canal server建立链接,继续消费数据,整个过程自动完成

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

    5.1.1 正常场景

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

    ② 平滑切换(gracefully)

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

    1 {"active":false,"address":"10.20.144.22:11111","cid":1}
    5.1.2 异常场景

    ① canal server对应的jvm异常crash,running节点的释放会在对应的zookeeper session失效后,释放running节点(EPHEMERAL节点)

    ps. session过期时间默认为zookeeper配置文件中定义的tickTime的20倍,如果不改动zookeeper配置,那默认就是40秒

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

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

  • 相关阅读:
    find 以及linux 和windows 文件互传
    27 关于Object类 -- equals()
    26 super关键字
    25 访问修饰符限定词
    24 继承 子类中方法重写
    23 static 关键字
    22 包(package)来解决不同包下同名文件的冲突问题
    21 封装(get,set方法)
    20 带参构造方法(this关键字)
    19 无参构造方法
  • 原文地址:https://www.cnblogs.com/wangzhisdu/p/8125928.html
Copyright © 2020-2023  润新知