5.3. 配置 ZooKeeper


Kafka 使用 ZooKeeper 存储配置数据和集群协调。强烈建议您运行复制 ZooKeeper 实例的集群。

5.3.1. 基本配置

最重要的 ZooKeeper 配置选项是:

tickTime
ZooKeeper 的基本时间单位(以毫秒为单位)。它用于心跳和会话超时。例如,最小会话超时将是两个 ticks。
dataDir
ZooKeeper 存储其事务日志及其内存数据库的快照的目录。这应该设置为在安装过程中创建的 /var/lib/zookeeper/ 目录。
clientPort
客户端可以连接的端口号。默认值为 2181

名为 config/zookeeper.properties 的 ZooKeeper 配置文件示例位于 Apache Kafka 安装目录中的 Streams 中。建议您将 dataDir 目录放在单独的磁盘设备中,以最小化 ZooKeeper 中的延迟。

zookeeper 配置文件应该位于 /opt/kafka/config/zookeeper.properties 中。可在下面找到配置文件的基本示例。该配置文件必须可由 kafka 用户读取。

tickTime=2000
dataDir=/var/lib/zookeeper/
clientPort=2181
Copy to Clipboard Toggle word wrap

5.3.2. zookeeper 集群配置

在大多数生产环境中,建议您部署复制 ZooKeeper 实例的集群。稳定且高度可用的 ZooKeeper 集群对于运行可靠的 ZooKeeper 服务非常重要。ZooKeeper 集群也称为 ensembles

ZooKeeper 集群通常由奇数个节点组成。ZooKeeper 要求集群中的大多数节点都已启动并在运行。例如:

  • 在具有三个节点的集群中,至少有两个节点必须启动并在运行。这意味着它可以容许一个节点被停机。
  • 在由五个节点组成的集群中,必须至少有三个节点可用。这意味着它可以容许两个节点处于 down 状态。
  • 在由 7 个节点组成的集群中,必须至少有四个节点可用。这意味着它可以容许三个节点被停机。

在 ZooKeeper 集群中拥有更多节点可以提供更好的弹性和可靠性。

ZooKeeper 可以在带有偶数节点的集群中运行。但是,额外的节点不会增加集群的弹性。具有四个节点的集群至少需要三个节点可用,且只能容忍一个节点被停机。因此,它具有与只有三个节点的集群相同的弹性。

理想情况下,不同的 ZooKeeper 节点应该位于不同的数据中心或网络片段中。增加 ZooKeeper 节点数量会增加集群同步上消耗的工作负载。对于大多数 Kafka 用例,有 3、5 或 7 节点的 ZooKeeper 集群应该足够了。

警告

具有 3 个节点的 ZooKeeper 集群只能容忍 1 个不可用的节点。这意味着,如果在 ZooKeeper 集群的其他节点上进行维护,集群节点会崩溃。

重复的 ZooKeeper 配置支持独立配置支持所有配置选项。为集群配置添加附加选项:

initLimit
允许后续者连接到集群领导机的时间长度。将时间指定为多个 ticks (更多详情请参阅 tickTime 选项 )。
syncLimit
跟随者可以位于领导机后的时间长度。将时间指定为多个 ticks (更多详情请参阅 tickTime 选项 )。
reconfigEnabled
启用或禁用动态重新配置。必须启用才能向 ZooKeeper 集群添加或删除服务器。
standaloneEnabled
启用或禁用独立模式,其中 ZooKeeper 只使用一个服务器运行。

除了以上选项外,每个配置文件还应包含应该是 ZooKeeper 集群成员的服务器列表。服务器记录应以 server.id=hostname:port1:port2 格式指定,其中:

id
ZooKeeper 集群节点的 ID。
hostname
节点侦听连接的主机名或 IP 地址。
port1
用于集群内通信的端口号。
port2
用于领导选举机制的端口号。

以下是具有三个节点的 ZooKeeper 集群配置文件示例:

tickTime=2000
dataDir=/var/lib/zookeeper/
initLimit=5
syncLimit=2
reconfigEnabled=true
standaloneEnabled=false

server.1=172.17.0.1:2888:3888:participant;172.17.0.1:2181
server.2=172.17.0.2:2888:3888:participant;172.17.0.2:2181
server.3=172.17.0.3:2888:3888:participant;172.17.0.3:2181
Copy to Clipboard Toggle word wrap
提示

要使用四个字母单词命令,在 zookeeper.properties 中指定 4lw.commands.whitelist=*

myid 文件

ZooKeeper 集群中的每个节点都必须被分配一个唯一 ID。每个节点的 ID 必须在 myid 文件中配置,并存储在 dataDir 文件夹中,如 /var/lib/zookeeper/myid 文件应当仅包含一个将写入 ID 用作文本的一行。ID 可以是从 1 到 255 的任何整数。您必须在每个集群节点上手动创建此文件。使用此文件,每个 ZooKeeper 实例将使用配置文件中的相应 server. 行的配置来配置其监听程序。它还将使用所有其他 server. 行来识别其他群集成员。

