ZooKeeper 维护简介

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 节点,请执行以下操作:

  1. 修改静默配置文件,并移除要移除的 Zookeeper 节点的 IP 地址。
  2. 为 ZooKeeper 重新运行 setup 命令,以重新配置其余 ZooKeeper 节点:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper setup -f updated_config_file
  3. 重启所有 Zookeeper 节点:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
  4. 重新配置管理服务器节点:
    /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
  5. 重新配置所有路由器:
    /opt/apigee/apigee-service/bin/apigee-service edge-router setup -f updated_config_file
    /opt/apigee/apigee-service/bin/apigee-service edge-router restart
  6. 重新配置所有消息处理器:
    /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
  7. 重新配置所有 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
  8. 重新配置所有 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 节点的类型(领导者、投票者或观察者):

  1. 如果 ZooKeeper 节点上未安装 nc,请安装:
    sudo yum install nc
  2. 在节点上运行以下 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(表示不是领导者的投票者),具体取决于节点配置。

  3. 在每个 ZooKeeper 节点上重复执行第 1 步和第 2 步。

摘要

对 ZooKeeper 集成环境执行维护的最佳方法是一次对一个节点执行维护。请注意:

  • 在维护期间,您必须维护投票者节点的仲裁,以确保 ZooKeeper 集群保持正常运行。
  • 关闭观察者节点不会影响仲裁或选举领导者的能力。
  • 仲裁是根据所有数据中心内的所有 ZooKeeper 节点计算得出的。
  • 在上一台服务器正常运行后,继续对下一台服务器进行维护。
  • 使用 nc 命令检查 ZooKeeper 节点。