这篇文章我们来看下zk底层数据存储的技术细节,在ZooKeeper中,数据存储分为内存数据存储和磁盘数据存储 1. 内存数据 ZooKeeper的数据模型是一棵树,可以类比为一个内存数据库,存储了整棵树的内容,包括节点路径,节点数据及其ACL信息等,ZooKeeper会定时将这个数据存储到磁盘上。接下来看一下几个关键的数据模型。 1.1. DataTree ZooKeeper内存数据存储的核心组件,代表了内存中一份完整的数据 。 DataTree 的数据结构如下: 1.2. DataNode DataNode是数据存储的最小单元,包含着对父节点的引用。还有其他几个属性 byte [] data : 保存节点的数据 Long acl: acl map长度 StatPersisted stat :节点状态 Set<String> children : 当前节点的子节点列表 还提供了几个操作接口: 添加子节点:往set集合中添加子节点信息 public synchronized boolean addChild(String child) { if (children == n....
前面几篇文章讲了服务器启动的流程,对于选举过程是一笔带过,这篇文章主要讲述Leader选举的实现细节。 Leader 选举是ZooKeeper中最重要的技术之一,也是保证分布式数据一致性的关键所在。我们从选举算法概述、服务器启动Leader选举、服务器运行期间Leader选举三个方面探讨实现细节。 1. 选举算法概述 服务器启动期间Leader选举 选举的条件是集群中至少有两台机器。主要流程如下: 每个server发出一个投票 接收各个服务器的投票消息 处理投票 统计投票 改变服务器状态 服务器运行期间的Leader选举 ZooKeeper集群在正常运行过程中,是不会进行leader选举过程的,只有当Leader机器挂掉之后,才会进行新一轮的Leader选举。选举过程和服务器启动期间Leader选举是一致的。 变更状态 每个server发出一个投票 接收来自各个服务器的投票 处理投票 统计投票 改变服务器状态 QuorumPeer.OrderState定义了服务器的四种状态,分表是: LOOKING: 寻找Leader状态,服务器处于该状态时,表示集群中没有leader,需要进入lea....
开发人员主要使用zk的客户端,所以我们先来了解zk客户端的创建过程原理。 1. 概述 zk客户端的核心组件如下: ZooKeeper实例 :客户端入口 ClientWatcherManager :客户端Watcher管理器 HostProvider:客户端地址列表管理器 ClientCnxn:客户端核心线程。包含两个线程,即SendThread和EventThread。前者是一个I/O线程,主要负责ZooKeeper客户端和服务端之间的网络I/O通信,后者是一个事件线程,主要负责对服务端事件进行处理。 类图说明: ZooKeeper客户端的初始化与启动环节,实际上就是ZooKeeper对象的实例化过程,分析一个zk客户端的构造方法: public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly, HostProvider aHostProvider, ZKClientConfi....
业界存在不少消息中间件产品,实现各不相同。这篇文章主要介绍基于ZooKeeper实现的分布式队列。分布式队列,简单来说分为两大类,一种是常规的先入先出队列,另一种是要等到所有元素集聚之后才能统一安排执行的Barrier模型。 1. FIFO:先入先出 FIFO队列是一种非常典型的按序执行的队列模型:先进入队列的请求操作完成后,才会开始处理后面的请求。 使用zk实现FIFO队列,和zk对于共享锁的实现类似。FIFO队列就类似于一个全局的共享锁模型。所有客户端都会到一个节点(比如queue_fifo)下创建一个临时顺序节点。 创建完节点,根据如下四个步骤确定执行顺序。 1.通过调用getChildren() 接口来获取 /queue_fifo节点下的所有子节点,即获取队列中的所有元素。 2.确定自己的节点序号在所有子节点中的顺序 3.如果自己不是序号最小的子节点,那么就需要进入等待,同时向比自己序号小的最后一个节点注册Watcher监听 4.接收到Watcher通知后,重复步骤1 整个通过流程如下图所示: 2. Barrier:分布式屏障 Barrier在分布式系统中特指系统之间的一个协....
本文章先概述一下zk的主要应用场景,然后重点讲述其分布式锁的实现。 1.应用场景概述 1.1.数据发布/订阅 数据发布/订阅系统,即所谓的配置中心。意思就是发布者将数据发布到zk的n个节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。 1.2.负载均衡 zk作为路由,client从zk那里拿到可用的server地址(最好做个缓存),通过自己的负载均衡算法得到要连接的地址,client去连接指定server。server要做的是,当server启动后去zk注册自己(创建临时文件),子节点变化时(比如当某台server宕机),server与zk的链接会断掉,zk会自动删除该临时文件。 1.3.命名服务 命名服务是分布式系统中最基本的公共服务之一。要命名的对象包括集群中的机器列表,服务名称等。zk实现命名服务的方式:通过调用zk节点创建的API接口创建一个顺序节点,并且在API返回值中返回这个节点的完整名字。 1.4.分布式协调/通知 zk中特有的Watcher注册与异步通知机制,能够很好的实现分布式环境下不同机器,甚至是不同系统之间的协调与....