ZooKeeper 集群旨在保持正常运行,即使丢失 一个或多个 ZooKeeper 节点,也不会丢失数据。这种弹性可用于有效地对 ZooKeeper 节点执行维护,而不会导致系统停机。
关于 ZooKeeper 和 Edge
在 Edge 中,ZooKeeper 节点包含有关各种 Edge 组件的位置和配置的 配置数据,并通知不同的组件配置更改。生产系统的所有 受支持 Edge 拓扑都至少使用三个 ZooKeeper 节点。
使用 ZK_HOSTS 和 ZK_CLIENT_HOSTS 属性在
Edge 配置文件中指定 ZooKeeper 节点。例如:
ZK_HOSTS="$IP1 $IP2 $IP3" ZK_CLIENT_HOSTS="$IP1 $IP2 $IP3"
其中:
ZK_HOSTS指定 ZooKeeper 节点的 IP 地址。IP 地址 必须在所有 ZooKeeper 节点上按相同的顺序列出。在多数据中心环境中,列出所有数据中心的所有 ZooKeeper 节点。
ZK_CLIENT_HOSTS仅指定此 数据中心使用的 ZooKeeper 节点的 IP 地址。IP 地址必须在 数据中心的所有 ZooKeeper 节点上按相同的顺序列出。在单个数据中心安装中,这些节点与 ZK_HOSTS 指定的节点相同。在多数据中心环境中,每个数据中心的 Edge 配置文件应仅列出该数据中心的 ZooKeeper 节点。
默认情况下,所有 ZooKeeper 节点都被指定为投票节点。 这意味着所有节点都参与选举 ZooKeeper 领导者。您可以将
:observer 修饰符与 ZK_HOSTS 搭配使用,以表示
该节点是 观察者 节点,而不是投票节点。观察者节点不参与
领导者的选举。
您通常会在创建多个 Edge 数据
中心时,或者当单个数据中心有大量 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 节点数量的一半。
如果没有足够数量的投票节点,则无法选举领导者。在这种情况下, ZooKeeper 无法处理请求。这意味着,在恢复足够数量的投票节点之前,您无法向 Edge 管理服务器发出请求、处理 API 请求或登录到 New 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 节点。