精通 zookeeper 第一章 zk 集群是如何启动的

zookeeper server 是如何启动的

我们使用 zkServer.sh start 进行启动 zk 服务器,查看这个脚本的代码发现实际上调用的是 QuorumPeerMainmain 方法

我们讲解 zk 集群模式的工作原理,先看下图是 server 启动弄的整体架构组件工作原理图,然后我大概解释一下各大核心组件

集群是如何启动的.jpg

启动时候运行的核心组件

上图我们可以看到三种颜色的组件图

  • 黄色:监听了 2181 端口,大概应该知道这个端口就是负责与客户端通信的,围绕这一块的核心组件是 NioServerCnxnFactory
  • 蓝色:监听了 3888 端口,这一系列组件主要是用于集群选举用的,选举成为 leader 还是 follower 还是 observer,围绕这一块的核心组件为负责通信的 QuirumCnxManager,负责选举的 FastLeaderElection
  • 紫色:监听了 2888 端口,这一系列组件主要是用于选举完成后确认好了各个 server 所处的角色之后,leader 和 follower 需要进行数据交互,围绕这一块的核心组件为 Leader(Follower) 组件

同时我们可以看到这一系列的组件都是包含在 QuorumPeer 这个中心组件之中,可以说这就代表了一个 zk server,可以想象成各大组件就是一个人的各个器官,从而组成了 QuorumPeer 这个完整的人

在上图完整的画出了 Leader 的核心组件,Follower 的这些组件跟 Leader 是一样的,不同的是 Follower 在选举完成后创建的不是 Leader 组件而是创建的 Follower 组件

ZKDatabase 代表了一个内存数据库,写入到 zk 的数据会被全部记录在内存中,同时重启之后也会将磁盘的数据恢复到内存中

整体流程梳理

启动 zk server 创建一个 NioServerCnxnFactory 用于跟客户端进行网络通信

创建一个 ZKDatabase 通过使用 FileTxnSnapLog 加载磁盘快照文件 + proposal 日志文件恢复出来一个内存数据库

创建一个 QuirumCnxManager 负责集群之间的投票信息传递,各个节点会发送给对方当前机器的 zxid、epoch、myid 值给对方

创建一个 FastLeaderElection 读取归档各个节点的投票数据,最终决策出来谁做 LeaderFollowerObserver

最后根据当前节点所属角色创建 LeaderFollowerObserver,他们会另外绑定一个端口用于集群之间的数据同步,针对每个连接创建一个线程处理,同时为了避免连接重复绑定创建,只允许 server id 大的向 server id 小的发起连接,小的发往大的会比强制关闭

思考

从 zk 服务器的启动我们可以看到,对于网络调用的处理,什么情况下适合用 BIO,什么情况适合用 NIO,以及不同的端口各成体系,逻辑独立,易于拓展、维护、同时容错性也更高

与客户端通信的时候,可能存在大量客户端的连接和高并发的读请求默认最大连接客户端数量为 60 个可以调整大小,如果采用 BIO 的话需要为每个客户端创建一个线程,就算客户端没有请求也会占用线程资源

集群之间的通信采用的是 BIO,为每个客户端之间的连接创建一个线程来处理,因为集群结点相对较少

集群之间的通信选举使用 3888 端口,leader 和 follower 信息同步采用 2888 端口,二者互相隔离就算某一方有错误也不会影响到对方

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%