ZooKeeper 3.6.3
重点
CAP原则
Paxos算法
存储模型和监听机制
一、集群与分布式
集群:将一个任务部署在多个服务器,每个服务器都能独立完成该任务。
分布式:将一个任务拆分成若干个子任务,由若干个服务器分别完成这些子任务,每个服务器只能完成某个特定的子任务。
从概念上就可以看出两者最主要的区别就是分布式是将一种业务拆分成多个子业务部署在多台服务器上,进而对外提供服务;而集群就是将多台服务器组合在一起提供同一种服务。
集群强调在多台服务器位置集中,并且容易统一管理;而分布式没有具体要求,不论放置在哪个位置,只要通过网络连接起来就行。
集群是一种物理形态,即多台服务器在一起提供一种服务;而分布式是一种工作方式,即一个程序或业务分解到多台服务器分别完成。
总结:集群是通过提高单位时间内执行的任务数来提升效率,分布式是以缩短单个任务的执行时间来提升效率。
二、CAP原则
CAP 原则又称 CAP 定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partitiontolerance(分区容错性),三者不可得兼。
CAP 由 Eric Brewer 在 2000 年 PODC 会议上提出。该猜想在提出两年后被证明成立,成为我们熟知的 CAP 定理。CAP三者不可兼得。
特性 | 定理 |
---|---|
Consistency | 一致性,也叫做数据原子性,系统在执行某项操作后仍然处于一致的状态。在分布式系统中,更新操作执行成功后所有的用户都应该读到最新的值,这样的系统被认为是具有强一致性的。等同于所有节点访问同一份最新的数据副本。 |
Availability | 可用性,每一个操作总是能够在一定的时间内返回结果,这里需要注意的是"一定时间内"和"返回结果"。一定时间内指的是在可以容忍的范围内返回结果,结果可以是成功或者是失败,且不保证获取的数据为最新数据。 |
Partition tolerance | 分区容错性,分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障。这里可以理解为是否可以对数据进行分区,这是考虑到性能和可伸缩性。 |
2.1 取舍策略
CAP 三个特性只能满足其中两个,那么取舍的策略就共有三种:
- CA without P:如果不要求 P(不允许分区),则 C(强一致性)和 A(可用性)是可以保证的。但放弃 P 的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的。
- CP without A:如果不要求 A(可用),相当于每个请求都需要在服务器之间保持强一致,而 P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。设计成 CP 的系统其实不少,最典型的就是分布式数据库。对于分布式数据库来说,数据的一致性是最基本的要求,因为如果连这个标准都达不到,那么直接采用关系型数据库就好,没必要再浪费资源来部署分布式数据库。
- AP without C:要高可用并允许分区,则需放弃一致性。一旦产生分区,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。典型的应用就如某米的抢购手机场景,可能前几秒你浏览商品的时候页面提示是有库存的,当你选择完商品准备下单的时候,系统提示你下单失败,商品已售完。这其实就是先在 A(可用性)方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,虽然多少会影响一些用户体验,但也不至于造成用户购物流程的严重阻塞。
2.2 总结
现如今,对于多数大型互联网应用,主机众多、部署分散,而且现在的集群规模越来越大,节点只会越来越多,所以节点故障、网络故障是常态,因此分区容错性也就成为了一个分布式系统必然要面对的问题。那么就只能在 C 和 A 之间进行取舍。但对于传统的项目就可能有所不同,拿银行的转账系统来说,涉及到金钱的对于数据一致性不能做出一丝的让步,C 必须保证,出现网络故障的话,宁可停止服务。而互联网非金融项目普遍都是基于 AP 模式。
总而言之,没有最好的策略,好的系统应该是根据业务场景来进行架构设计的,只有适合的才是最好的。
2.3 BASE 理论
BASE:全称 Basically Available(基本可用),Soft state(软状态),和 Eventually consistent(最终一致性)三个短语的缩写,来自 ebay 的架构师提出。
核心思想:
既然无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。
2.3.1 Basically Available(基本可用)
基本可用是指分布式系统在出现故障的时候,允许损失部分可用性(例如响应时间、功能上的可用性)。
2.3.2 Soft state(软状态)
软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。
2.3.3 Eventually consistent(最终一致性)
系统不可能一直是软状态,必须有个时间期限。在期限过后,应当保证所有副本保持数据一致性。从而达到数据的最终一致性。这个时间期限取决于网络延时,系统负载,数据复制方案设计等等因素。
2.3.4 总结
三、数据的一致性
3.1 定义
复制是导致出现数据一致性问题的唯一原因,因为单节点系统很容易就可以达成一致性,而一些分布式系统通过复制数据来提高系统的可靠性和容错性,将数据的不同的副本存放在不同的机器,这样的多节点系统一致性就成为了问题。
3.2 模型
- 强一致性
- 弱一致性
- 最终一致性:是弱一致性的一种特例,保证用户最终能够读取到某操作对系统特定数据的更新。
- 从客户端来看,有可能暂时获取的不是最新的数据,但是最终还是能访问到最新的
- 从服务端来看,数据存储并复制到整个系统超过半数的节点,以保证数据最终一致
- 最终一致性:是弱一致性的一种特例,保证用户最终能够读取到某操作对系统特定数据的更新。
四、Paxos算法
选主
数据同步
五、Raft算法
六、ZAB协议
6.1 背景
6.1 简介
ZAB 协议,全称 ZooKeeper Atomic Broadcast(ZooKeeper 原子广播协议)。它是专门为分布式协调服务——ZooKeeper设计的一种支持崩溃恢复和原子广播的协议。
ZAB 协议借鉴了 Paxos 算法,而 ZooKeeper 正是通过 ZAB 协议来保证分布式事务的最终一致性。基于该协议,
ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。
6.2 三种角色
- Leader:负责整个 ZooKeeper 集群工作机制中的核心,主要工作有以下两个:事务请求的唯一调度和处理者,保证集群事务处理的顺序性集群内部各服务器的调度者。
- Follower:它是 Leader 的追随者,其主要工作有三个:处理客户端的非实物请求,转发事务请求给 Leader 服务器参与事务请求 Proposal 的投票参与 Leader 选举投票。
- Observer:是 ZooKeeper 自 3.3.0 开始引入的一个角色,它不参与事务请求 Proposal 的投票,也不参与 Leader 选举投票,只提供非事务的服务(查询),通常在不影响集群事务处理能力的前提下提升集群的非事务处理能力。
Follow 服务器和 Observer 服务器又统称为 Learner 服务器。
6.3 两种模式
ZAB 协议的包括两种模式:崩溃恢复、原子广播。
6.3.1 崩溃恢复之数据恢复
- 当整个集群正在启动时,或者当 Leader 节点出现网络中断、崩溃等情况时,ZAB 协议就会进入恢复模式并选举产生新的 Leader,当 Leader 服务器选举出来后,并且集群中有过半的机器和该 Leader 节点完成数据同步后(同步指的是数据同步,用来保证集群中过半的机器能够和 Leader 服务器的数据状态保持一致),ZAB 协议就会退出恢复模式。
- 当集群中已经有过半的 Follower 节点完成了和 Leader 状态同步以后,那么整个集群就进入了消息广播模式。这个时候,在 Leader 节点正常工作时,启动一台新的服务器加入到集群,那这个服务器会直接进入数据恢复模式,和 Leader节点进行数据同步。同步完成后即可正常对外提供非事务请求的处理。
- 在整个消息广播中,Leader 会将每一个事务请求转换成对应的 Proposal 来进行广播,并且在广播事务 Proposal 之前,Leader 服务器会首先为这个事务 Proposal 分配一个全局单递增的唯一ID,称之为事务 ID(即 ZXID),由于 ZAB 协议需要保证每一个消息的严格的顺序关系,因此必须将每一个 Proposal 按照其 ZXID 的先后顺序进行排序和处理。
6.3.2 消息广播之原子广播
- 在 ZooKeeper 集群中,数据副本的传递策略就是采用消息广播模式。Leader 服务器将客户端事务请求转化成一个Prososal(提议),并将该 Proposal 分发给集群中所有的 Follower 服务器。也就是向所有 Follower 节点发送数据广播请求(或数据复制)。
- ZooKeeper 中数据副本的同步方式与二段提交相似,但是却又不同。二段提交要求协调者必须等到所有的参与者全部反馈 ACK 确认消息后,再发送 Commit 消息。要求所有的参与者要么全部成功,要么全部失败。二段提交会产生严重的阻塞问题。
- 而在 ZAB 协议中 Leader 等待 Follower 的 ACK 反馈消息“只要半数以上的 Follower 成功反馈即可,不需要收到全部Follower 的反馈”。
6.4 总结
整个 ZAB 协议一共定义了三个阶段:
- 发现:要求 ZooKeeper 集群必须选举出一个 Leader,同时 Leader 会维护一个 Follower 可用列表。将来客户端可以和这些 Follower 节点进行通信。
- 同步:Leader 要负责将本身的数据与 Follower 完成同步,做到多副本存储。这样便体现了 CAP 中的一致性和分区容错。Follower 将队列中未处理完的请求消费完成后,写入本地事务日志中。
- 广播:Leader 可以接受客户端新的事务 Proposal 请求,将新的 Proposal 请求广播给所有的 Follower。
三个阶段执行完为一个周期,在 ZooKeeper 集群的整个生命周期中,这三个阶段会不断进行,如果 Leader 崩溃或因其它原因导致 Leader 缺失,ZAB 协议会再次进入阶段一。
6.5 角色分配
七、ZooKeeper集群搭建
大数据学习笔记 ZooKeeper3.6.3 集群搭建-CSDN博客
八、ZK集群一键启动脚本
在 /usr/local/bin
目录下创建对应服务的脚本:
vim /usr/local/bin/zookeeper
zookeeper 脚本内容如下:
#!/bin/bash
user=$(whoami)
case $1 in
"start")
for i in node01 node02 node03
do
echo -e "\e[1;34m==================== $i ZooKeeper 启动 ====================\e[0m"
ssh $user@$i "/opt/yjx/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start"
done
;;
"stop")
for i in node01 node02 node03
do
echo -e "\e[1;34m==================== $i ZooKeeper 停止 ====================\e[0m"
ssh $user@$i "/opt/yjx/apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop"
done
;;
"status")
for i in node01 node02 node03
do
echo -e "\e[1;34m==================== $i ZooKeeper 状态 ====================\e[0m"
ssh $user@$i "/opt/yjx/apache-zookeeper-3.6.3-bin/bin/zkServer.sh status"
done
;;
"restart")
for i in node01 node02 node03
do
echo -e "\e[1;34m==================== $i ZooKeeper 重启 ====================\e[0m"
ssh $user@$i "/opt/yjx/apache-zookeeper-3.6.3-bin/bin/zkServer.sh restart"
done
;;
esac
修改脚本权限为用户读写执行rwx
,组读执行r-x
,其他用户无权限---
:
九、ZooKeeper常见命令
一、zk服务命令
1. 启动ZK服务: bin/zkServer.sh start
2. 查看ZK服务状态: bin/zkServer.sh status
3. 停止ZK服务: bin/zkServer.sh stop
4. 重启ZK服务: bin/zkServer.sh restart
5. 连接服务器: zkCli.sh -server 127.0.0.1:2181
二、zk客户端命令
1.ls -- 查看某个目录包含的所有文件,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] ls /
ls /path
2.create -- 创建znode,并设置初始内容,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] create /test "test"
Created /test
创建一个新的 znode节点“ test ”以及与它关联的字符串
create /path data 默认创建持久节点
create -s /path data 创建顺序节点
create -e /path data 创建临时节点
create /parent/sub/path /data
3.get -- 获取znode的数据,如下:
[zk: 127.0.0.1:2181(CONNECTED) 1] get /test
get /path
get /path0000000018 访问顺序节点必须输入完整路径
4.set -- 修改znode内容,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] set /test "ricky"
set /path /data
5.delete -- 删除znode,例如:
[zk: 127.0.0.1:2181(CONNECTED) 1] delete /test
delete /path 删除没有子节点的节点
rmr /path 移除节点并且递归移除所有子节点
7.quit -- 退出客户端
8.help -- 帮助命令
十、ZooKeeper存储模型
10.1 存储结构
- zookeeper是一个树状结构,维护一个小型的数据节点znode
- 数据以keyvalue的方式存在,目录是数据的key
- 所有的数据访问都必须以绝对路径的方式呈现
10.2 节点的分类
- 持久化节点(PERSISTENT)
- 默认创建的就是持久化节点
- 临时节点(Ephemral)
- 只要创建节点的会话有效,节点就不会失效
- 可以被所有的客户端所查看
- 事务编号和临时节点编号是一致的
- create -e
- 一旦会话结束,临时节点也会被自动删除,一般这个功能用于判断节点和服务器是否保持连接
- 序列化节点(Sequential)
- 在名字的后面添加一个序列号(有序)
- create -s
十一、ZooKeeper监听机制
语法格式: addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
。
addWatch
的作用是针对指定节点添加事件监听,支持两种模式:
PERSISTENT
:持久化订阅,针对当前节点的修改和删除事件,以及当前节点的子节点的新增和删除事件。PERSISTENT_RECURSIVE
:持久化递归订阅,在 PERSISTENT 的基础上,增加了子节点修改的事件触发,以及子节点的子节点的数据变化都会触发相关事件(满足递归订阅特性)。默认模式。
标签:ZooKeeper,CAP,Leader,3.6,集群,一致性,服务器,节点 From: https://blog.csdn.net/weixin_62785232/article/details/143580350两种模式的 WatchedEvent 稍微有些不同。