| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> zookeeper深入了解 -> 正文阅读 |
|
[大数据]zookeeper深入了解 |
1. 什么是zookeeperZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。 基于ZooKeeper的数据结构,Watcher,选举机制等可以实现数据的发布/订阅,软负载均衡,命名服务,统一配置管理,分布式锁,集群管理等功能。? Zookeeper 有三种运行模式:单机模式、伪集群模式和集群模式。 单机模式:这种模式一般适用于开发测试环境,一方面我们没有那么多机器资源,另外就是平时的开发调试并不需要极好的稳定性。 集群模式:一个 ZooKeeper 集群通常由一组机器组成,一般 3 台以上就可以组成一个可用的 ZooKeeper 集群了。组成 ZooKeeper 集群的每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都会互相保持通信。 伪集群模式:这是一种特殊的集群模式,即集群的所有服务器都部署在一台机器上。当你手头上有一台比较好的机器,如果作为单机模式进行部署,就会浪费资源,这种情况下,ZooKeeper 允许你在一台机器上通过启动不同的端口来启动多个 ZooKeeper 服务实例,以此来以集群的特性来对外服务。 2. 为什么要使用zookeeper2.1 利用zookeeper做全局配置管理在实际业务系统开发中,会通过配置属性让业务逻辑更加丰富。常采用的方案包括:
为什么选用zookeeper做配置中心呢?主要是当配置属性发生变化的时候,期望对应的业务系统能第一时间感知到,做对应属性的更新。zookeeper有强一致性保障,数据容错性更强;更重要的是zookeeper自带的watch机制,非常适合当有数据变化时触发,数据库和redis都无法直接提供此能力。 2.2 统一命名服务2.3 分布式锁zookeeper致力于提供高性能、高可用、顺序一致性的分布式协调服务,保证数据最终一致性;主要实现包括:
3. zookeeper数据结构3.1 节点类型ZooKeeper的数据结构,跟Unix文件系统非常类似,可以看做是一颗树,每个节点叫做ZNode。每一个节点可以通过路径来标识。结构如下: ?每个节点在 Zookeeper 中叫做 Znode,并且其有一个唯一的路径标识;节点 Znode 可以包含数据和子节点。Znode分为四种类型:
EPHEMERAL 类型的节点不能有子节点; 3.2 数据访问每个znode节点存储的数据都具有原子操作性,也就是说这个节点的数据要么同时被写入,要么都没有写入;读数据的时候要么同时读到,要么都读不到。另外,每一个节点都拥有自己的ACL列表,限定了用户对目标节点可以执行的操作,包括CREATE: 创建子节点的权限;READ: 获取节点数据和子节点列表的权限;WRITE: 更新节点数据的权限;DELETE: 删除子节点的权限;ADMIN: 设置节点ACL的权限。 注意:Znode 中的数据可以有多个版本,可以根据版本号访问对应节点数据。 4. zookeeper watcher监听机制ZooKeeper允许用户在指定节点上注册一些Watcher,当数据节点发生变化(数据内容发生变化或者子节点增减变化)的时候,ZooKeeper服务器会把这个变化的通知发送给感兴趣的客户端。Watcher 机制包括三个角色:客户端线程、客户端的 WatchManager 以及 ZooKeeper 服务器。具体过程有:
客户端回调 Watcher: 客户端在和 ZooKeeper 建立连接时,会启动 sendThread 和 eventThread 线程。sendThread 线程负责发送请求给服务端,同时也接收服务端发送过来的响应,当它判断到响应中的 XID 标识为 -1,便将它作为一个通知类型的响应,将响应中的信息进行序列化,交给 eventThread 线程处理。eventThread 会根据响应内容判断该通知对应的 Watcher 类型,从 ZKWatchManager 中取出所有相关的 Watcher,然后放到 waitingEvents 队列中,该队列时一个待处理 Watcher 的队列,eventThrad 每次从中取出一个 Watcher,然后进行串行同步处理,就是依次调用队列中 Watcher 的 process 的方法。 Watcher 特性总结:
5. zookeeper的选举机制?zookeeper中存在三种服务器角色,分别是Leader,Follower以及Observer,其中Observer仅仅作为一个监控协调者的作用,并不参与zookeeper对外提供服务以及zookeeper的选举。 服务器节点状态(每个节点有且只有一个状态):
在讲选举过程之前,先介绍几个关键概念:
ZAB(Zookeeper Atomic Broadcast),是为zk专门设计的一种支持崩溃恢复的原子广播协议,是Zookeeper保证数据一致性的核心算法。Zab借鉴了Paxos算法,但又不像Paxos那样,是一种通用的分布式一致性算法。 ZAB协议包括两种基本的模式,分别是:
整个集群启动过程中,或者当 Leader 服务器出现网络中断、崩溃退出或重启等异常时,ZAB协议就会进入崩溃恢复模式,选举产生新的Leader。当选举产生了新的 Leader,同时集群中有过半的机器与该 Leader 服务器完成了状态同步(即数据同步)之后,ZAB协议就会退出崩溃恢复模式,进入消息广播模式。这时,如果有一台遵守ZAB协议的服务器加入集群,因为此时集群中已经存在一个Leader服务器在广播消息,那么该新加入的服务器自动进入恢复模式:找到Leader服务器,并且完成数据同步。同步完成后,作为新的Follower一起参与到消息广播流程中。 进一步拆分,在崩溃恢复拆分为选举阶段和数据同步阶段,消息广播对应消息广播阶段。 5.1 选举阶段服务启动期间的选举
服务运行期间的选举 如果选举出来的leader节点宕机了,那么运行期间就会重新进行leader的选举。
5.2 数据同步阶段整个同步过程主要是leader将自身proposal事务发送给从属于自身的大多数follower,在确认大多数follower接收到事务消息后,通知他们更新事务,保证follower和leader事务一致。
数据同步包含3个主要值和4种形式:
直接差异化同步 DIFF同步 如果PeerLastZxid在minCommittedLog和maxCommittedLog之间,说明Learner服务器还没有完全同步最新的数据。
先回滚再差异化同步 TRUNC+DIFF同步 Leader刚生成一个proposal,还没有来得及发送出去就宕机了,重新选举之后作为Follower,但是新的Leader没有这个proposal数据。 这个时候follower多出来的数据要先进行回滚,回滚到和新的leader最接近的PeerLastZxid的事务,leader会先发送一个TRUNC命令,然后再执行差异化DIFF同步。 仅trunc同步 如果follower的PeerLastZxid大于maxCommittedLog的场景,新的leader会仅仅发送trunc命令,将follower的数据回滚到与leader一致; 全量同步 SNAP同步 适用于两个场景:
这两种场景下,Leader将会发送SNAP命令,把全量的数据都发送给Learner进行同步。 5.3?消息广播阶段消息广播流程:leader收到客户端的数据后,通知所有follower;follower收到事务处理消息后,保存事务记录到history中,并且返回响应给leader,告知已收到写事务;leader收到大多数follower的响应后,就会发起提交,通知所有follower去提交事务。然后重复上述流程,直到leader出现异常。
在进入消息广播阶段后,Leader 会为每一个 Follower 分配一个 FIFO 形式的队列进行通信,确保了同一时刻一个 Follower 只能和一个 Leader 保持同步,Leader 和 Follower 彼此之间通过心跳检测来感知。这个过程会一直持续,直到
6. zk有可能会出现数据不一致吗?zk可能出现数据不一致情况,分为3个场景来描述: 查询不一致 Zk的提案是过半成功即代表成功,如果查询的节点刚好不在过半范围内,查询出来的数据就会不一致。解决方案可以在读取前使用sync命令。 leader未发送proposal宕机 如上门数据同步所说,这个时候宕机leader的提案将会被抛弃; leader发送proposal成功,发送commit前宕机 发送proposal成功了,但将要发送commit命令前宕机了,如果重新进行选举,还是会选择zxid最大的节点作为leader,这个时候的提案不会被抛弃,新leader选举后会被重新同步到其他节点。 7. zk的脑裂问题所谓的脑裂问题,就是在同一个集群环境,存在多个leader。ZK为了避免脑裂的问题,给出了一个规定:集群中存活的节点数必须要超过总节点数的半数才能继续提供服务,而集群服务器数量是基数台。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:39:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |