Apache Kafka中Zookeeper的角色

1. 引言

在本章中,我们将学习KafkaZooKeeper的整个概念,以及为什么在Kafka需要ZooKeeperZooKeeperApache Kafka不可分割的一部分,因此我们首先了解一下什么是Apache ZooKeeper。此外,我们将详细介绍ZooKeeper 产品部署的过程。然后,我们将讨论Apache Kafka如何与ZooKeeper对话。另外,我们还会介绍ZooKeeper的硬件和配置。最后,我们将研究ZooKeeper的稳定版本和监控。

2. 什么是Zookeeper

ZooKeeper是一种集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务。 所有这些类型的服务都被分布式应用程序以某种形式使用,每次实施这些服务都需要做很多工作来修复不可避免的错误和竞争条件,由于难以实现这些类型的服务,应用程序最初通常会简化它们,这使得它们在变化的情况下变得脆弱并且难以管理,即使正确完成,这些服务的不同实现也会在部署应用程序时导致管理复杂性。

ZooKeeper旨在将这些不同服务的本质提炼为一个非常简单的集中协调服务接口。 服务本身是分布式且高度可靠的。一致性(Consensus),组管理(Group Management)和状态协议(Presence Protocols)将由服务实现,以便应用程序不需要自己实现它们。 这些应用程序的特定用途将由Zoo Keeper的特定组件和特定于应用程序的约定组成。

ZooKeeper在系统架构中扮演着非常重要的角色,因为它为很多公开的大数据工具(如Apache SparkApache Kafka)在底层做协调工作。

3. ZookeeperKafka中的职责

ZooKeeper存储了很多关于Kafka 消费者和Kafka 代理的共享信息。下面我们来具体了解一下: 

a. Kafka代理 

i. 状态(State 

Zookeeper确定代理的状态,也就是说,如果一个Kafka代理还在工作,那么它总是会定期发送心跳请求。此外,虽然代理是处理复制的约束,但它必须能够满足复制的需求。 

ii. 限额(Quotas

生产者和消费者可能生成/消费非常大量的数据或以非常高的速率生成请求,从而垄断代理资源,导致网络饱和,并且通常产生DOS(Denial of Service)问题。设定限额可以防止这些问题,并且在大型多节点集群中更为重要,因为其中一小部分行为不端的客户端会降低用户体验的性能。 

可以为(用户,客户端ID)对,用户和客户端ID组定义限额配置。我们可以自定义值来覆盖默认限额的设置,类似于主题的日志配置覆盖。对用户和(用户,客户端ID)对的限额设置将写入/config/users下的ZooKeeper设置中,而对客户端ID的限额设置将写入/config/clients。所有代理都会读取这些被覆盖的值,并立即生效,这使我们可以在不必对整个集群进行重启的情况下更改限额。我们也可以在bin/kafka-configs.sh脚本中更改限额设置。

iii. 副本(Replicas 

对于每个主题,Zookeeper都保留一组同步副本(ISR)。此外,如果某种方式先前选择的领导者失败,那ZooKeeper将在当前活动节点的中选择新的领导者。

iv. 节点和主题注册 

Zookeeper会存储节点和主题的注册信息。我们可以找到Kafka中所有可用的代理,更确切地说,能知道每个代理上拥有哪些Kafka主题。节点信息存储在/broker/ids里,主题信息存储在/brokers/topics里。此外,当一个Kafka代理启动时,它会自动注册自己。

b. Kafka消费者 

i. 偏移量

Kafka0.9.1版本中,ZooKeeper是消费者偏移量的默认存储引擎,有关每个消费者处理消息的所有信息都存储在ZooKeeper中。

ii. 注册

Kafka 代理一样,消费者也有自己的注册表。同样的规则适用于消费者,即,一旦消费者关闭,注册信息就会被销毁,并且消费者会自动进行注册。

iii. 分区注册

与消费者相关的另一个注册表是关于分区所有权。由于每个分区仅由属于特定消费者组的一个消费者使用,因此Kafka必须知道分区和使用者之间的所有权关系,并且此信息作为由${brokerId}-${partitionId}模式调用的zNode存储在/consumers/${groupId}/owners/${topic}路径下的ZK中。和消费者注册表一样,这个注册信息也是短暂的。

可以看出,ZooKeeper主要用于保证Kafka工作流程中所有参与者之间的同步消费者和经纪人。

4. Kafka如何与Zookeeper对话

代表Kafka服务器的Scala类是KafkaServer。它的startup()方法包含对初始化ZooKeeper连接的方法 – initZk() 的调用。initZk()方法中使用的算法由几个步骤组成,首先,它检查是否配置了不同于“/”chroot,如果是这种情况,该方法将创建与ZK的临时连接,此临时会话负责创建与chroot相对应的zNode(如果不存在),然后,此临时连接将关闭,并且将创建服务器持有的最终连接。

之后,仍然在initZk()内部,Kafka初始化服务器使用的所有持久性zNode。我们可以在那里得到:/consumer/broker/ids/broker/topic/config/admin/delete_topics/broker/seqid/isr_change_notification/config/topics/config/clients

这个创建的ZooKeeper实例接下来同步初始化其他成员:副本管理器(replica manager),配置管理器(config manager),协调器(coordinator)和控制器(controller)。

先前描述的消费者短暂节点是在ZookeeperConsumerConnector类中创建的。我们可以通过这个类获取注册到ZK的消费者,与分区分配相关的操作以及已消费消息偏移量的管理等。

5. Zookeeper产品部署

1). 稳定版本

当前稳定的Zookeeper版本是3.4,不过最新的版本是3.5.4.beta.

2). 硬件

a. 内存

确保在典型的生产用例中,ZooKeeper应该至少使用8 GBRAM

b. CPU

ZooKeeper存储不会大量消耗CPU资源,而且它还提供延迟敏感功能。这意味着我们必须考虑为Zookeeper提供一个专用的CPU内核,以确保如果它必须与其他进程竞争CPU的时候,上下文切换不会出现问题。

c. 硬盘

为了维护健康的ZooKeeper集群,磁盘性能非常重要。为了获得最佳性能,我们建议使用固态硬盘(SSD),因为ZooKeeper需要低延迟磁盘写入。

3). JVM

