Zookeeper基本原理

一、简介

Zookeeper 提供了一个分布式协同系统,可以提供命名服务、配置维护、分布式同步等功能。

Zookeeper 的配置中心实现更像一个文件系统,文件系统中的所有文件形成一个树状结构。Zookeeper 维护着树形层次的结构,树中的节点称为 Znode(每个 Znode 存储的数据有小于 1m 的大小限制),Znode 分为临时 Znode、持久 Znode、顺序 node 等几种类型。在 Znode 发生变化时,可以通过观察(watch)机制可以让客户端得到通知。

Zookeeper 采用一种类似 Paxos 的算法实现领导者选举,用于解决集群宕机的一致性和协同保障。CAP原则中(一致性、可用性

、分区容错性),Zookeeper只支持CP,在领导者选举的过程中不可用。

二、Znode

路径

Znode 被它所在的路径唯一标识,例如 /NameService/Server1。

子节点目录

Znode 可以有子节点目录,并且每个 Znode 可以存储数据(临时节点不能有子节点目录

版本

Znode 是有版本的,每个 Znode 中存储的数据可以有多个版本,因此一个访问路径中可以存储多份数据

临时节点

一旦创建这个 Znode 的客户端与服务器失去联系(长连接断开),临时Znode 也将自动删除

watch

在 Znode 发生变化时,通过观察(watch)机制可以让客户端得到通知。

三、zookeeper使用场景

数据发布、订阅

可以用来作为配置中心,每次修改参数就不需要进行重启,通过watch机制,完成数据推送更新。zookeeper服务也会保证同步操作原子性(要么成功同步成功,要么失败),确保每个服务器的配置文件都能被正确的更新。

统一命名服务

主要的应用场景在于rpc服务,比如dubbo等框架,可以将相应的服务注册在zookeeper上。

如果某台服务器坏掉了,可以把坏掉的服务器从zookeeper中删除,让故障服务器退出整个集群的运行,而这一切的操作又不会由故障的服务器来操作,而是集群里正常的服务器来完成。

集群管理

Zookeeper 能够很容易的实现集群管理的功能,将分布式协调的职责能从应用中分离出来,达到减少系统间的耦合性,提高系统的可扩展性。

在 Zookeeper 上创建一个 EPHEMERAL 类型的目录节点,每个 Server 在它们创建目录节点的父目录节点上调用getChildren(String path, boolean watch) 方法并设置 watch 为true,由于是 EPHEMERAL 目录节点,当创建它的 Server 死去,这个目录节点也随之被删除,所以Children 将会变化,这时 getChildren上的 Watch 将会被调用,其它 Server 就知道已经有某台Server 死去了。

Leader Election

Zookeeper提供Leader Election功能,可以为集群选出一个master。

每台 Server 创建一个EPHEMERAL_SEQUENTIAL 目录节点,然后给每台 Server 编号,我们可以选择当前是最小编号的 Server 为 Master,假如这个最小编号的 Server 死去,由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。

分布式锁

创建一个EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁。

分布式队列

FIFO 队列:先进先出队列,例如实现生产者和消费者模型。

在特定的目录下创建 SEQUENTIAL 类型的子目录 /queue_i,这样就能保证所有成员加入队列时都是有编号的,出队列时通过 getChildren( ) 方法可以返回当前所有的队列中的元素,然后消费其中最小的一个,这样就能保证 FIFO。

同步队列:将队列元素都集聚之后才进行统一的执行安排,否则只能等待

创建一个父目录 /queue,每个成员都监控目录 /queue/begin 是否存在,然后每个成员都创建 /queue/member_i 的临时目录节点,如果/ queue 目录下节点数等于成员的个数,就创建/queue/begin,成员监控到/queue/begin开始执行。

四、zookeeper的局限

1)选举过程速度慢

2)性能是有限的 

3)无法进行有效的权限控制

4)Zookeeper不能保证跨session的强一致性

5)每个 Znode 存储的数据有小于 1m 的大小限制

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值