Zookeeper 分布式协调服务介绍

分布式系统

分布式系统的简单定义:分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。

分布式系统的特征:

分布性:系统中的计算机在空间上随意分布和随时变动

对等性:系统中的计算机是对等的,没有主从之分

并发性:并发性操作是非常常见的行为

缺乏全局时钟:系统中的计算机具有明显的分布性,且缺乏一个全局的时钟序列控制,所以很难比较两个事件的先后

故障总是会发生:任何在设计阶段考虑到的异常情况,一定会在系统实际运行中发生,并且还会遇到很多在设计时未考虑到的异常故障

随着分布式架构的出现,越来越多的分布式应用会面临数据一致性问题。

选择Zookeeper

Zookeeper是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、master选举、分布式锁和分布式队列等功能。

Zookeeper致力于提供一个高性能、高可用,具有严格的顺序访问控制能力的分布式协调服务;其主要的设计目标是简单的数据模型、可以构建集群、顺序访问、高性能。Zookeeper已经成为很多大型分布式项目譬如Hadoop、HBase、Storm、Solr等中的核心组件,用于分布式协调。

Zookeeper可以保证如下分布式一致性特性

顺序一致性:从同一个客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到Zookeeper中去

原子性:所有事务请求的处理结果在整个集群中所有的机器上的应用情况是一致的

单一视图:无论客户端连接的是哪个Zookeeper服务器,其看到的服务器数据模型都是一致的

可靠性:一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来,除非有另一个事务又对其进行了变更

实时性:在一定的时间内,客户端最终一定能够从服务端上读取到最新的数据状态

Zookeeper服务架构图

Zookeeper 基本概念

集群角色

Leader:客户端提供读和写服务

Follower:提供读服务,所有写服务都需要转交给Leader角色,参与选举

Observer:提供读服务,不参与选举过程,一般是为了增强Zookeeper集群的读请求并发能力

会话 (session)

Zk的客户端与zk的服务端之间的连接

通过心跳检测保持客户端连接的存活

接收来自服务端的watch事件通知

可以设置超时时间

ZNode 节点

ZNode 是Zookeeper中数据的最小单元,每个ZNode上可以保存数据(byte[]类型),同时可以挂在子节点,因此构成了一个层次化的命名空间,我们称之为树

Zookeeper数据模型

节点是有生命周期的,生命周期由节点类型决定:

持久节点(PERSISTENT):节点创建后就一直存在于Zookeeper服务器上,直到有删除操作主动将其删除

持久顺序节点(PERSISTENT_SEQUENTIAL):基本特性与持久节点一致,额外的特性在于Zookeeper会记录其子节点创建的先后顺序

临时节点(EPHEMERAL):声明周期与客户端的会话绑定,客户端会话失效时节点将被自动清除

临时顺序节点(EPHEMERAL_SEQUENTIAL):基本特性与临时节点一致,但添加了顺序的特性

每个节点都有状态信息,抽象为 Stat 对象,状态属性如下:

czxid:节点被创建时的事务ID

mzxid:节点最后一个被更新时的事务ID

ctime:节点创建时间

mtime:节点最后一个被更新时间

version:节点版本号

cversion:子节点版本号

aversion:节点的ACL版本号

ephemeralOwner:创建该临时节点的会话的sessionID,若为持久节点则为0

dataLength:数据内容长度

numChildren:子节点数量

权限控制ACL (Access Control Lists)

CREATE:创建子节点的权限

READ:获取节点数据和子节点列表的权限

WRITE:更新节点数据的权限

DELETE:删除子节点的权限

ADMIN:设置节点ACL的权限

watcher机制

Zookeeper 引入watcher机制来实现发布/订阅功能,能够让多个订阅者同时监听某一个节点对象,当这个节点对象状态发生变化时,会通知所有订阅者。

Zookeeper的watcher机制主要包括客户端线程、客户端WatchManager、Zookeeper服务器三个部分。其工作流程简单来说:客户端在向Zookeeper服务器注册Watcher的同时,会将Watcher对象存储在客户端的WatchManager中;当Zookeeper服务器端触发Watcher事件后,会向客户端发送通知,客户端线程从WatchManager中取出对应的Watcher对象来执行回调逻辑

Zookeeper Watcher机制概述

可以设置的两种 Watcher

NodeCache

监听数据节点的内容变更

监听节点的创建,即如果指定的节点不存在,则节点创建后,会触发这个监听

PathChildrenCache

监听指定节点的子节点变化情况

包括新增子节点、子节点数据变更和子节点删除

客户端命令

Zookeeper的安装可参考官方文档

四字命令

四字命令可以查看Zookeeper服务器的一些信息,可以通过 telnet 和 nc 等方式执行四字命令,以执行 conf 命令为例

四字命令介绍

conf 命令用于输出Zookeeper服务器运行时的基本配置信息

cons 命令用于输出这台服务器上所有客户端连接的详细信息

crst 命令用于重置所有客户端的连接统计信息

dump 命令用于输出当前集群的所有会话信息

envi 命令用于输出Zookeeper所在服务器的运行时信息

ruok 命令用于输出当前Zookeeper服务器是否正在运行

stat 命令用于获取Zookeeper服务器的运行状态信息

srvr 命令与stat命令功能一致,但仅输出服务器自身的信息

srst 命令用于重置所有服务器的统计信息

wchs 命令用于输出当前服务器上管理的 watcher 的概要信息

wchc 命令用于输出当前服务器上管理的 watcher 的详细信息

wchp 命令与wchc功能非常相似,但输出信息以节点路径为单位进行归组

mntr 命令用于输出比stat命令更为详细的服务器统计信息

Curator 客户端代码实例

Curator 是 Apache 基金会的顶级项目之一,解决了很多Zookeeper客户端非常底层的细节开发工作,包括会话超时重连、反复注册Watcher、NodeExistsException异常等,提供了一套易用性和可读性更强的Fluent风格的客户端API框架,除此之外,curator还提供了Zookeeper各种应用场景(Recipe,如共享锁服务、master选举、分布式计数器等)的抽象封装。

Zookeeper 的核心提交者 Patrick Hunt 对 Curator 的高度评价:

Guava is to Java what Curator is to Zookeeper

示例 - 增删查改

示例 - 异步接口

示例 - watcher 事件监听 - NodeCache

示例 - watcher 事件监听 - PathChildrenCache

Zookeeper的典型应用场景

下一篇文章将使用 Curator 客户端来实现 Zookeeper 的典型应用场景的示例,这里简单概括一下Zookeeper的典型应用场景:

数据发布/订阅,即所谓的配置中心

负载均衡

命名服务

分布式协调/通知

集群管理

master 选举

分布式锁

分布式队列

参考:

《从Paxos到Zookeeper分布式一致性原理与实践》

关注_小旋锋_微信公众号

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190121A1B18800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券