zookeeper-集群和zab协议

82 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

zookeeper集群搭建

以一台虚拟机为例,搭建伪集群环境,一共搭建3个节点。节点对外提供服务端口号分别为2181、2182、2183

  1. 以原始zookeeper-版本号为基准,复制三份zookeeper文件,目录名称分别取名为zookeeper2181、zookeeper2182、zookeeper2183
cp ‐r zookeeper‐版本号 zookeeper2181
... zookeeper2182
... zookeeper2183
  1. 分别修改zookeeper2181、zookeeper2182、zookeeper2183服务器对应配置文件,主要修改内容:服务器对应的端口号、数据快照文件所在路径、集群配置信息(集群服务器编号、包括服务器ip+zookeeper之间的通信端口和Leader的选举端口)
  2. 在 dataDir(数据快照文件所在路径)指定的目录下,创建 myid文件,然后在该文件添加上一步 server 配置的对应 集群服务器编号
  3. 分别启动三台服务器,检验集群状态

zab协议

zab协议 的全称是 Zookeeper Atomic Broadcast ,中文名为zookeeper原子广播。 zookeeper 内部也是通过 zab协议来保证分布式事务的最终一致性。

zab广播模式工作原理,通过类似两阶段提交协议的方式解决数据一致性:

  1. leader从客户端收到一个写请求
  2. leader生成一个新的事务并为这个事务生成一个唯一的ZXID
  3. leader将这个事务提议发送给所有的follower节点
  4. follower节点将收到的事务请求加入到历史队列(history queue)中,并发送ack给 leader
  5. 当leader收到大多数follower的ack消息,一般为半数以上节点,leader就会发送commit请 求
  6. 当follower收到commit请求时,从历史队列中将事务请求commit
  7. 完成

zookeeperAPI连接集群

ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)

其中: connectionString - zooKeeper集合主机 sessionTimeout - 会话超时(以毫秒为单位) watcher - 实现“监视器”界面的对象。ZooKeeper集合通过监视器对象返回连接状 态