基于Centos7的Zookeeper分布式协调服务

Zookeeper架构原理

Zookeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务。它首先提供了分布式锁服务,由于Zookeeper是开源的,后来者在分布式锁的基础上有提供了配置维护、组服务、分布式消息队列、分布式通知/协调等。Zookeeper就是封装好复杂的易出错的关键服务,将简单的接口和性能高效、功能稳定的系统提供给用户。

Zookeeper的特点

  • 最终一致性

    client无论连接到哪个server,展示给它的都是同一视图,这是Zookeeper最重要的性能。

  • 可靠性

    具有简单、健壮、良好的性能,如果消息被一台服务器接受,那么它将被所有的服务器接受。

  • 实时性

    Zookeeper保证客户端将在一个时间间隔范围内,获得服务器的更新信息或服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读取之前调用sync()接口。

  • 等待无关性

    慢的或者失效的客户端不得干预快速的client请求,这使得每个client都能有效的等待。

  • 原子性

    更新要么成功,要么失效,没有中间状态

  • 顺序性

    对于所有的server,同一消息发布顺序一致。它包括全局有序和偏序两种。

    1.全局有序是指如果一台服务器上消息a在消息b前发布,则在所有server上消息a都将在消息b前被发布

    2.偏序是指如果一个消息b在消息a后被同一个发布者发布,a必将排在b前面

基本架构

Zookeeper是一个由多个server组成的集群,该集群有一个Leader,多个Follower。客户端可以连接任意Zookeeper服务器节点来读写数据

在这里插入图片描述

Zookeeper集群中每一个server都保存一份数据副本。

Zookeeper使用简单的同步策略,通过下面的两条基本保证来实现数据的一致性:

1.全局串行化所有的写操作。

2.保证同一客户端的指令被FIFO执行以及消息通知的FIFO。所有的读请求由Zookeeper Server本地响应。所有的更新请求将转发给Leader,由Leader实施。

Zookeeper通过复制来实现高可用性,只要Zookeeper集群中半数以上的机器处于可用状态,它就能提供服务。例如在一个5个节点的Zookeeper集群中,每个Follower节点的数据都是Leader节点数据的副本,每一个节点的数据视图都一样节点提供Zookeeper服务。并且Zookeeper集群中任意2台机器出现故障,都可以保证Zookeeper仍然对外提供服务,因为剩下的3台机器超过了半数。

Zookeeper会确保对Znode树的每个修改都会被复制到超过半数的机器上。如果少于半数的机器出现故障,则最少有一台机器会保存最新的状态,那么这台机器就是Leader,其余大副本也会更新到这个状态。如果Leader宕掉了,由于其他机器保存了Leader副本,那就可以从中选出一台机器作为新的Leader继续提供服务器。

状态角色

在这里插入图片描述

Zookeeper为什么引入ObServer呢?Zookeeper权衡了伸缩性和高吞吐率从而引入了ObServer角色。

1.ObServer不参与投票过程,只同步Leader状态。

2.ObServer接收客户端的连接,并将写请求转发给leader节点。这样Leader和其他Follower节点接受客户端的连接就少了,这样就不会因为高并发负载过高而宕掉,ObServer可以分摊一部分访问压力。

3.当加入更多的ObServer节点后,它可提高整个Zookeeper系统服务的伸缩性,同时还不影响吞吐率。ObServer这个角色可以单独配置。

读写流程

在这里插入图片描述

Zookeeper写数据流程

1.Server1接收客户端(client)发送过来的写请求。

2.如果Server1不是Leader,那么Server1会将接收到的请求进一步转发给Leader。Leader然后将写请求广播给各个Server,例如Server1和Server2。然后每个server开始写数据,每个Server写成功后就会通知Leader。

3.当Leader收到大多数Server数据写成功的通知后,那么就说明数据写成功了。

4.Sever1会进一步通知Client数据写成功了,此时整个数据写流程完成。

5.数据写成功后,其他节点同步更新后的数据。

Zookeeper读数据流程

读请求由每台Server数据库的本地进行服务。为了提高读取性能,Zookeeper集群中每个服务节点都是将数据全量存储在内存中。Zookeeper最适于读多写少且轻量级数据的应用场景。数据仅存储于内存中是很不安全的,Zookeeper采用事务日志文件及快照文件的方案来落盘数据,保障数据在丢失的情况下能够快速恢复。

服务

Zookeeper提供很多服务,比如分布式锁、分布式队列、分布式通知与协调等服务。具体实现是通过下面几部分实现:

数据结构-Znode

2.原语:数据结构的基础上定义的一些原语,也就是该数据结构的一些操作。

3.通知机制-watch:可以通过通知机制,将消息以及网络形式发送给分布式应用程序。

Zookeeper主要通过数据结构+原语+watch机制这几部分共同来实现相关服务。

Znode

Zookeeper维护着一个树形层次结构,树中的节点被称为Znode,每个节点可以拥有子节点
在这里插入图片描述

Zookeeper树中的znode兼并文件和目录双重特点,每个znode有三部分组成。

1)stat:状态信息,描述该Znode的版本、权限等信息

2)data:与该Znode相关的数据

3)children:该Znode下的子节点

Znode有两种类型:短暂节点和持久类型。Znode的类型在创建是确定并且之后不能在修改。

1)短暂节点(临时节点):在创建短暂znode的客户端会话结束时,Zookeeper会将该短暂znode删除。虽然每个znode都会被绑定到一个客户端会话,但他们对所有的客户端还是可见的。短暂znode不可以有子节点,即使是短暂子节点。

2)持久节点:持久znode不依赖与客户端会话,只有当客户端明确要删除该持久znode时才会被删除。

Watcher

Zookeeper可以在读操作,获取子节点以及获取数据上设置观察。这些观察可以被写操作,删除操作,修改操作触发。当一个观察被触发时会产生一个观察事件,这个观察和触发它的操作共同决定了观察事件的类型。

Zookeeper所管理的watch可以分为两类:

1)数据watch:getData和exists负责设置数据watch,返回关于节点的数据信息。

2)子节点watch:getChildren负责设置子节点watch,返回子节点列表。

Zookeeper在大数据生态圈的位置

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值