zookeeper核心技术

一、集中式,分布式

集中式系统指由一台或者多台计算机组成中心节点,数据和整个系统的业务单元都集中在这个中心节点上,系统的所有功能都是集中处理。

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

 

二、zookeeper简介

zookeeper是一个开放源代码的分布式协调服务,其目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

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

 

三、zookeeper基本概念

1、集群角色

典型的集群模式:Master/Slave(主备模式)。

zookeeper:Leader、Follower、Observer三种角色。

Leader:通过选举而来,提供读、写服务。

Follwer:提供读服务,可以参与选举过程。

Observer:提供读服务,不参与选举过程,不影响写服务的提升 读性能。

2、会话(session)

 在ZooKeeper 中,一个客户端连接是指客户端和 ZooKeeper 服务器之间的TCP长连接。

ZooKeeper对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测和服务器保持有效的会话,也能够向 ZooKeeper 服务器发送请求并接受响应,同时还能通过该连接接收来自服务器的 Watch 事件通知。

3.数据节点

zookeeper的结构其实就是一个树形结构,leader就相当于其中的根结点,其它节点就相当于 follow节点,每个节点都保留自己的内容。

zookeeper的节点分两类:持久节点和临时节点 (普通节点、顺序节点)

- 持久节点:

所谓持久节点是指一旦这个树形结构上被创建了,除非主动进行对树节点的移除操作,否则这个 节点将一直保存在 ZooKeeper 上。

- 临时节点:

临时节点的生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。

数据节点

4、Watcher

是ZooKeeper中一个很重要的特性。ZooKeeper允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去。该机制是ZooKeeper实现分布式协调服务的重要特性。

Watcher接口

事件处理器,定义了事件通知相关的逻辑,包括KeeperState和EventType两个枚举类(通知状态和事件类型)。定义了一个回调方法process(WatchEvent event)

同一个事件类型在不同的通知状态中代表的含义不同:

5、ACL权限控制

zookeeper的ACL(AUTH)

ACL(Access Control List),Zookeeper作为一个分布式协调框架,其内部存储的都是一些关于分布式系统运行时状态的元数据,尤其是设计到一些分布式锁,Master选举和协调等应用场景。我们需要有效地保障Zookeeper中的数据安全,Zookeeper提供了三种模式。权限模式,授权对象,权限。

权限模式:Scheme,开发人员最多使用的如下四种权限模式:

IP:ip模式通过ip地址粒度进行权限控制模式,例如配置了:192.168.110.135即表示权限控制都是针对这个ip地址的,同时也支持按网段分配,比如:192.168.110.*Digest:digest是最常用的权限控制模式,也更符合我们对权限控制的认识,其类似于"username:password"形式的权限标识进行权限配置。ZK会对形成的权限标识先后进行两次编码处理,粉笔是SHA-1加密算法和Base64编码。

World:World是一直最开放的权限控制模式。这种模式可以看做为特殊的Digest,他仅仅是一个标识而已。

Super:超级用户模式,在超级用户模式下可以对ZK任意进行操作。

权限对象:值得是权限赋予的用户或者是一个指定的实体,例如ip地址或机器等。在不同的模式下,授权对象是不同的。这种模式和权限对象一一对应。

权限:权限就是指那些通过权限检测后可以被允许执行的操作,在ZK中,对数据的操作权限分为以下五大类:

create,delete,read,write,admin。

 

四、zookeeper应用场景

1、数据发布与订阅

数据发布与订阅,即所谓的配置中心,顾名思义就是发布者将数据发布到 ZooKeeper节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和动态更新。

对于:数据量通常比较小。数据内容在运行时动态变化。集群中各机器共享,配置一致。

这样的全局配置信息就可以发布到 ZooKeeper上,让客户端(集群的机器)去订阅该消息。

发布/订阅系统一般有两种设计模式,分别是推(Push)和拉(Pull)模式。

- 推模式

服务端主动将数据更新发送给所有订阅的客户端

- 拉模式

客户端主动发起请求来获取最新数据,通常客户端都采用定时轮询拉取的方式。

ZooKeeper 采用的是推拉相结合的方式:

客户端想服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher事件通知,客户端接收到这个消息通知后,需要主动到服务端获取最新的数据。

2、命名服务

命名服务也是分布式系统中比较常见的一类场景。在分布式系统中,通过使用命名服务,客户端

应用能够根据指定名字来获取资源或服务的地址,提供者等信息。被命名的实体通常可以是集群中的

机器,提供的服务,远程对象等等——这些我们都可以统称他们为名字。

其中较为常见的就是一些分布式服务框架(如RPC)中的服务地址列表。通过在ZooKeepr里创建顺序节点,能够很容易创建一个全局唯一的路径,这个路径就可以作为一个名字。

ZooKeeper 的命名服务即生成全局唯一的ID。

3、分布式协调服务/通知

ZooKeeper中特有Watcher注册与异步通知机制,能够很好的实现分布式环境下不同机器,甚至不同系统之间的通知与协调,从而实现对数据变更的实时处理。使用方法通常是不同的客户端如果 机器节点 发生了变化,那么所有订阅的客户端都能够接收到相应的Watcher通知,并做出相应的处理。

ZooKeeper的分布式协调/通知,是一种通用的分布式系统机器间的通信方式。

4、分布式锁

排它锁

ZooKeeper如何实现排它锁?

定义锁

ZooKeeper 上的一个 机器节点 可以表示一个锁

获得锁

把ZooKeeper上的一个节点看作是一个锁,获得锁就通过创建临时节点的方式来实现。

ZooKeeper 会保证在所有客户端中,最终只有一个客户端能够创建成功,那么就可以认为该客户端获得了锁。同时,所有没有获取到锁的客户端就需要到/exclusive_lock 节点上注册一个子节点变更的Watcher监听,以便实时监听到lock节点的变更情况。

释放锁

因为锁是一个临时节点,释放锁有两种方式

当前获得锁的客户端机器发生宕机或重启,那么该临时节点就会被删除,释放锁正常执行完业务逻辑后,客户端就会主动将自己创建的临时节点删除,释放锁。

共享锁

共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个EPHEMERAL_SEQUENTIAL目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。

5、Master选举

1)每个Server发出一个投票。由于是初始情况,ZK1和ZK2都会将自己作为Leader服务器来进行投票,每次投票会包含所推举的服务器的myid和ZXID,使用(myid, ZXID)来表示,此时ZK1的投票为(1, 0),ZK2的投票为(2, 0),然后各自将这个投票发给集群中其他机器。

(2)接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器。

(3) 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行比较,规则如下

· 优先检查ZXID。ZXID比较大的服务器优先作为Leader。

· 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。

对于ZK1而言,它的投票是(1, 0),接收ZK2的投票为(2, 0),首先会比较两者的ZXID,均为0,再比较myid,此时ZK2的myid最大,于是ZK2胜。ZK1更新自己的投票为(2, 0),并将投票重新发送给ZK2。

(4) 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于ZK1、ZK2而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出ZK2作为Leader。

(5)改变服务器状态。一旦确定了Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING。当新的Zookeeper节点ZK3启动时,发现已经有Leader了,不再选举,直接将直接的状态从LOOKING改为FOLLOWING。

 

 

以上所讲到的就是zookeeper的核心概念和应用价值。

 

更多推送文章请关注公众号:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值