集成ZooKeeper
前期回顾:
- Canal:部署Canal与Canal Admin
搭建ZooKeeper
可以参考下面这几篇博客:
- ZooKeeper :Shell脚本搭建单机版ZooKeeper
- ZooKeeper :搭建ZooKeeper集群
- ZooKeeper :Nginx基于TCP协议代理ZooKeeper集群
启动ZooKeeper
并且关闭防火墙。
在Canal Admin
上添加集群,集群名称为zookeeper
。
修改zookeeper
集群的主配置。
主要是添加ZooKeeper
服务地址。
在zookeeper
集群下创建server
(博主把之前创建的instance
和server
都删除了,因为server
不能修改所属集群配置,只能删除再重新创建)。
创建kaven server
成功,状态为启动。
在zookeeper
集群下创建instance
。
由下图所示,itkaven instance
由zookeeper
集群下的kaven server
运行,状态也是启动。
查看itkaven instance
的日志,很显然启动成功了。
因为zookeeper
集群下只有一个server
,即kaven server
,因此itkaven instance
肯定是在kaven server
上运行的。查看Canal
项目(zookeeper
集群下唯一的server
)的日志文件和配置文件即可发现itkaven instance
的相关文件:
ZooKeeper
中也会保存一些数据(比如集群下的所有server
和instance
信息,以及instance
在哪个server
上运行)。
HA机制设计
canal
的HA
分为两部分,canal server
和canal client
分别有对应的HA
实现:
-
canal server
: 为了减少对mysql dump
的请求,不同server
上的instance
要求同一时间只能有一个处于running
,其他的处于standby
状态。 -
canal client
: 为了保证有序性,一个instance
同一时间只能由一个canal client
进行get/ack/rollback
操作,否则客户端接收无法保证有序。
整个HA
机制的控制主要是依赖了ZooKeeper
的几个特性,watcher
和EPHEMERAL
节点(和session
生命周期绑定)。
- ZooKeeper :重要概念
大致步骤:
-
canal server
要启动某个canal instance
时,都先向ZooKeeper
进行一次尝试启动判断 (创建EPHEMERAL
节点,谁创建成功就允许谁启动)。 - 创建
ZooKeeper
节点成功后,该canal server
就启动对应的canal instance
,没有创建成功的canal instance
就会处于standby
状态。 - 一旦
ZooKeeper
发现canal server
创建的节点消失后,立即通知其他的canal server
再次进行步骤1
的操作,重新选出一个canal server
启动canal instance
。 -
canal client
每次进行connect
时,会首先向ZooKeeper
询问当前是谁启动了canal instance
,然后和其建立连接,一旦连接不可用,会重新尝试connect
。
canal client
的方式和canal server
的方式类似,也是利用ZooKeeper
抢占EPHEMERAL
节点的方式进行控制。
使用ZooKeeper
进行集群管理就介绍到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。