编程学习kafkaJava

Kafka 中Zookpeer 的作用-原理与实战

2017-01-07  本文已影响3052人  沪上最强亚巴顿

场景

最近, 运维部门的同事碰到一个问题, 向Kafka 中 某个Topic 发送消息总是失败. 调查下来发现, Zookeeper 中记录的该Topic 的Partition Leader 是一个非法的Broker. 也就是说Zookeeper 中, 记录了错误的Kafka 信息.

重启Kafka 和Zookeeper 后, 该问题得到了解决.

在本篇文章中, 会对Kafka 中Zookeer 的具体作用做一个深入的剖析, 包括理论和实战部分.

理论

概览

Zookeeper 主要用来跟踪Kafka 集群中的节点状态, 以及Kafka Topic, message 等等其他信息. 同时, Kafka 依赖于Zookeeper, 没有Zookeeper 是不能运行起来Kafka 的.

再谈Zookeeper

Zookeeper 向客户端提供了对一种数据结构访问的服务. 该数据结构类似于Unix 文件系统, 可以认为是数据数或者有继承层次的命名空间.

数据结构的路径使用Unix 惯例. 例如/A/B/C 用来表示节点C 的路径, 其中, 节点C 的父节点是节点B, 节点B 的父节点是节点A.

客户端通过Zookeeper 可对该数据结构进行CRUD 操作.

与Unix 的文件系统不同的是, Zookeeper 中的节点分为永久节点和临时节点, 同时, Zookeeper 中的节点是不能重命名的.

除此之外, Zookeeper 提供了节点add/remove 的watch 功能, 用来在节点更新时获得通知.

实践

环境搭建

初探Zookeeper 目录结构

在ZK 的监视端, 运行ls / , 可以列出所有的顶级节点, 主要包含以下的节点:

通过字面意思能够理解其记录的内容. 需要说明的是isr_change_notification 节点. 在Kafka 中, Leader 和Follower 的数据同步遵循的是"最终一致"原则, 也就是数据同步会有延迟, 但保证最终数据的一致性. isr 是'in-sync' replicas 的缩写, 代表的是与Leader 数据已经通过过的replica, 它会作为重选Leader 时作为判断依据.

运行ls /brokers/ids 命令, 可以看到输出了[0, 1, 2] , 代表了集群中现有的3台Broker.

创建Topic

关闭Leader

关闭Zookeeper

额外发现

离开了Zookeeper, Kafka 不能对Topic 进行新增操作, 但是仍然可以produce 和consume 消息.

PS: 在运行过程中, 如果先关闭掉了Zookeeper, 然后再去关闭Kafka, 会发现Kafka 后台一直结束不掉, 这是因为Kafka 会被block 在与Zookeeper 的重连过程中. 解决方法是重启Zookeeper , 然后先关闭Kafka 再关闭Zookeeper.

PPS: 如果想了解Zookeeper 和Kafka 的其它技术细节, 可以移步我的系列文章[Zookeeper 与Kafka].

上一篇下一篇

猜你喜欢

热点阅读