这可能是最简单易懂的 ZooKeeper 笔记
分布式架构
CAP 与 BASE 理论
cap 定理:
一个分布式系统不可能同时满足一致性 (C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本要求,最多只能同时满足其中的两项。
我们需要明确一点,对于一个分布式系统而言,分区容错性是一个最基本的要求,既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,否则也就无所谓分布式系统了。因此我们一般把精力花在如何根据业务特点在 C 和 A 之间寻求平衡。
base 理论:
BASE 是 Basically Available (基本可用),Soft state (软状态)和 Eventually consistent (最终一致性) 三个短语的简写,BASE 是对 CAP 中一致性和可用性权衡的结果,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
一致性协议
- 2 PC
- 3 PC
- Paxos 算法
初识 Zookeeper
Zookeeper 介绍
Zookeeper 是一个开源的分布式的(多台机器一起工作),为分布式应用提供协调服务的 Apache 项目。
ZooKeeper 工作机制
Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应。
例子:
服务端启动时去注册信息(创建的都是临时节点);客户端获取当前在线服务器列表,并注册监听;当服务器节点下线,服务器节点下线事件通知客户端,客户端重新去获取服务器列表,并注册监听。
Zookeeper = 文件系统 + 通知机制
Zookeeper 特点
- 一个 领导者(leader),多个跟随者(follower)组成的集群
- 集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。因此服务器最好设奇数台。
- 全局数据一致性:每台服务器保存一份相同的数据副本,Client 无论连接到哪个 Server,数据都是一致性的。
- 更新请求顺序进行,来自同一个 Client 的更新请求按其发送顺序依次执行。
- 数据更新原子性,一次数据更新要么成功,要么失败。典型的事务原子性。
- 实时性,在一定时间范围内,Client 能读取到最新的数据。
Zookeeper 数据结构
Zk 数据模型的结构整体上可以看作一棵树,每个节点称作一个 ZNode。每个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都是通过其路径唯一标识的
Zookeeper 应用场景
zk 提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
统一命名服务
在分布式环境下,经常需要对应用/服务进行统一命名,便于识别
例如:IP 地址难记,但是域名好记。如下图,将 www.baidu.com 这个域名与旗下的三个 服务器 IP 地址对应起来,当访问 www.baidu.com 的时候自动从三个 IP 地址中选一个进行访问。
统一配置管理
- 分布式环境下,配置文件同步非常常见。
- 一般要求一个集群中,所有节点的配置信息是一致的,比如 Kafka 集群。
- 对配置文件修改后,希望能够快速同步到各个节点上。
- 配置管理可交给 ZooKeeper 实现。
- 可以将配置信息写入 Zookeeper 上的一个 ZNode。
- 各个客户端服务器监听这个 ZNode。
- 一旦 ZNode 中的数据被修改,ZooKeeper 将通知各个客户端服务器。
统一集群管理
- 分布式环境中,实时掌握每个节点的状态是必要的。
- 可根据节点实时状态做出一些调整。
- Zookeeper 可以实现实时监控节点状态变化
- 可以将节点信息写入 Zookeeper 上的一个 ZNode。
- 监听这个 ZNode 可获取它的实时状态变化。
服务上下线
客户端能够实时洞察到服务器上下线的变化。服务端启动时去注册信息(创建的都是临时节点);客户端获取当前在线服务器列表,并注册监听;当服务器节点下线,服务器节点下线事件通知客户端,客户端重新去获取服务器列表,并注册监听。
软负载均衡
在 Zookeeper 中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。
Zookeeper 内部原理
选举机制
- 半数机制:集群中半数以上的机器存活,集群可用。所以 Zookeeper 适合安装奇数台服务器
- ZooKeeper 在没有 Master 和 Slave,但是 ZooKeeper 工作时是分为 Leader 和 Follower 的。Leader 只有一个,是通过内部选举机制临时产生的。
例子:
假设有五台服务器组成的 ZooKeeper 集群,他们的 id 从 1-5,同时它们都是刚刚启动的。假设这些服务器依序启动:
- 服务器 1 启动,现在只有它自己一台服务器,它发出去的报文没有任何响应,因此它的选举状态一直是 LOOKING 状态。
- 服务器 2 启动,它与最开始启动的服务器 1 进行通信。这时候 1 自己有自己一票,还投了 id 大的服务器,即 2 一票,2 有自己的一票和 1 的一票,共两票。因此 id 值大的 服务器 2 胜出,但是没有达到超过半数以上的服务器都同意选举它(由于这个例子有 5 台服务器,因此需要3台同意,即拥有 3 票)。所以服务器 1、2 还是继续保持 LOOKING 状态。
- 服务器 3 启动,过程和 2 相同,因此 3 有 三票,2 有 2 票,1 有 1 票,服务器 3 三票超过一半,成功成为 Leader 。
- 服务器 4 ,由于 3 已经是 Leader 因此它只能作为 Follower。
- 服务器 5 也类似,只能作为 Follower。
节点类型
- 持久(Persistent):客户端和服务器端断开连接后,创建的节点不删除
- 持久化目录节点:客户端与 Zookeeper 断开连接后,该节点依旧存在
- 持久化顺序编号目录节点:客户端与 Zookeeper 断开连接后,该节点依旧存在,只是 Zookeeper 给该节点名称进行顺序编号。
- 短暂(Ephemeral):客户端和服务器端断开连接后,创建的节点自己删除(服务器上下线)
- 临时目录节点:客户端与 ZooKeeper 断开连接后,该节点被删除。
- 客户端与 ZooKeeper 断开连接后,该节点被删除,只是 ZooKeeper 给该节点名称进行顺序编号。
说明:创建 ZNode 时设置顺序标识,ZNode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。在分布式系统中,顺序号可用被用于为所有的事件进行全局排序,这样客户端可用通过顺序号来推断事件的顺序。
监听器原理
- 监听器原理
- 首先有个 main 线程
- 在 main 线程中启动 Zookeeper 客户端,这时会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listenner)。
- 通过 connect 线程将注册的监听事件发送给 zookeeper。
- 在 zookeeper 的注册监听器列表中将注册的监听事件添加到列表中。
- Zookeeper 监听到由数据或者路径发生变化,就会将这个消息发送给 listenner 线程。
- listenner 线程内部调用了 process()方法。
- 常用的监听
- 监听节点数据的变化:get path[watch]
- 监听子节点增减的变化:ls path[watch]
写数据流程
- 假设Client 向 Zookeeper 上的 Server 1 写数据,发送一个写请求。
- 如果 Server 1 不是 Leader,那么 Server 1 会把接受到的请求进一步发送给 Leader,因为每个 ZooKeeper 的服务器集群里面有一个 是 Leader,这个 Leader 会将所有写请求广播给各个 Server。各个 Server 写成功后就会通知 Leader
- 当 Leader 收到大多数 Server 数据写成功了,那么就说明数据写成功了,如果有三台服务器,只要有两台写成功了,那么就认为数据写成功了,写成功后,Leader 告诉 Server 1 数据写成功了。
- Server 1 会进一步通知 Client 数据写成功了,这时就会认为整个写操作成功。
自我小结
Zookeeper 是一个采用 ZAB 作为数据一致性协议的分布式数据一致性协调框架。ZooKeeper 可以作为分布式配置管理,集群服务,数据发布/订阅,服务注册/发现,分布式锁等的实现。其内部采用 ZNode 节点维护一系列数据,当数据改变的时候可以通过 watche 机制告诉客户端。当 ZooKeeper 作为分布式消息系统的管理,如 Kafka 的管理时,可以将所有 Kafka 服务器,即所有的 Broker 的信息写入 ZooKeeper 节点中,当加服务器时只要在节点下加入一个临时子节点,服务器宕机或下线时临时子节点将会自动删除。很容易实现服务器的集群管理。不光如此,ZooKeeper也可以用来维护 Topic 主题和 Producer 和Consumer 等的信息。当 ZooKeeper 作为分布式服务框架的注册中心时,可以将服务注册到 ZooKeeper 节点上,每个服务对应一个节点,子节点就是所有提供了该服务的机器的地址。每当有一个服务提供者启动的时候都会网对应的服务节点下创建自己的临时节点,存放自己的地址信息。消费者需要某个服务的时候只需要到对应的服务节点中随便取一个子节点然后使用该服务就行了。监控中心可以很容易的通过现有的节点监控信息。
ZooKeeper 集群中会自动选举一个 Leader 服务器负责事务的操作,其余的 Follower服务器可以处理非事务操作、参与 Leader 服务器的投票等。而 Observer 服务器只能处理非事务的操作,但是不能参与任何投票。
总之,ZooKeeper 常用来维护各种分布式应用的一个状态,使得分布式应用本身无状态,只需要向 ZooKeeper 注册自己的状态,当需要某种状态的时候直接去 ZooKeeper 上取就行了。当自己关注的消息发生变化时,ZooKeeper 会通过 Watche 进行通知,自己再进行对应的处理即可。
这可能是最简单易懂的 ZooKeeper 笔记的更多相关文章
- (转)ZooKeeper 笔记(1) 安装部署及hello world
ZooKeeper 笔记(1) 安装部署及hello world 先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.or ...
- Zookeeper笔记之命令行操作
$ZOOKEEPER_HOME/bin下的zkCli.sh进入命令行界面,使用help可查看支持的所有命令: 一.节点相关操作 create [-s] [-e] path data acl creat ...
- zookeeper笔记(一)
title: zookeeper笔记(一) zookeeper 安装简记 解压文件 $ tar -zxvf zookeeper-3.4.10.tar.gz -C 安装目录 创建软连接(进入安装目录) ...
- zookeeper笔记(二)
title: zookeeper笔记(二) zookeeper ALC权限控制 getAcl path 可以查看某个node的权限 设置权限: 2. world方式 setAcl <path&g ...
- Zookeeper笔记3——原理及其安装使用
Zookeeper到底能干什么? 1.配置管理:这个好理解.分布式系统都有好多机器,Zookeeper提供了这样的一种服务:一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣 ...
- ZooKeeper 笔记(6) 分布式锁
目前分布式锁,比较成熟.主流的方案有基于redis及基于zookeeper的二种方案. 大体来讲,基于redis的分布式锁核心指令为SETNX,即如果目标key存在,写入缓存失败返回0,反之如果目标k ...
- 分布式服务协调技术zookeeper笔记
本文主要学习ZooKeeper的体系结构.节点类型.节点监听.常用命令等基础知识,最后还学习了ZooKeeper的高可用集群的搭建与测试.希望能给想快速掌握ZooKeeper的同学有所帮助. ZooK ...
- ZooKeeper 笔记(1) 安装部署及hello world
先给一堆学习文档,方便以后查看 官网文档地址大全: OverView(概述) http://zookeeper.apache.org/doc/r3.4.6/zookeeperOver.html Get ...
- ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表
zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...
随机推荐
- luogu P2585 [ZJOI2006]三色二叉树
P2585 [ZJOI2006]三色二叉树 题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过10000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO ...
- 灰度变换,gama变换,对数,反对数变换
学习DIP第2天 灰度变换,及按照一定规则对像素点的灰度值进行变换,变换的结果可以增强对比度,或者达到其他的效果(例如二值化,或者伽马变换),由于灰度变换为针对单个像素点的灰度值进行变换,素以算法复杂 ...
- MIME协议(五) -- MIME邮件的编码方式
5 MIME邮件的编码方式 由于每个ASCII码字符只占用一个字节(8个bit位),且最高bit位总为0,即ASCII码字符中的有真正意义的信息只是后面的7个低bit位,而传统的SMTP协议又是基于 ...
- 前端工程师需要掌握的 Babel 知识
在前端圈子里,对于 Babel,大家肯定都比较熟悉了.如果哪天少了它,对于前端工程师来说肯定是个噩梦.Babel 的工作原理是怎样的可能了解的人就不太多了.本文将主要介绍 Babel 的工作原理以及怎 ...
- C#_switch语句,for循环,do while循环,while循环
1:switch语句,代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- MySQL优化相关参数--先做个记录,以后可能用得到
innodb_io_capacity:可设置的磁盘IO性能参数,越高代表当前mysql的IO性能更好,可用做决策刷脏页速度的参数: innodb_flush_neighbors:刷脏页是否开启连坐机制 ...
- Linux设备驱动程序 之 度量时间差
概述 内核通过定时器中断来跟踪事件流: 时钟中断由系统定时硬件以及周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个细节结构有关的常数:作为一般性规则,即使知道对应平台上的确切HZ值,也不应 ...
- Undo Segment/Undo Retention
undo_retention简单定义,就是最多数据的最少保留时间.AUM模式下,undo_retention参数用于事务commit后undo数据保留的时间.单位为秒.这是个no guarantee的 ...
- centos7 安装 ftp 服务及创建 repo源
安装 ftp 服务 安装和启动服务:# yum install vsftpd# systemctl enable vsftpd# systemctl start vsftpd 配置文件: vi /et ...
- Android性能优化-电量优化
前言 电量优化,这个名词在传统PC时代,我们基本很少听见.然而到了诺基亚时代,我们也同样很少关注.直到了移动互联的智能机时代.电量优化才被慢慢的重视起来.可能的原因如下: 移动设备,不能一直使用电源供 ...