ZooKeeper 集群旨在保持正常运行,即使丢失一个或多个 ZooKeeper 节点,也不会丢失数据。这种弹性可有效用于在不造成系统停机的情况下对 ZooKeeper 节点执行维护。
ZooKeeper 和 Edge 简介
在 Edge 中,ZooKeeper 节点包含有关各种 Edge 组件的位置和配置的配置数据,并通知不同组件配置更改。生产系统支持的所有 Edge 拓扑都至少使用三个 ZooKeeper 节点。
使用 Edge 配置文件中的 ZK_HOSTS 和 ZK_CLIENT_HOSTS 属性指定 ZooKeeper 节点。例如:
ZK_HOSTS="$IP1 $IP2 $IP3" ZK_CLIENT_HOSTS="$IP1 $IP2 $IP3"
其中:
ZK_HOSTS指定 ZooKeeper 节点的 IP 地址。在所有 ZooKeeper 节点上,IP 地址必须按相同顺序列出。在多数据中心环境中,列出所有数据中心的所有 ZooKeeper 节点。
ZK_CLIENT_HOSTS指定仅由此数据中心使用的 ZooKeeper 节点的 IP 地址。在数据中心的所有 ZooKeeper 节点上,IP 地址必须按相同顺序列出。在单数据中心安装中,这些节点与 ZK_HOSTS 指定的节点相同。在多数据中心环境中,每个数据中心的 Edge 配置文件应仅列出该数据中心的 ZooKeeper 节点。
默认情况下,所有 ZooKeeper 节点都被指定为投票者节点。这意味着这些节点都参与选举 ZooKeeper 领导者。您可以将 :observer 修饰符与 ZK_HOSTS 结合使用,以表示该节点是观察者节点,而不是投票者。观察者节点不参与主要副本的选举。
在创建多个边缘数据中心时,或者在单个数据中心具有大量 ZooKeeper 节点时,您通常会指定 :observer 修饰符。例如,在具有两个数据中心的 12 主机 Edge 安装中,数据中心 2 中节点 9 上的 ZooKeeper 是观察者:

