5.3. 配置 ZooKeeper
Kafka 使用 ZooKeeper 来存储配置数据和集群协调。强烈建议运行复制的 ZooKeeper 实例集群。
5.3.1. 基本配置 复制链接链接已复制到粘贴板!
最重要的 ZooKeeper 配置选项是:
tickTime
- zookeeper 的基本时间单位(以毫秒为单位)。它用于心跳和会话超时。例如,最少的会话超时为两个空行。
dataDir
-
ZooKeeper 保存它的事务日志及其内存数据库快照的目录。这应该设置为在安装过程中创建的
/var/lib/zookeeper/
目录。 clientPort
-
客户端可以连接的端口号。默认为
2181
。
名为 config/zookeeper.properties
的 ZooKeeper 配置文件示例位于 AMQ Streams 安装目录中。建议将 dataDir
目录放在单独的磁盘设备上,以最小化 ZooKeeper 的延迟。
zookeeper 配置文件应该位于 /opt/kafka/config/zookeeper.properties
中。下面是一个配置文件的基本示例。配置文件必须可由 kafka
用户读取。
tickTime=2000 dataDir=/var/lib/zookeeper/ clientPort=2181
tickTime=2000
dataDir=/var/lib/zookeeper/
clientPort=2181
5.3.2. zookeeper 集群配置 复制链接链接已复制到粘贴板!
在大多数生产环境中,建议部署复制的 ZooKeeper 实例集群。对于一个可靠的 ZooKeeper 服务,稳定且高度可用的 ZooKeeper 集群非常重要。zookeeper 集群也称为 ensembles。
zookeeper 集群通常包含奇数节点数。zookeeper 要求集群中的大部分节点已启动且正在运行。例如:
- 在具有三个节点的集群中,必须启动并运行两个节点。这意味着它可以容忍一个节点停机。
- 在由五个节点组成的集群中,必须至少提供三个节点。这意味着它可以容忍两个节点。
- 在由七节点组成的集群中,必须至少提供四个节点。这意味着它可以容忍三个节点停机。
在 ZooKeeper 集群中拥有更多节点可以提供更好的弹性和可靠性。
zookeeper 可在有大量节点时运行。但是,额外的节点不会增加集群的弹性。具有四个节点的集群至少需要三个节点可用,并可容忍只有一个节点关闭。因此,它与只有三个节点的集群完全相同。
理想情况下,不同的 ZooKeeper 节点应该位于不同的数据中心或网络段中。增加 ZooKeeper 节点的数量会增加集群同步上消耗的工作负载。对于大多数 Kafka 用例,有 3 个、5 或 7 节点的 ZooKeeper 集群应该足够了。
具有 3 个节点的 ZooKeeper 集群只能容忍 1 个不可用节点。这意味着,如果在 ZooKeeper 集群的其他节点上进行维护,集群节点会崩溃。
重复的 ZooKeeper 配置支持独立配置支持所有配置选项。为集群配置添加了其他选项:
initLimit
-
允许后续时间与集群领导连接并同步。时间被指定为多个空循环(请参阅
tickTime
选项以 了解更多详细信息)。 syncLimit
-
跟随者的时间长度可能位于领导后面。时间被指定为多个空循环(请参阅
tickTime
选项以 了解更多详细信息)。 reconfigEnabled
- 启用或禁用动态重新配置。必须启用才能向 ZooKeeper 集群添加或删除服务器。
standaloneEnabled
- 启用或禁用独立模式,其中 ZooKeeper 使用一个服务器运行。
除了上面的选项外,每个配置文件还应包含应该是 ZooKeeper 集群成员的服务器列表。服务器记录应该以 server.id=hostname:port1:port2
格式指定,其中:
id
- ZooKeeper 集群节点的 ID。
hostname
- 节点侦听连接的主机名或 IP 地址。
port1
- 用于集群内通信的端口号。
port2
- 用于领导选举机制的端口号。
以下是具有三个节点的 ZooKeeper 集群示例配置文件:
要使用四个字母词语命令,在 zookeeper.properties
中指定 4lw.commands.whitelist=*
。
myid
文件
必须为 ZooKeeper 集群中的每个节点分配一个唯一 ID
。每个节点的 ID
必须在 myid
文件中配置,并存储在 dataDir
文件夹中,如 /var/lib/zookeeper/
。myid
文件应该只包含一个带有写入 ID
的行作为文本。ID
可以是 1 到 255 的任何整数。您必须在每个节点上手动创建此文件。使用此文件时,每个 ZooKeeper 实例将使用来自对应 server.
行的配置,以配置其监听程序。它还将使用所有其他 server。
行来标识其他群集成员。
在上例中,有三个节点,因此每个节点都有一个不同的 myid
,值分别为 1
、2
、3
。
5.3.3. 身份验证 复制链接链接已复制到粘贴板!
默认情况下,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; };
ContextName {
param1
param2;
};
SASL 身份验证为服务器到服务器通信(实例 ZooKeeper 实例之间的沟通)和客户端到服务器通信( Kafka 和 ZooKeeper 之间相互通信)单独配置。server-to-server 身份验证只与带有多个节点的 ZooKeeper 集群相关。
服务器到服务器验证
对于 server-to-server 身份验证,JAAS 配置文件包含两个部分:
- 服务器配置
- 客户端配置
当使用 DIGEST-MD5 SASL 机制时,使用 QuorumServer
上下文来配置身份验证服务器。它必须包含所有用户名,以允许以未加密的形式与其密码连接。必须为内置于 ZooKeep er 的客户端配置第二上下文 Quorum
Scientificer。它还包含未加密的格式的密码。以下列出了 DIGEST-MD5 机制的 JAAS 配置文件示例:
除了 JAAS 配置文件外,还必须通过指定以下选项在常规 ZooKeeper 配置文件中启用 server-to-server 身份验证:
使用 KAFKA_OPTS
环境变量将 JAAS 配置文件传递给 ZooKeeper 服务器作为 Java 属性:
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
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
有关 server-to-server 验证的更多信息,请参阅 ZooKeeper wiki。
客户端到服务器验证
客户端到服务器身份验证配置在与服务器到服务器身份验证相同的 JAAS 文件中。但是,与服务器到服务器身份验证不同,它只包含服务器配置。配置的客户端部分必须在客户端中进行。有关如何配置 Kafka 代理以使用身份验证连接到 ZooKeeper 的信息,请参阅 Kafka 安装 部分。
将服务器上下文添加到 JAAS 配置文件中,以配置客户端到服务器身份验证。对于 DIGEST-MD5 机制,它会配置所有用户名和密码:
在配置 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
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
您必须为每个属于 ZooKeeper 集群的服务器添加 authProvider. <ID
> 属性。
使用 KAFKA_OPTS
环境变量将 JAAS 配置文件传递给 ZooKeeper 服务器作为 Java 属性:
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
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
有关在 Kafka 代理中配置 ZooKeeper 验证的详情,请参考 第 5.4.5 节 “zookeeper 身份验证”。
5.3.3.2. 使用 DIGEST-MD5 启用服务器到服务器验证 复制链接链接已复制到粘贴板!
这个步骤描述了如何在 ZooKeeper 集群节点间使用 SASL DIGEST-MD5 机制启用验证。
先决条件
- 在主机上安装了 AMQ Streams
- zookeeper 集群 配置有 多个节点。
启用 SASL DIGEST-MD5 身份验证
在所有 ZooKeeper 节点上,创建或编辑
/opt/kafka/config/zookeeper-jaas.conf
JAAS 配置文件并添加以下上下文:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 JAAS 上下文中,用户名和密码必须相同。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 ZooKeeper 节点上,编辑
/opt/kafka/config/zookeeper.properties
ZooKeeper 配置文件并设置以下选项:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 逐一重启所有 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
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 Copied! Toggle word wrap Toggle overflow
5.3.3.3. 使用 DIGEST-MD5 启用客户端到服务器验证 复制链接链接已复制到粘贴板!
这个步骤描述了如何在 ZooKeeper 客户端和 ZooKeeper 间使用 SASL DIGEST-MD5 机制启用身份验证。
先决条件
- 在主机上安装了 AMQ Streams
- zookeeper 集群 配置并运行。
启用 SASL DIGEST-MD5 身份验证
在所有 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>"; };
Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_super="<SuperUserPassword>" user<Username1>_="<Password1>" user<USername2>_="<Password2>"; };
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 超级用户
会自动具有管理员 priviledges。该文件可以包含多个用户,但 Kafka 代理只需要一个其他用户。Kafka 用户的建议名称为kafka
。以下示例显示了客户端到
服务器
身份验证的服务器上下文:Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_super="123456" user_kafka="123456"; };
Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_super="123456" user_kafka="123456"; };
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 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
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 Copied! Toggle word wrap Toggle overflow 必须为作为 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
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 Copied! Toggle word wrap Toggle overflow 逐一重启所有 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
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 Copied! Toggle word wrap Toggle overflow
5.3.4. 授权 复制链接链接已复制到粘贴板!
zookeeper 支持访问控制列表(ACL)来保护存储在其中的数据。Kafka 代理可以自动为他们创建的所有 ZooKeeper 记录配置 ACL 权限,因此没有其他 ZooKeeper 用户都可以修改它们。
有关在 Kafka 代理中启用 ZooKeeper ACL 的详情,请参考 第 5.4.7 节 “zookeeper 授权”。
5.3.5. TLS 复制链接链接已复制到粘贴板!
zookeeper 支持 TLS 加密或身份验证。
5.3.6. 其他配置选项 复制链接链接已复制到粘贴板!
您可以根据您的用例设置以下额外的 ZooKeeper 配置选项:
maxClientCnxns
- 到 ZooKeeper 集群单一成员的最大并发客户端连接数。
autopurge.snapRetainCount
-
ZooKeeper 的内存数据库的快照数量将被保留。默认值为
3
。 autopurge.purgeInterval
-
清除快照的时间间隔(以小时为单位)。默认值为
0,
这个选项被禁用。
所有可用的配置选项都可以在 ZooKeeper 文档中找到。
5.3.7. 日志记录 复制链接链接已复制到粘贴板!
zookeeper 使用 log4j 作为其日志记录基础架构。日志配置默认从 log4j.properties
配置文件读取,该文件应放在 /opt/kafka/config/
目录中或 classpath 中。可使用 Java 属性 log4j.configuration
更改配置文件的位置和名称,该配置可使用 KAFKA_LOG4J_OPTS
环境变量传递给 ZooKeeper:
su - kafka export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:/my/path/to/log4j.properties"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
su - kafka
export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:/my/path/to/log4j.properties"; /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
有关 Log4j 配置的更多信息,请参阅 Log4j 文档。