zookeeper 在 kafka 中的作用
转自知乎
zookeeper 在分布式集群中的作用
数据发布与订阅(配置中心)
发布与订阅模型,即配置中心,也就是讲发布者将数据发布到 zookeeper 节点上,供订阅者动态获取数据,实现配置的集中式管理和动态更新。
例如全局的配置信息,服务框架的地址列表。
负载均衡
软件负载均衡,最典型的是消息中间件的生产,消费者负载均衡
命名服务(Naming Service)
常见的是发布者将自己的地址列表写到 zookeeper 的节点,然后订阅者可以从固定名称的节点获取地址列表,链接到发布者进行相关通信
分布式通知/协调
这个利用的是 zookeeper 的 watch 注册和异步通知机制,能够很好的实现分布式环境中不同系统间的通知与协调,实现对数据变更的实时处理
集群管理与 Master 选举
集群管理与 Master 选举
分布式锁
分布式锁,这个主要得益于 zookeeper 数据的强一致性,利用的是临时节点。锁服务分为两类,一个是独占锁,另一个是控制时序
独占,是指所有的客户端都来获取这把锁,最终只有一个能获取到,用的是临时节点
控制时序,所有来获取锁的客户端,都会被安排得到锁,只不过要有个顺序,实际上是某个节点下的临时顺序子节点来实现的
分布式队列
一种是 FIFO, 这个就是使用临时顺序节点实现的,和分布式锁服务控制时序一样。
第二种是等待队列的成员聚齐之后的才能同意按序进行。实际上,是在队列的节点里首先创建一个 /queue/num 节点,并且赋值队列的大小。这样我们可以通过监控队列节点子节点的变动来感知队列是否已满或者条件已经满足执行的需要。这种,应用场景是有条件执行的任务,条件齐备了之后任务才能执行。
kafka 使用 zookeeper 实现的服务类型
配置管理
Topic 的配置之所以能动态更新就是基于 zookeeper 做了一个动态全局配置管理
负载均衡
基于 zookeeper 的消费者,实现了该特性,动态的感知分区变动,将负载使用既定策略分不到消费者身上
命名服务
Broker 将 advertised.port 和 advertised.host.name, 这两个配置发布到 zookeeper 上的 zookeeper 的节点上 /brokers/ids/BrokerId(broker.id), 这个是供生产者,消费者,其它 Broker 跟其建立连接用户的。
分布式通知
比如分区增加,topic 变动,Broker 上线下线等均是基于 zookeeper 来实现的分布式通知
集群管理和 master 选举
可以通过命令行,对 kafka 集群上的 topic partition 分布,进行迁移管理,也可以对 partition leader 选举进行干预
Master 选举,要说有也是违反常规,常规的 master 选举,是基于临时顺序节点来实现的,序列号最小的作为 master. 而 kafka 的 Controller 的选举是基于临时节点来实现的,临时节点创建成功的成为 Controller, 更像一个独占锁服务.
分布式锁
独占锁,用于 Controller 的选举.