我们建议使用1 GB的堆大小来阻止由于垃圾回收而导致的延迟。

4). 重要设置

a. clientPort

代理通过这个端口连接到ZooKeeper,通常设置为2181

b. dataDir

它是我们存储ZooKeeper数据的目录,最好设置为一个专用的SSD磁盘。

c. tickTime

对于ZooKeeper,时间单位转换为毫秒。tickTime管理所有ZooKeeper时间相关的操作,特别是心跳和超时。它的默认值是200毫秒。

注意:最小的会话超时时间为2ticks

d. maxClientCnxns

它是ZooKeeper服务器允许的最大客户端连接数。将此值设置为0(无限制),以避免耗尽连接。

e. autopurge.snapRetainCount

启用后,ZooKeeper自动清除功能会分别在dataDirdataLogDir中保留数量为该值的最新快照和相应的事务日志,并删除其余的快照和日志。默认为3.最小值为3

f. autopurge.purgeInterval

必须触发清除任务的时间间隔(以小时为单位)。设置为正整数(1和更高)以启用自动清除。默认为0

6. 监控Zookeeper

为了确保服务器正常运行并主动发现问题,我们需要监控ZooKeeper服务器。监控的最佳做法是:

a. 操作系统

ZooKeeper服务开始变得困难时,底层操作系统指标可以帮助找到问题。我们应该监控:

i. 打开文件的句柄数量

监控打开文件的句柄数量的操作应该在系统范围内,为运行Zookeeper进程的用户来进行。

ii. 网络带宽使用率

ZooKeeper对网络延迟引起的超时很敏感,因为它要时时跟踪状态。如果网络带宽以某种方式饱和,那么可能造成客户端会话的超时,然后就会导致Kafka群集不太可靠。

b. 四字母词

ZooKeeper只响应一组命令,每一个命令都是四个字母。要运行这样的命令,我们必须将消息(通过netcattelnet)发送到ZooKeeper的客户端端口。例如echo stat | nc localhost 2181会将STAT命令的输出返回给stdout

c. JMX监控

以下是重要的JMX指标:

NumAliveConnections 
OutstandingRequests 
AvgRequestLatency 
MaxRequestLatency 
HeapMemoryUsage (Java内置)

Kafka通过SessionExpireListener来跟踪以下列举的ZooKeeper事件的数量,这是为了确保ZooKeeperKafka交互的健康: 

ZooKeeperAuthFailuresPerSec (仅限安全环境)
ZooKeeperDisconnectsPerSec
ZooKeeperExpiresPerSec
ZooKeeperReadOnlyConnectsPerSec
ZooKeeperSaslAuthenticationsPerSec (仅限安全环境)
ZooKeeperSyncConnectsPerSec

7. 搭建多节点的Zookeeper 

ZooKeeper服务器在实际生产环境中部署在多个节点上,这就是我们所说的ensemble 基本上,一个ensemble是一组2n+1ZooKeeper服务器,其中n指的是任何大于0的数字。奇数个服务器允许ZooKeeper选举领导者时执行多数选举(majority elections)。 ensemble中最多可以有n个失败的服务器,ZooKeeper集群将保持正常工作。

8. 部署之后

部署之后ZooKeeper集群不需要太多维护就可以运行的很好。

Apache Kafka中Zookeeper的角色

发表评论

邮箱地址不会被公开。 必填项已用*标注

40 ÷ 四十 =

滚动到顶部