科技之感|为什么Kafka依赖ZooKeeper?

一、ZooKeeper简介
1.基本介绍
ZooKeeper的官网是:https://zookeeper.apache.org/ 。 在官网上是这么介绍ZooKeeper的:ZooKeeper是一项集中式服务 , 用于维护配置信息 , 命名 , 提供分布式同步和提供组服务 。
当我们编写程序的时候 , 通常会将所有的配置信息保存在一个配置文件中 , 例如账号、密码等信息 , 后续直接修改配置文件就行了 , 那分布式场景下如何配置呢?如果说每台机器上都保存一个配置文件 , 这时候要一台台的去修改配置文件难免出错 , 而且要管理这些机器也会变得复杂和困难 , ZooKeeper的出现就是为了解决这类问题 , 实现高度可靠的分布式系统 。
2.基本功能
1)配置管理
ZooKeeper为分布式系统提供了一种配置管理的服务:集中管理配置 , 即将全局配置信息保存在ZooKeeper服务中 , 方便进行修改和管理 , 省去了手动拷贝配置的过程 , 同时还保证了可靠和一致性 。
科技之感|为什么Kafka依赖ZooKeeper?
文章图片
2)命名服务
在分布式系统中 , 经常需要对应用或者服务进行统一命名 , 便于识别和区分开来 , 而ZooKeeper就提供了这种服务 。
3)分布式锁
锁应该都不陌生 , 没有用过也听说过 , 在多个进程访问互斥资源的时候 , 需要加上一道锁 。 在分布式系统中 , 分布式程序分布在各个主机上的进程对互斥资源进行访问时也需要加锁 。
分布式锁应当具备以下条件:
在分布式系统环境下 , 一个方法在同一时间只能被一个机器的一个线程执行;高可用的获取锁与释放锁;高性能的获取锁与释放锁;具备可重入特性(可理解为重新进入 , 由多于一个任务并发使用 , 而不必担心数据错误);具备锁失效机制 , 防止死锁;具备非阻塞锁特性 , 即没有获取到锁将直接返回获取锁失败 。4)集群管理
在分布式系统中 , 由于各种各样的原因 , 例如机器故障、网络故障等 , 导致集群中的节点增加或者减少 , 集群中有些机器需要感知到这种变化 , 然后根据这种变化做出对应的决策 。
3.基本架构
ZooKeeper的基本架构图如下:
科技之感|为什么Kafka依赖ZooKeeper?
文章图片
我们需要知道以下几点:
Client表示客户端 , 是请求发送方 , 数量不限;Server表示服务端 , 是请求接收方 , 数量不限;Client可以连接到每个Server , 每个Server中的数据都是一样的;ZooKeeper启动时 , 会从所有Server中选取一个作为leader(Paxos协议) , 每个follower都会和leader建立连接;leader负责进行数据更新等操作 , 并将数据同步到follower中 , 以此实现数据一致性 。4.ZooKeeper节点
我们使用znode来明确表示ZooKeeper的数据节点 。 下图表示的是ZooKeeper的命名层次空间 , 名称是由斜杠(/)分隔的一系列路径元素 。
科技之感|为什么Kafka依赖ZooKeeper?
文章图片
znode有四种类型:
1)PERSISTENT(持久节点)
默认的节点类型 。 持久化保存的节点 , 创建节点的客户端与ZooKeeper断开连接后 , 该节点依旧存在 。
2)PERSISTENT_SEQUENTIAL(持久顺序节点)
【科技之感|为什么Kafka依赖ZooKeeper?】所谓顺序节点 , 就是在创建节点时 , ZooKeeper根据创建的时间顺序给该节点名称进行编号 , 适合用于分布式锁、分布式选举等场景 。 创建时添加-s参数即可 。
3)EPHEMERAL(临时节点)
和持久节点相反 , 当创建节点的客户端与ZooKeeper断开连接后 , 临时节点会自动删除 , 适用于心跳、服务发现等场景 。 创建时添加参数-e即可 。
4)EPHEMERAL_SEQUENTIAL(临时顺序节点)