(1) Zookekper及其基本原理

2020-04-02  本文已影响0人  程序男保姆

本文将从以下几点来介绍Zookekper及其基本原理:

Zookeeper项目简介

Apache Zookeeper是由Apache Hadoop子项目发展而来,于2010年11月正式成为了Apache顶级项目。Zookeeper是一个为分布式应用提供高效、可靠的一致性服务的基础服务。

Zookeeper有哪些功能

  1. 配置管理

Zookeeper本身可以当做分布式文件系统使用,服务配置可以以节点目录形式存储于Zookeeper中,相关应用程序对节点目录进行监听,在配置发生变化时,收到通知,并对应用程序做修改
分布式锁
如:N台服务应用需要抢占AccountService中的锁,则所有机器同时在/projectName/AccountService下创建临时顺序节点,节点编号最小的获取锁,节点顺序大的依次监听前面一个节点,待前节点释放删除后重新抢锁,流程图如下

  1. master选举

原理同分布式锁实现中的临时顺序节点实现方案,在同一目录下创建临时节点,节点编号最小的为master

  1. 服务发布/订阅

项目中用到Zookeeper最多的地方可能就是dubbo里的注册中心,就是服务发布/订阅的一个例子。因为zookeeper是一个树形的目录服务,节点信息维护于内存中,支持变更推送(客户端机器与Zk节点维持Tcp长链接,接受变更推送),且稳定性,可用性高,故dubbo默认使用Zk作为注册中心。

简单点说,ZooKeeper = 文件系统 + 通知机制

Zookeeper基本概念

  1. 集群角色

Leader: 集群中所有机器通过Leader选举选定的一台机器即为Leader,提供读和写服务,所有zk事务操作均通过Leader发起,待Follower过半响应Ack后Commit事务确认事务成功
Follower: 提供读服务,参与Leader选举,参与过半写成功策略
Observer: 提供读服务,不参与Leader选举,不参与过半写成功,即Observer只提供读服务,可水平拓展Observer机器来提升Zk集群读性能

  1. 通知机制(Watch)

客户端能够注册监听它所关心的节点信息,待节点信息发生变化(数据被修改、删除、子节点新增删除)时,客户端能够收到通知

  1. 数据节点(Znode)

Zookeeper将所有数据存储于内存中,数据结构是一颗树,由斜杠分割的一个路径,就是一个Znode。Znode包含数据信息以及一系列状态属性信息(如事务id,节点创建时间等),同时节点下还能挂载子节点,整体数据结构与文件系统非常类似。如上述dubbo例子中的/dubbo/com.foo.BarService/providers就是一个Znode。
Znode分为持久节点、临时节点:
持久节点: 一旦Znode被创建,除非手动删除,否则会常驻在Zookeeper内存中
临时节点 : 生命周期与会话绑定,一旦由于网络波动或者是zk服务器宕机导致客户端与zk服务器之间的Tcp长连接断开,都会导致节点被删除

节点的Sequential(有序)特性:Zookeeper允许用户为每个节点添加一个特殊有序属性,添加后,会自动在每个节点创建后在其名称后追加一个由父节点维护的自增数字,该特性导致持久节点和临时节点又可被细分为:

– 持久节点(PERSISTENT)
– 持久顺序节点(PERSISTENT_SEQUENTIAL)
– 临时节点(EPHEMERAL)
– 临时顺序节点(EPHEMERAL_SEQUENTIAL)

其中临时顺序节点在使用zookeeper做分布式锁的实现中有广泛使用,关于zookeeper实现的分布式锁,后续实战文章会做介绍

  1. 什么是Zab协议

Zab协议(全称Zookeeper atomic broadcast协议,即zk原子广播协议),支持崩溃恢复功能。基于该协议,Zookeeper实现了主备(Leader,Follower)模式的系统架构来保持集群中各副本间数据的一致性。

Zab协议的核心在于 消息广播崩溃恢复

  1. Leader选举
    Zookeeper中有2种Leader选举算法,一种基于basic paxos算法,一种基于fast paxos算法,默认选举算法为fast paxos算法。关于选举算法后续文章再做详细介绍,本文不做展开介绍。

  2. 数据同步
    选出新的Leader后,Zookeeper就进入了数据同步过程,流程如下

Leader等待Follower连接
Follower连接Leader,将最大的Zxid发送给Leader
Leader根据Follower的Zxid确定同步点,发送后续Proposal事务同步消息
完成同步后通知Follower 已经成为uptodate状态
Follower收到uptodate消息后,又可以重新接受Client的请求进行服务了

原文链接:https://blog.csdn.net/hosaos/java/article/details/86983713

上一篇 下一篇

猜你喜欢

热点阅读