Distributed System: ZooKeeper系列之一 (组件)

这期文章,参考Linux 爱好者公众号的文章《ZooKeeper原理及其在Hadoop和HBase中的应用》而归纳整理的。


集群的节点角色

在ZooKeeper中,有三种角色:

Leader
Follower
Observer

一个ZooKeeper集群同一时刻只会有一个Leader,其他都是Follower或Observer。默认情况下,在确定了Leader之后(通过选举),如果没有设置该节点为Observer,默认成为Follower。


在装有ZooKeeper的机器的终端执行 zookeeper-server status 可以看当前节点的ZooKeeper是什么角色(Leader or Follower)。


(图片来源转载文章):




Observer和Follower的区别在于:

Follower和Observer都能提供读服务,不能提供写服务。两者唯一的区别在于,Observer机器不参与Leader选举过程,也不参与写操作的『过半写成功』策略,因此Observer可以在不影响写性能的情况下提升集群的读性能。总而言之,Observer不参与民主过程。不参与选择Leader,不具有写的投票权。但是,其能跟随决策更新自身的数据,以提供读功能。


根据 http://blog.csdn.net/firehotest/article/details/60312648 里面提到的内容可知,所有的读操作,任何节点都可以自己处理。所有的写操作,都上交给Leader节点进行处理。所以,Leader节点是唯一一个既能处理读,又能处理写的节点。


什么是会话(Session)?


Session指的是某个Client和集群的某个节点的Socket及其上下文的抽象。在ZooKeeper中,一个客户端连接是指客户端和ZooKeeper服务器之间的TCP长连接。ZooKeeper对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了。


这个连接主要承担三个功能:

1)客户端能够通过心跳检测和服务器保持有效的会话;

2)能够向ZooKeeper服务器发送请求并接受响应

3)通过该连接接收来自服务器的Watch事件通知。


而Session的存在有一个重要的意义:Session的SessionTimeout值用来设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在SessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。


什么是数据节点(ZNode)?


ZooKeeper将所有数据存储在内存中,数据模型是一棵树(ZNode Tree),由斜杠(/)进行分割的路径,就是一个ZNode,如/hbase/master,其中hbase和master都是ZNode。


在谈到分布式的时候,一般『节点』指的是组成集群的每一台机器。而ZooKeeper中的数据节点是指数据模型中的数据单元,称为ZNode。Znode与物理节点没有一对一的关系。其只不过是内存中的一部分内容的抽象(就像文件是对磁盘的内容的抽象一样)。


ZooKeeper还允许用户为每个节点添加一个特殊的属性:SEQUENTIAL。一旦节点被标记上这个属性,那么在这个节点被创建的时候,ZooKeeper就会自动在其节点后面追加上一个整型数字,这个整型数字是一个由父节点维护的自增数字。


在ZooKeeper中,ZNode可以分为持久节点和临时节点两类。


持久节点:


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


临时节点:


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


Znode存储的内容除了对应的数据之外,还维护一个叫作Stat的数据结构,Stat中记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode子节点的版本)和aversion(当前ZNode的ACL版本)。每当ZNode中的数据更新时,版本号都会递增。例如,当客户端获取数据时,它(客户端)也会接收到此数据对应的版本号。当此客户端下次执行更新(或删除)数据操作时,它必须向ZNode提供这些数据的版本号(是客户端当前持有的版本号)。如果此版本号与ZNode本身的版本号不一致,即其他客户端已经更新了此数据,那么此更新就会执行失败。


ZooKeeper如何确保执行顺序?PAXOS用的ID是什么?


在ZooKeeper中,能改变ZooKeeper服务器状态的操作称为事务操作(Transaction)。一般包括数据节点创建与删除、数据内容更新和客户端会话创建与失效等操作。对应每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID,用ZXID表示,通常是一个64位的数字。每一个ZXID对应一次更新操作,从这些ZXID中可以间接地识别出ZooKeeper处理这些事务操作请求的全局顺序。


什么是Watcher?


ZooKeeper允许用户(Client)在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去。


什么是ACL(Access Control Lists)?


ZooKeeper采用ACL(Access Control Lists)策略来进行权限控制。ZooKeeper定义了如下5种权限。


CREATE: 创建子节点的权限。
READ: 获取节点数据和子节点列表的权限。
WRITE:更新节点数据的权限。
DELETE: 删除子节点的权限。
ADMIN: 设置节点ACL的权限。


注意:CREATE 和 DELETE 都是针对子节点的权限控制。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值