在上例中,有三个节点,因此每个节点都有一个不同的 myid,值分别为 123

5.3.3. 身份验证

默认情况下,Zoo ZooKeeper 不使用任何类型的身份验证并允许匿名连接。但是,它支持 Java 认证和授权服务(JAAS),可用于使用简单身份验证和安全层 (SASL) 设置身份验证。ZooKeeper 支持在本地存储的凭证中使用 DIGEST-MD5 SASL 机制进行身份验证。

5.3.3.1. 使用 SASL 进行身份验证

JAAS 使用单独的配置文件进行配置。建议将 JAAS 配置文件放在与 ZooKeeper 配置相同的目录中(/opt/kafka/config/)。推荐的文件名是 zookeeper-jaas.conf。当将 ZooKeeper 集群与多个节点搭配使用时,必须在所有集群节点上创建 JAAS 配置文件。

JAAS 使用上下文进行配置。服务器和客户端等单独部分始终使用单独的 上下文 进行配置。上下文是一个 配置选项,其格式如下:

ContextName {
       param1
       param2;
};
Copy to Clipboard Toggle word wrap

SASL 身份验证为服务器到服务器通信(实例 ZooKeeper 实例之间的沟通)和客户端到服务器通信( Kafka 和 ZooKeeper 之间相互通信)单独配置。服务器到服务器身份验证只适用于带有多个节点的 ZooKeeper 集群。

服务器到服务器身份验证

对于服务器到服务器身份验证,JAAS 配置文件包含两个部分:

  • 服务器配置
  • 客户端配置

使用 DIGEST-MD5 SASL 机制时,Qorum Server 上下文用于配置身份验证服务器。它必须包含所有用户名,以允许以未加密的形式与其密码连接。第二个上下文 QuorumLearner 必须为内置在 ZooKeeper 中的客户端配置。它还包含未加密的形式的密码。以下是 DIGEST-MD5 机制的 JAAS 配置文件示例:

QuorumServer {
       org.apache.zookeeper.server.auth.DigestLoginModule required
       user_zookeeper="123456";
};

QuorumLearner {
       org.apache.zookeeper.server.auth.DigestLoginModule required
       username="zookeeper"
       password="123456";
};
Copy to Clipboard Toggle word wrap

除了 JAAS 配置文件外,还必须通过指定以下选项在常规 ZooKeeper 配置文件中启用 server-to-server 身份验证:

quorum.auth.enableSasl=true
quorum.auth.learnerRequireSasl=true
quorum.auth.serverRequireSasl=true
quorum.auth.learner.loginContext=QuorumLearner
quorum.auth.server.loginContext=QuorumServer
quorum.cnxn.threads.size=20
Copy to Clipboard Toggle word wrap

使用 KAFKA_OPTS 环境变量将 JAAS 配置文件作为 Java 属性传递给 ZooKeeper 服务器:

su - kafka
export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/zookeeper-jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
Copy to Clipboard Toggle word wrap

有关服务器到服务器身份验证的更多信息,请参阅 ZooKeeper wiki

客户端到服务器身份验证

客户端到服务器身份验证配置在与服务器到服务器身份验证相同的 JAAS 文件中。但是,与服务器到服务器身份验证不同,它仅包含服务器配置。配置的客户端部分必须在客户端中进行。有关如何配置 Kafka 代理以使用身份验证连接到 ZooKeeper 的详情,请参考 Kafka 安装 部分。

将服务器上下文添加到 JAAS 配置文件中,以配置客户端到服务器身份验证。对于 DIGEST-MD5 机制,它会配置所有用户名和密码:

Server {
    org.apache.zookeeper.server.auth.DigestLoginModule required
    user_super="123456"
    user_kafka="123456"
    user_someoneelse="123456";
};
Copy to Clipboard Toggle word wrap

配置 JAAS 上下文后,通过添加以下行在 ZooKeeper 配置文件中启用客户端到服务器身份验证:

requireClientAuthScheme=sasl
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.2=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
authProvider.3=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
Copy to Clipboard Toggle word wrap

您必须为属于 ZooKeeper 集群的每个服务器添加 authProvider. <ID > 属性。

使用 KAFKA_OPTS 环境变量将 JAAS 配置文件作为 Java 属性传递给 ZooKeeper 服务器:

su - kafka
export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/zookeeper-jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
Copy to Clipboard Toggle word wrap

有关在 Kafka 代理中配置 ZooKeeper 身份验证的更多信息,请参阅 第 6.5 节 “ZooKeeper 身份验证”

此流程描述了如何在 ZooKeeper 集群节点间使用 SASL DIGEST-MD5 机制启用身份验证。

先决条件

  • 在主机上安装了 Apache Kafka 的流
  • ZooKeeper 集群 配置了多个 节点。

