![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Zookeeper
库昊天
这个作者很懒,什么都没留下…
展开
-
服务器地址列表
客户端连接ZK集群时,如何从服务器列表中选择? 利用Collections.shuffle()将服务器列表随机打乱,组成环形数组,然后依次选择;问题1:无法实现“同机房优先策略” 背景:为了提高应用的稳定性和容灾能力,服务器都是多机房甚至异地机房部署。但多机房造成的问题就是“不同机房间延时不同”,目前方案是采用“同机房优先”的策略:服务的消费者优先消费同一个机房中提供的服务。 ZK集群为了原创 2017-10-18 11:51:48 · 431 阅读 · 0 评论 -
ZK客户端升级方案
ZK客户端的缺陷无法支持ZK集群地址的动态变更。客户端创建时ZK集群的地址就写死在程序中了,当ZK集群发生整体迁移或者个别机器发生变更时,会导致大量客户端应用跟着一起变更。无法支持同机房优先策略。为了实现容灾,ZK集群通常会将集群中的机器分开部署在多个机房中,这就会产生网络延时问题。为了最大程度低降低延时,客户端与ZK服务器建立连接时,需要优先筛选同机房的机器。改造方案ZK集群地址变更时能够原创 2018-02-28 10:16:21 · 453 阅读 · 0 评论 -
ZK之connectString解析
组成及作用 connectString由两部分组成:ZK集群地址列表+Chroot命名空间。ZK集群地址列表以IP:Port,IP:Port,IP:Port形式组成,Chroot用于应用间的相互隔离,如下图所示:原创 2018-02-28 10:22:57 · 1285 阅读 · 0 评论 -
ZK集群变更时的负载均衡策略
实现目标当ZK集群地址变更时,需要实现以下三个目标:客户端不需要重启;变更后集群中每台机器的负载(客户端数据量)是均衡的;尽量避免不必要的客户端迁移; When the set of servers changes, we would like to update the server list stored by clients without restarting ...原创 2018-02-28 11:07:26 · 1080 阅读 · 0 评论 -
ZK客户端核心类ClientCnxn分析
核心功能 ClientCnxn是ZK客户端的核心类,负责客户端与服务器之间的通信,主要包括两个主要成员SendThread和EventThread,其功能如下图所示: 建立连接过程创建ClientCnxn实例,并启动; SendThread开始建立连接,TCP层创建Socket; 3. 应用层发送创建连接请求; 4. 服务器处理连接请求,如果sessionId不为空则会尝试复用对原创 2018-03-01 12:53:41 · 1857 阅读 · 0 评论 -
ZK数据存储之数据快照
什么是数据快照? 数据快照是某一时刻全量内存数据的镜像,存储在磁盘文件。存储位置 通过配置zoo.cfg文件的dataDir属性设定数据快照文件的存储目录。存储格式文件头:FileHeader数据:DataTree和Sessions校验和:checksum结束符:/何时生成数据快照? 事务日志的次数超过设定值后,会触发ZK dump全量内...原创 2018-03-03 11:57:34 · 1912 阅读 · 0 评论 -
ZK数据存储之事务日志
什么是事务日志? 事务日志是事务请求的本地持久化记录。存储位置 通过配置zoo.cfg文件的dataDir目录设置事务日志的存储目录。存储格式文件头:FileHeader 事务列表TxnList: (事务格式:checksum Txnlen TxnHeader Record 0x42)零补充:ZeroPad事务日志触发时机? 每条事务请求都会被...原创 2018-03-03 15:40:32 · 1106 阅读 · 0 评论 -
ZK数据存储之内存数据库ZKDatabase
ZKDatabase功能 ZKDatabase负责管理会话、DataTree和事务日志,向上层提供统一的数据操作接口,其基本结构如下图所示: ZKDatabase的初始化 ZKDatabase的初始化大致分为两步:加载某个数据快照文件,恢复某个时刻T的全量内存数据; 初始化时,ZK会加载最新的100个数据快照文件,依次解析。首先,解析最新的数据快照文件,如果校验通过则返回文件名ZXID;否原创 2018-03-03 17:02:26 · 1183 阅读 · 0 评论 -
Leader选举解析
何时进行Leader选举?ZK集群刚初始化启动,还未产生Leader;ZK集群运行期间,Leader服务器宕机;Leader选举原则投票过半原则:某台机器得票数量超过集群数量的一半才能成为Leader,假设集群机器数量为n,那么只有投票超过(n/2+1)时才能确定Leader;投票PK原则优先选用数据最新的服务器作为Leader,即ZXID大的投票胜出;当...原创 2018-03-04 17:51:03 · 347 阅读 · 0 评论 -
ZAB协议
主要流程 ZAB协议主要分为三部分:Leader选举、数据同步和消息广播,其中Leader选举和数据同步属于崩溃恢复模式,消息广播属于消息广播模式,如下图所示。 Leader选举触发时机服务端集群启动;Leader宕机或重启;网络异常;Leader与多半机器心跳异常后会自动降级,重新选举;Follower与Leader心跳异常后,重新选举;数据同步目的 保障集群中过半的机器与Leade原创 2018-05-09 15:00:34 · 311 阅读 · 0 评论 -
ZXID
特点集群范围内,全局单调唯一递增;数据构成 ZXID是一个64位的数字,低32代表一个单调递增的计数器,高32位代表Leader周期。 ZXID变化当有新的Leader产生时,Leader周期epoch加1;每处理一个事务请求,计数器加1;原创 2018-05-09 15:23:41 · 4907 阅读 · 0 评论 -
阿里为什么不用 ZooKeeper 做服务发现?
转载:https://kuaibao.qq.com/s/20180606B0DUOJ00?refer=spider原因 在服务发现领域,ZooKeeper并不是最佳的选择。原因可以从客户端和服务端两个方向进行分析。 客户端ZK服务端集群的地址列表是写死在客户端的,不支持动态变更;不支持同机房优先策略;没有针对服务端集群完全不可用时的容灾手段;服务端写能...原创 2018-06-23 13:26:21 · 2062 阅读 · 0 评论 -
Zookeeper之集群机器两两互联
两两互联 集群中的每台机器启动时能够从配置文件获取其它机器的IP及其编号,最终实现任意两台机器间只保持一个连接,如下图所示。 如何避免重复连接? 为了避免两台机器间重复地创建TCP连接,Zookeeper设计了一种建立TCP连接的规则:只允许SID大的机器主动连接SID比其小的机器,如果当前机器发现自己的SID更大,则断开当前连接,然后主动和对端服务器建立连接。原创 2018-02-26 14:59:47 · 570 阅读 · 0 评论 -
ZooKeeper Observers
背景:在observer出现之前,ZK集群是没有伸缩性可言的,机器数量太多会导致写性能下降,数量太少会导致读性能以及可靠性下降,因此线上环境大多控制在5台或7台。Observer介绍Observer与Follower的唯一区别就是observer不参与投票,这带来如下好处:读性能无限扩展,写性能不变。读性能无限扩展(observer机器数量增加),写性能不变(参与投票的机器数量不变)。官网原话如下原创 2017-11-05 16:09:35 · 384 阅读 · 0 评论 -
断线重连机制
Zookeeper的客户端具有自动重连机制,当出现网络异常时,客户端会自动重连直到与集群中的某台机器连接成功,连接过程如下图所示: 1. 网络异常情况包括网络闪断、ZK服务器宕机等情况,这会导致连接断开CONNECTION_LOSS,此时客户端会收到事件None-Disconnected; 2. 如果在SessionTimeout时间内连接成功,则客户端收到事件None-SynConnect原创 2017-10-18 17:03:09 · 3839 阅读 · 0 评论 -
Zookeeper之Session
基本属性sessionId:会话ID,特点是全局唯一,保证sessionId全局唯一的基本思想是机器标识+随机数(时间戳),机器标识区分集群中不同的机器,同一台机器内的session可以用随机数、内存地址、计数器等多种手段来区分,一般会结合业务场景赋予一定的业务语义来使用;timeout:会话超时时间(时间段),当会话超时失效后,与会话绑定的数据、其创建的所有临时节点和watcher都会被...原创 2017-10-17 17:02:58 · 641 阅读 · 0 评论 -
Curator之Leader选举
基于LeaderSelector实现 当客户端成为Leader时,采用异步回调的方式调用takeLeadership,执行相应的逻辑; 优点如下: 1. 异步非阻塞; 2. 对于Leadership控制很灵活; 3. Leadership释放后可以重新排队竞争Leader; 4. 连接出现异常时,原先Leader正在执行的逻辑会被取消,防止出现并发;/原创 2017-10-19 18:47:23 · 425 阅读 · 0 评论 -
分布式监控中心设计方案
要求:作为各个应用的配置中心,提供持久化存储和配置变更推送的服务。持久化意味着应用的配置数据不能丢失,配置变更推送是指配置变更后能后通知到客户端。方案1:Zookeeper作为配置中心 原理: Znode节点数据会被持久化到磁盘文件,不存在数据丢失情况;Wather机制,Znode节点变更时会发出通知。读写能力无法水平扩展的方案:读能力水平扩展,写能力不变的方案: 局限性: 配置数据总量不能超原创 2017-11-06 20:22:23 · 796 阅读 · 0 评论 -
客户端Master动态选举
Master动态选举:当前master挂掉后,集群中的机器能够自动选举下一个master。 背景知识:临时节点:一旦创建临时节点的会话失效,该节点会被ZK主动删除;ZK强一致性:若有多个客户端同时请求创建同一个节点,最终只有一个客户端能够创建成功;方案:每个客户端启动时在同一个父节点下创建相同的临时节点,同时注册该子节点的变更watcher,用于监控当前master是否存活,一旦发现当前ma原创 2017-10-12 15:18:47 · 311 阅读 · 0 评论 -
分布式锁
基于Curator的分布式锁实现原创 2017-10-13 10:28:58 · 142 阅读 · 0 评论 -
Zookeeper开源客户端ZKClient和Curator简介
Zookeeper客户端提供了基本的操作,比如,创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。但对于开发人员来说,Zookeeper提供的基本操纵还是有一些不足之处。本篇博客就聊聊这些不足之处和两款开源框架ZKClient和Curator。Zookeeper API不足之处(1)Zookeeper的Watcher是一次性的,每次触发之后都需要重新进行注册; (2)Sess转载 2017-10-14 14:46:42 · 236 阅读 · 0 评论 -
数据读写流程
特点:单点(master节点)写入,多点(任意节点)读取; 读取流程:客户端发送读请求,与客户端建立连接的zk节点直接读取自己的数据,然后返回; 写入流程:客户端发送写请求,与客户端建立连接的zk节点首先将写请求转发给master节点,然后master节点再广播给集群中的其它节点,只有当大部分(Quorum参数,启动时配置)节点写入成功后当前写请求才能算作写入成功,然后返回给客户端;原创 2017-10-16 19:56:22 · 835 阅读 · 0 评论 -
客户端与服务端交互流程
发起连接请求与服务端建立连接,ZK集群分配一个Session ID给客户端;(连接建立成功后session被创建)客户端周期性发送心跳保持Session的有效性,若ZK集群在指定时间内(Session timeout)没收到心跳则认为Session失效(session创建的临时节点以及watches都会被删除);客户端发起读写znode节点的请求;客户端主动断开与ZK集群的连接,或者Sessi原创 2017-10-17 10:03:53 · 1828 阅读 · 0 评论 -
Zookeeper的局限性
Zookeeper框架的局限性有以下几个方面:存储容量 局限性: Zookeeper将所有数据都放在内存里,这意味着服务器的物理内存大小决定了ZNode节点所能够存储的数据量的上限; 对实际影响:配置数据总量不能太大,否则会造成启动太慢,甚至OOM;伸缩性 局限性: 增加机器可以提升ZK集群的读性能,但是写性能不会提高,甚至可能下降。原因是写操作需要集群中过半的机器投票决定,机器数量的增加原创 2017-11-05 14:29:31 · 328 阅读 · 0 评论 -
ZooKeeper双机房部署方案讨论
背景 对于ZK集群,理论上至少三个机房才能真正做到跨机房容灾。但在实际环境中,由于成本的原因,大多中小公司采用双机房部署的方案,存在两种形式。方案一:非对等部署 非对等部署:投入更多的资源重点维护某个机房,如下图所示。优点集群总量可为奇数,容错性更好;有一定的跨机房容灾能力,机房B挂掉认可正常运行;缺点存在数据丢失的可能(机房A被毁,且Master在机房...原创 2018-06-23 14:25:50 · 7808 阅读 · 0 评论