然后,您在数据中心 1 的配置文件中使用以下设置:
ZK_HOSTS="$IP1 $IP2 $IP3 $IP7 $IP8 $IP9:observer" ZK_CLIENT_HOSTS="$IP1 $IP2 $IP3"
对于数据中心 2:
ZK_HOSTS="$IP1 $IP2 $IP3 $IP7 $IP8 $IP9:observer" ZK_CLIENT_HOSTS="$IP7 $IP8 $IP9"
以下部分详细介绍了领导者节点、投票者节点和观察者节点,并说明了添加投票者节点和观察者节点的注意事项。
关于领导者、追随者、投票者和观察者
在多节点 ZooKeeper 安装中,其中一个节点被指定为领导者。所有其他 ZooKeeper 节点均指定为跟随者。虽然可以从任何 ZooKeeper 节点进行读取,但所有写入请求都会转发到主节点。例如,向 Edge 添加了新的消息处理器。该信息会写入 ZooKeeper 领导者。然后,所有跟随者都会复制数据。
在 Edge 安装时,您需要将每个 ZooKeeper 节点指定为投票者或观察者。然后,所有投票者 ZooKeeper 节点都会选出领导者。选举领导者的一个要求是,必须有法定人数的正常运行的 ZooKeeper 投票者节点可用。仲裁意味着所有数据中心内超过一半的投票者 ZooKeeper 节点都正常运行。
如果没有可用的投票者节点达到法定人数,则无法选出主要区域。在这种情况下,Zookeeper 无法处理请求。这意味着,在恢复仲裁之前,您无法向 Edge 管理服务器发出请求、处理 API 请求或登录 Edge 界面。
例如,在单个数据中心安装中:
- 您安装了三个 ZooKeeper 节点
- 所有 ZooKeeper 节点都是投票者
- 仲裁是两个正常运行的投票者节点
- 如果只有一个投票者节点可用,则 ZooKeeper 集成无法正常运行
在具有两个数据中心的安装中:
- 您在每个数据中心安装了三个 ZooKeeper 节点,总共六个节点
- 数据中心 1 有三个投票者节点
- 数据中心 2 有两个投票者节点和一个观察者节点
- 仲裁基于两个数据中心内的五个投票者,因此是三个正常运行的投票者节点
- 如果只有两个或更少的投票者节点可用,则 ZooKeeper 集群无法运行
将节点添加为投票者或观察者的注意事项
您的系统要求可能需要您向 Edge 安装添加额外的 ZooKeeper 节点。添加 ZooKeeper 节点文档介绍了如何向 Edge 添加其他 ZooKeeper 节点。添加 ZooKeeper 节点时,您必须考虑要添加的节点类型:投票者或观察者。
您需要确保有足够的投票者节点,以便在一个或多个投票者节点关闭时,ZooKeeper 集成仍可正常运行,这意味着仍有投票者节点仲裁。通过添加投票者节点,您可以增加仲裁的大小,因此可以容忍更多投票者节点停机。
不过,添加额外的投票者节点可能会对写入性能产生负面影响,因为写入操作需要仲裁节点就主节点达成一致。确定领导者所需的时间取决于投票者节点的数量,随着您添加更多投票者节点,该时间会增加。因此,您不希望将所有节点都设为投票者。
您可以添加观察者节点,而不是添加投票者节点。添加观察者节点可提高整体系统读取性能,而不会增加选举主要副本的开销,因为观察者节点不投票,也不会影响仲裁大小。因此,如果观察者节点发生故障,不会影响集合选举领导者的能力。不过,丢失观察器节点可能会导致 ZooKeeper 集合的读取性能下降,因为可用于处理数据请求的节点较少。
在单个数据中心内,Apigee 建议您最多拥有五个投票者,无论观察者节点数量如何。在两个数据中心内,Apigee 建议您最多设置九个投票者(一个数据中心内五个,另一个数据中心内四个)。然后,您可以根据系统要求添加任意数量的观察器节点。
移除 Zookeeper 节点
您可能出于多种原因想要移除 Zookeeper 节点;例如,节点损坏或被添加到错误的环境中。
本部分介绍如何在节点关闭且无法访问时移除 ZooKeeper 节点。
如需移除 Zookeeper 节点,请执行以下操作:
- 修改静默配置文件,并移除要移除的 Zookeeper 节点的 IP 地址。
- 为 ZooKeeper 重新运行
setup命令,以重新配置其余 ZooKeeper 节点:/opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper setup -f updated_config_file
- 重启所有 Zookeeper 节点:
/opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
- 重新配置管理服务器节点:
/opt/apigee/apigee-service/bin/apigee-service edge-management-server setup -f updated_config_file
/opt/apigee/apigee-service/bin/apigee-service edge-management-server restart - 重新配置所有路由器:
/opt/apigee/apigee-service/bin/apigee-service edge-router setup -f updated_config_file
/opt/apigee/apigee-service/bin/apigee-service edge-router restart - 重新配置所有消息处理器:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor setup -f updated_config_file
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart - 重新配置所有 Qpid 节点:
/opt/apigee/apigee-service/bin/apigee-service edge-qpid-server setup -f updated_config_file
/opt/apigee/apigee-service/bin/apigee-service edge-qpid-server restart - 重新配置所有 Postgres 节点:
/opt/apigee/apigee-service/bin/apigee-service edge-postgres-server setup -f updated_config_file
/opt/apigee/apigee-service/bin/apigee-service edge-postgres-server restart
维护注意事项
如果您一次在一个节点上执行 ZooKeeper 维护,则可以在功能齐全的集成上执行 ZooKeeper 维护,而无需停机。通过确保一次只有一个 ZooKeeper 节点处于关闭状态,您可以确保始终有投票者节点仲裁可用于选举领导者。
跨多个数据中心进行维护
使用多个数据中心时,请注意 ZooKeeper 集群不会区分数据中心。ZooKeeper 集成会将所有数据中心内的所有 ZooKeeper 节点视为一个整体。
ZooKeeper 执行仲裁计算时,不会考虑给定数据中心内投票者节点的位置。各个节点可能会在数据中心之间发生故障,但只要在整个集合中保留仲裁,ZooKeeper 就会保持正常运行。
维护影响
在不同时间,您必须关闭 ZooKeeper 节点(投票者节点或观察者节点)进行维护。例如,您可能需要升级节点上的 Edge 版本,托管 ZooKeeper 的机器可能会发生故障,或者节点可能由于其他原因(例如网络连接错误)而不可用。
如果发生故障的节点是观察者节点,则 ZooKeeper 集群的性能可能会略有下降,直到该节点恢复。如果该节点是投票者节点,则可能会影响 ZooKeeper 集群的可用性,因为参与主节点选举过程的节点丢失。无论投票者节点关闭的原因是什么,都必须保持可用投票者节点的仲裁。
维护程序
只有在确保 ZooKeeper 集成正常运行后,才能执行维护过程。这假设观察者节点正常运行,并且在维护期间有足够的投票者节点可用于保留仲裁。
满足这些条件后,任意大小的 ZooKeeper 集群都可以容忍在任何时间点丢失单个节点,而不会丢失数据或对性能产生重大影响。这意味着,您可以对集合中的任何节点执行维护,只要一次只在一个节点上执行即可。
在执行维护的过程中,请使用以下过程确定 ZooKeeper 节点的类型(领导者、投票者或观察者):
- 如果 ZooKeeper 节点上未安装
nc,请安装:sudo yum install nc
- 在节点上运行以下
nc命令,其中 2181 是 ZooKeeper 端口:echo stat | nc localhost 2181
您应该会看到如下形式的输出:
Zookeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT Clients: /a.b.c.d:xxxx[0](queued=0,recved=1,sent=0) Latency min/avg/max: 0/0/0 Received: 1 Sent: 0 Connections: 1 Outstanding: 0 Zxid: 0xc00000044 Mode: follower Node count: 653
在节点的输出
Mode行中,您应该会看到observer、leader或follower(表示不是领导者的投票者),具体取决于节点配置。 - 在每个 ZooKeeper 节点上重复执行第 1 步和第 2 步。
摘要
对 ZooKeeper 集成环境执行维护的最佳方法是一次对一个节点执行维护。请注意:
- 在维护期间,您必须维护投票者节点的仲裁,以确保 ZooKeeper 集群保持正常运行。
- 关闭观察者节点不会影响仲裁或选举领导者的能力。
- 仲裁是根据所有数据中心内的所有 ZooKeeper 节点计算得出的。
- 在上一台服务器正常运行后,继续对下一台服务器进行维护。
- 使用
nc命令检查 ZooKeeper 节点。