启用 SASL DIGEST-MD5 身份验证

  1. 在所有 ZooKeeper 节点上,创建或编辑 /opt/kafka/config/zookeeper-jaas.conf JAAS 配置文件并添加以下上下文:

    QuorumServer {
           org.apache.zookeeper.server.auth.DigestLoginModule required
           user_<Username>="<Password>";
    };
    
    QuorumLearner {
           org.apache.zookeeper.server.auth.DigestLoginModule required
           username="<Username>"
           password="<Password>";
    };
    Copy to Clipboard Toggle word wrap

    在 JAAS 上下文中,用户名和密码都必须相同。例如:

    QuorumServer {
           org.apache.zookeeper.server.auth.DigestLoginModule required
           user_zookeeper="123456";
    };
    
    QuorumLearner {
           org.apache.zookeeper.server.auth.DigestLoginModule required
           username="zookeeper"
           password="123456";
    };
    Copy to Clipboard Toggle word wrap
  2. 在所有 ZooKeeper 节点上,编辑 /opt/kafka/config/zookeeper.properties ZooKeeper 配置文件并设置以下选项:

    quorum.auth.enableSasl=true
    quorum.auth.learnerRequireSasl=true
    quorum.auth.serverRequireSasl=true
    quorum.auth.learner.loginContext=QuorumLearner
    quorum.auth.server.loginContext=QuorumServer
    quorum.cnxn.threads.size=20
    Copy to Clipboard Toggle word wrap
  3. 逐一重启所有 ZooKeeper 节点。要将 JAAS 配置传递给 ZooKeeper,请使用 KAFKA_OPTS 环境变量。

    su - kafka
    export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/zookeeper-jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
    Copy to Clipboard Toggle word wrap

此流程描述了如何使用 ZooKeeper 客户端和 ZooKeeper 之间的 SASL DIGEST-MD5 机制启用身份验证。

先决条件

启用 SASL DIGEST-MD5 身份验证

  1. 在所有 ZooKeeper 节点上,创建或编辑 /opt/kafka/config/zookeeper-jaas.conf JAAS 配置文件并添加以下上下文:

    Server {
        org.apache.zookeeper.server.auth.DigestLoginModule required
        user_super="<SuperUserPassword>"
        user<Username1>_="<Password1>" user<USername2>_="<Password2>";
    };
    Copy to Clipboard Toggle word wrap

    超级用户 自动具有 priviledges 管理员。该文件可以包含多个用户,但 Kafka 代理只需要一个额外的用户。Kafka 用户的建议名称为 kafka

    以下示例显示了 客户端到服务器 身份验证的服务器上下文:

    Server {
        org.apache.zookeeper.server.auth.DigestLoginModule required
        user_super="123456"
        user_kafka="123456";
    };
    Copy to Clipboard Toggle word wrap
  2. 在所有 ZooKeeper 节点上,编辑 /opt/kafka/config/zookeeper.properties ZooKeeper 配置文件并设置以下选项:

    requireClientAuthScheme=sasl
    authProvider.<IdOfBroker1>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    authProvider.<IdOfBroker2>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    authProvider.<IdOfBroker3>=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    Copy to Clipboard Toggle word wrap

    必须为作为 ZooKeeper 集群一部分的每个节点添加 authProvider. <ID > 属性。一个三节点 ZooKeeper 集群配置示例必须类似如下:

    requireClientAuthScheme=sasl
    authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    authProvider.2=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    authProvider.3=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    Copy to Clipboard Toggle word wrap
  3. 逐一重启所有 ZooKeeper 节点。要将 JAAS 配置传递给 ZooKeeper,请使用 KAFKA_OPTS 环境变量。

    su - kafka
    export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/zookeeper-jaas.conf"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
    Copy to Clipboard Toggle word wrap

5.3.4. 授权

ZooKeeper 支持访问控制列表(ACL)来保护存储在其中的数据。Kafka 代理可以自动为他们创建的所有 ZooKeeper 记录配置 ACL 权限,因此没有其他 ZooKeeper 用户都可以修改它们。

有关在 Kafka 代理中启用 ZooKeeper ACL 的详情,请参考 第 6.6 节 “ZooKeeper 授权”

5.3.5. TLS

ZooKeeper 支持 TLS 进行加密或身份验证。

5.3.6. 其他配置选项

您可以根据您的用例设置以下额外 ZooKeeper 配置选项:

maxClientCnxns
到 ZooKeeper 集群的单个成员的最大并发客户端连接数。
autopurge.snapRetainCount
ZooKeeper 的 in-memory 数据库的快照数量,该数据库将被保留。默认值为 3
autopurge.purgeInterval
清除快照的时间间隔(以小时为单位)。默认值为 0, 这个选项被禁用。

所有可用的配置选项都可在 ZooKeeper 文档 中找到。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat