Zookeeper 理论基础

简介

ZooKeeper 由雅虎研究院开发,后来捐赠给了 Apache。ZooKeeper 是一个开源的分布式应用程序协调服务器,其为分布式系统提供一致性服务。其一致性是通过基于 Paxos 算法的ZAB 协议完成的。其主要功能包括:配置维护、域名服务、分布式同步、集群管理等。

zookeeper 的官网: http://zookeeper.apache.org

一致性

  • 顺序一致性:zk 接收到的 N 多个事务请求(写操作请求),其会被严格按照接收顺序应用到 zk 中。
  • 原子性:所有事务请求的结果在 zk 集群中每一台主机上的应用情况都是一致的。要么全部应用成功,要么全部失败。
  • 单一视图:无论 Client 连接的是 zk 集群中的哪个主机,其看到的数据模型都是一致的。
  • 可靠性:一旦 zk 成功应用了某事务,那么该事务所引发的 zk 状态变更会被一直保留下来,直到另一个事务将其修改。
  • 最终一致性:一旦一个事务被成功应用,zk 可以保证在一个很短暂时间后,Client 最终能够从 zk 上读取到最新的数据状态。注意,不能保证实时读取到。

ZAB 协议简介

ZAB ,Zookeeper Atomic Broadcast,zk 原子消息广播协议,是专为 ZooKeeper 设计的一种支持崩溃恢复的原子广播协议,在 Zookeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性。

Zookeeper 使用一个单一主进程来接收并处理客户端的所有事务请求,即写请求。当服务器数据的状态发生变更后,集群采用 ZAB 原子广播协议,以事务提案 Proposal 的形式广播到所有的副本进程上。ZAB 协议能够保证一个全局的变更序列,即可以为每一个事务分配一个全局的递增编号 xid。当 Zookeeper 客户端连接到 Zookeeper 集群的一个节点后,若客户端提交的是读请求,那么当前节点就直接根据自己保存的数据对其进行响应;如果是写请求且当前节点不Leader,那么节点就会将该写请求转发给 Leader,Leader 会以提案的方式广播该写操作,只要有超过半数节点同意该写操作,则该写操作请求就会被提交。然后 Leader 会再次广播给所有订阅者,即 Learner,通知它们同步数据。

ZAB 协议是 Paxos 算法的一种工业实现算法。但两者的设计目标不太一样。ZAB 协议主要用于构建一个高可用的分布式数据主从系统,即 Follower 是 Leader 的从机,Leader 挂了,马上就可以选举出一个新的 Leader,但平时它们都对外提供服务。而 Fast Paxos 算法则是用于构建一个分布式一致性状态机系统,确保系统中各个节点的状态都是一致的。

ZK的三类角色

为了避免 Zookeeper 的单点问题,zk 也是以集群的形式出现的。zk 集群中的角色主要有以下三类:

  • Leader:zk 集群中事务请求的唯一处理者;其也可以处理读请求。
  • Follower:处理读请求;将事务请求转发给 Leader;对 Leader 发起的提案进行表决;同Leader 的事务处理结果;在 Leader 的选举过程中具有选举权与被选举权
  • Observer:不具有表决权,且在 Leader 选举过程中没有选举权与被选举权的 Follower。

Learner:学习者,同步者。Learner = Follower + Observer

ZK三个重要数据

在 ZAB 中有三个很重要的数据:

  • zxid:64 位长度的 Long 类型,其高 32 位为 epoch,低 32 位为 xid。
  • epoch:每一个新的 Leader 都会有一个新的 epoch
  • xid:其为一个流水号

这三个数据和zk的一致性算法息息相关,具体可以详细了解下ZK的一致性算法。

ZK三种模式

ZAB 协议中对 zkServer 的状态描述有三种模式。这三种模式并没有十分明显的界线,它们相互交织在一起。

  • 恢复模式:其包含两个重要阶段:Leader 的选举,与初始化同步
  • 广播模式:其可以分为两类:初始化广播,与更新广播
  • 同步模式:其可以分为两类:初始化同步,与更新同步

ZK四种状态

zk 集群中的每一台主机,在不同的阶段会处于不同的状态。每一台主机具有四种状态。

  • LOOKING:选举状态
  • FOLLOWING:Follower 的正常工作状态
  • OBSERVING:Observer 的正常工作状态
  • LEADING:Leader 的正常工作状态
相关推荐
只因在人海中多看了你一眼2 小时前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
zhixingheyi_tian4 小时前
Spark 之 Aggregate
大数据·分布式·spark
求积分不加C6 小时前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan05296 小时前
javaer快速上手kafka
分布式·kafka
wuxingge9 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
谭震鸿9 小时前
Zookeeper集群搭建Centos环境下
分布式·zookeeper·centos
志凌海纳SmartX10 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总10 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿10 小时前
k8s 集群安装
云原生·容器·kubernetes
Code_Artist10 小时前
Docker镜像加速解决方案:配置HTTP代理,让Docker学会科学上网!
docker·云原生·容器