上次我们了解了Zookeeper的概述,这次带大家了解一下Zookeeper的基本概念。
Zookeeper的基本概念分为以下几个:
集群角色、会话、数据节点、版本、watcher、ACL权限控制。
1.集群角色
在Zookeeper搭建的集群环境中,集群的角色分为Leader、Follower、Observer。
其中Leader服务器是整个Zookeeper集群工作机制中的核心,Follower服务器是Zookeeper集群状态的跟随者,Observer服务器充当一个观察者的角色。
我们这里了解以上几个角色即可,在后面的总结中,我们将深入探讨这些角色在实际中的运用。
2.会话
会话是指客户端和Zookeeper服务器的连接,Zookeeper中的会话叫Session,客户端与服务器建立一个TCP的长连接来维持一个Session,客户端在启动的时候会首先与服务器建立一个TCP连接,通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能向ZK服务器发送请求并获得响应。
3.数据节点
Zookeeper中的节点有两类
(1)集群中的一台机器成为一个节点
(2)数据模型中的数据单元Znode,分为持久节点和临时节点
Zookeeper的数据模型是一棵树,树的节点就是Znode,Znode可以保存信息。
一棵树的模型样例如下图:
上面的图是一棵树,有一个根节点,和下面的子节点。每一个子节点下又可以接一些子节点。后续我们会讲到,大多数Zookeeper的开发都是跟这些数据节点打交道,读写这些节点来和数据交互。
4.版本
我们在开发时通常会使用SVN来作为代码的管理,当代码出现错误时,我们可以回退到之前的某一个版本。
Zookeeper中的版本的含义与SVN中版本的含义有些区别,它的版本是用来记录节点数据或者是节点的子节点列表,或者是权限信息的修改次数(例如一个节点的version是1,这就代表这个节点在创建以来只被修改了一次)。
那么Zookeeper的版本如何使用呢?我们可以利用Zookeeper的版本实现锁服务。
我们知道,在数据库中有两种锁,分为悲观锁和乐观锁:
悲观锁又叫悲观并发锁,是数据库中一种非常严格的锁策略,具有强烈的排他性,能够避免不同事务对同一数据并发更新造成的数据不一致性,再上一个事务没有完成之前,下一个事务不能访问相同的资源,适合数据更新竞争非常激烈的场景。
悲观锁的实现一般都是使用一个statue字段(如1可用2不可用),当修改数据时,将statue取出,并设置成不可用(statue=2),然后执行需改语句,待完成之后,将statue更改回1,然后提交事务,就会避免其它操作修改本字段。
相比悲观锁,乐观锁使用的场景会更多,悲观锁认为事务访问相同数据的时候一定会出现相互的干扰,所以简单粗暴的使用排他访问的方式,而乐观锁认为不同事务访问相同资源很少出现相互干扰的情况,因此在事务处理期间不需要进行并发控制。当然乐观锁也是锁,它还是会有并发的控制,对于数据库我们通常的做法是在每个表中增加一个version版本字段,当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。事务修改数据之前先读出数据,当然版本号也顺势读出来,然后把读出来的版本号加入到更新语句的条件中。比如,读取出来的版本号是1,我们修改数据可的语句可以这样写:
update user_table set username = ‘张三‘ where id=1 and version = 1;
那如果更新失败了说明以后其它事务已经修改过数据了,那系统需要抛出异常给客户端,让客户自行处理,客户可以选择重试。
Zookeeper版本的作用与上面数据库的悲观和乐观锁有相似的用法,后续的使用过程中我们详细进行介绍。
Zookeeper的版本有以下几种:
5.watcher
watcher即事件监听器,Zookeeper允许用户在指定节点上注册一些watcher,当数据节点发生变化的时候,Zookeeper服务器会把这个变化的通知发送给感兴趣的客户端。
一个事件监听的大致情况如下:
上面是Zookeeper集群,下面两个客户端Client都在Zookeeper中注册了watcher(事件监听器),当Zookeeper中的节点数据发生变化时,会将变化的通知发送给客户端,客户端收到变化通知时,就会去Zookeeper中取得该数据的相关信息。
6.ACL权限控制
ACL是Access Control Lists的简写,Zookeeper采用ACL策略来进行权限控制,有以下权限:
CREATE:获取节点数据和子节点列表的权限
WRITE:更新节点数据的权限
DELETE:删除子节点的权限
ADMIN:设置节点ACL的权限
可以看到,Zookeeper的权限控制类似我们开发的信息管理系统的权限控制,我们在开发系统的时候也会对这些权限进行管理。一般ZK集群可能会服务与很多的业务,尤其是一些大公司,ZK集群中会保存许多重要的信息,那么这些信息通常只能对一部分的访问者进行开放,通过ACL我们可以对某些节点的访问权限进行控制,从而保重数据的安全性。