Zookeeper实现原理分析

一、zookeeper概述

1、zookeeper:是一个开源的、分布式的,为分布式框架提供协调服务的Apache框架。

2、zookeeper工作机制:基于观察者模式设计的分布式服务管理框架,负责存储和管理大家都关心的数据,然后接收观察者的注册,一旦数据状态发生变化,zookeeper将负责通知已经在zookeeper上注册的那些观察者做出相应的反应。

3、zookeeper特点

  1. 一个领导者leader,多个跟随着follower组成的集群。
  2. 集群中只要有半数以上节点存活,zookeeper集群就能正常服务,所以zookeeper适合按照奇数台服务器。
  3. 全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。
  4. 更新请求顺序执行,来自同一个client的更新请求按其发送顺序依次执行。
  5. 数据更新原子性,一次数据更新要么成功,要么失败。
  6. 实时性:在一定时间范围内,client能读到最新的数据。

4、zookeeper数据结构
zookeeper数据模型的结构与Linux文件系统很类似,整体上可以看作是一颗树,每个节点称作一个znode。每一个znode默认能够存储1MB的数据,每个znode都可以通过其路径唯一标识。

5、zookeeper应用场景
(1)统一域名服务:在分布式环境下,经常需要对服务进行统一命名,便于识别。
(2)统一配置管理:在分布式环境下,配置文件同步。
(3)统一集群管理:在分布式环境下,实时掌握每个节点的状态。
(4)软负载均衡:zookeeper记录每台服务器的访问次数,让访问次数最少的服务器去处理最新的客户端请求。

6、zookeeper配置文件:zoo.cfg
(1)tickTime=2000:通信心跳时间,zookeeper服务器与客户端心跳时间,单位ms。
(2)initLimit=10:lf初始化通信时限。
(3)syncLimit=5:lf同步通信时限。
(4)dataDir:保存zookeeper中的数据。默认的tmp目录。
(5)clientPort=2181:客户端连接端口,通常不做修改。

二、zookeeper选举机制

Zookeeper实现原理分析_第1张图片
Zookeeper实现原理分析_第2张图片

三、zookeeper节点类型

1、持久:客户端与服务器断开后,创建的节点不删除
(1)持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在。
(2)持久化顺序编号目录节点
客户端与zookeeper断开后,该节点依旧存在,只是zookeeper给该节点名称进行顺序编号
(3)临时目录节点
客户端与zookeeper断开后,该节点被删除
(4)临时顺序编号目录节点
客户端与zookeeper断开后,该节点被删除,只是zookeeper给该节点名称进行顺序编号

2、短暂:客户端与服务器断开后,创建的节点自己删除

四、zookeeper监听器原理

  1. 首先要有一个main()线程;
  2. 在main线程中创建zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listener);
  3. 通过connect线程将注册的监听事件发送给zookeeper;
  4. 在zookeeper的注册监听器列表中将注册的监听事件添加到列表中;
  5. zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程;
  6. listener线程内部调用了process()方法。
    Zookeeper实现原理分析_第3张图片

五、服务器动态上下线

客户端能实时洞察到服务器上下线的变化
Zookeeper实现原理分析_第4张图片

六、zookeeper分布式锁实现

分布式锁实现案例:
Zookeeper实现原理分析_第5张图片

七、zookeeper相关

1、选举机制
半数机制,超过半数的投票通过,即通过。
(1)首次启动选举规则:投票过半数时,服务器id大的胜出。
(2)非首次启动选举规则:EPOCH大的直接胜出;EPOCH相同,事务id大的胜出;事务id相同,服务器id大的胜出。

2、生产环境下按照多少zookeeper合适
安装奇数台,服务器台数多可以提高可靠性,但是会使通信延迟增加。
常用台数:
10台服务器:3台zookeeper
20台服务器:5台zookeeper
100台服务器:11台zookeeper
200台服务器:11台zookeeper

3、常用命令
ls
create
get
delete

八、zookeeper底层算法分析

zookeeper如何保证数据一致性?

1、Paxos算法

  • Paxos算法:一种基于消息传递且具有高度容错性的一种一致性算法。

  • Paxos算法解决的问题:如何快速正确的在一个分布式系统中对某个数据值达成一致,并且保证不论发生任何异常,都不会破坏整个系统的一致性。

  • Paxos算法介绍:在一个Paxos系统中,首先将所有节点划分成提议者(proposer),接收者(acceptor),学习者(learner)。(每一个节点都可以身兼数职)。

完整的Paxos算法流程分为三个阶段:
Zookeeper实现原理分析_第6张图片

Paxos算法流程:

2、ZAB协议

  • ZAB算法:借鉴了paxos算法,是特别为zookeeper设计的支持崩溃恢复的原子广播协议。基于ZAB协议,zookeeper设计为只有一台客户端(leader)负责处理外部的写事务请求,然后leader客户端将数据同步到其他follower节点,即zookeeper只有一个leader可以发起提案。
  • ZAB协议内容:包括两种基本的模式,即消息广播和崩溃恢复。

(1)消息广播:
Zookeeper实现原理分析_第7张图片
(2)崩溃恢复

**崩溃恢复:**假设出现异常
Zookeeper实现原理分析_第8张图片
崩溃恢复: leader选举
Zookeeper实现原理分析_第9张图片
崩溃恢复: 数据恢复
Zookeeper实现原理分析_第10张图片

3、CAP理论

  • 一个分布式系统不可能同时满足以下三种条件:
    一致性(C:consistency)
    可用性(A:available)
    分区容错性(P:partition tolerance)

  • 最多只能满足其中两个条件,因为P是必须的,因此可选条件只能包括CP或AP
    (1)一致性
    在分布式环境下,一致性是指数据在多个副本之间是否可以保持数据一致的特性。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。
    (2)可用性
    可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
    (3)分区容错性
    分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

zookeeper保证的是CP,一致性和分区容错性
(1)zookeeper不能保证每次服务请求的可用性,在极端情况下可能会丢弃一些请求,消费者程序需要重新请求才能获取结果。因此,zookeeper不能保证服务可用性。
(2)进行leader选举时集群都是不可用的。

你可能感兴趣的:(zookeeper,分布式,云原生)