01 Zookeeper介绍、安装及简单使用
-
下载并解压
-
复制并重命名配置文件
cp conf/zoo_sample.cfg conf/zoo.cfg
2.1 打开配置文件(配置中最重要的两个项目是clientPort和dataDir)
重新配置自己的dataDir:/home/kouzi/code/zookeeper/myDataDir(建议但不必要). -
使用
./zkServer.sh start
启动Zookeeper服务。 -
打开
./zkCli.sh
客户端
查看当前zooKeeper中的znode:ls -R /
创建znode:create /app1
-
打开两个cli客户端,实现一个锁.
cli1: create -e /lock # 建立临时znode,也就是加锁
cli2: create -e /lock # 加锁失败
cli2: stat -w /lock # 监控znode,等待锁被释放
cli1: quit # 此时第二个客户端会收到一个watch事件,便可以进行加锁了。
**集群安装**
- 关闭防火墙
systemctl stop firewalld.service
- 每个配置文件
zoo.cfg
中增加内容
# 2888 与集群中leader服务器交换信息的端口
# 3888 是选举时的专用端口
server.1=192.168.107.130:2888:3888
server.2=192.168.107.131:2888:3888
server.3=192.168.107.132:2888:3888
- 每个 zookeeper 下的dataDir目录下创建一个
myid
文件, 存放对应的序号
Zookeeper是一个分布式协调服务,它给出了在分布式环境下一致性问题的工业解决方案。
Zookeeper 的基础知识分为三大模块:
- 数据模型
- ACL 权限控制
- Watch 监控
数据模型就是Zookeeper用来处理和存储数据的一种逻辑结构。Zookeeper中的数据模型是一种树形结构,类似于计算机中的文件系统。Zookeeper中的节点类型分为三种类型: - 持久节点 顾名思义,一旦将节点创建为持久节点,该数据节点会一直存储在Zookeeper服务器上,即使创建该节点的客户端与服务器的会话关闭了,该节点依然不会被删除。想要删除,需要显式调用delete函数进行删除操作。
-
临时节点
当创建该临时节点的客户端会话因超时或发生异常而关闭时,该节点也相应在Zookeeper服务器上被删除。同样,我们也可以像显式删除临时节点。 -
有序节点
有序节点并不算一种单独种类的节点,它只是在之前的持久节点和临时节点的基础上增加了节点有序的性质。所谓节点有序,是说我们在创建有序节点的时候,Zookeeper会自动使用一个单调递增的数字作为后缀,追加到我们创建节点的后边。
Zookeeper中每个节点都维护有一些相同的内容:一个二进制数组(byte data[]),用来存储节点的数据、ACL访问控制信息、子节点数据,以及一个记录自身状态信息的字段stat。(因为临时节点不允许有子节点,所以其子节点字段为null)
在Zookeeper客户端中,执行 `stat 节点名称` 可以看到节点的状态信息:
# 状态属性 : 说明
czXid : 数据节点被创建时的事务ID
mzxid : 该节点最后一次被更新时的事务ID
pzxid : 该节点的子节点列表最后一次被修改时的事务ID
ctime : 该节点的创建时间
mtime : 该节点最后一次被更新的时间
version : 数据节点的版本号
cversion :子节点的版本号
aversion :节点的ACL版本号
ephemeralOwner : 创建该临时节点的会话 SessionID 如果该节点是持久节点,那么这个属性值是0
dataLength : 数据内容的长度
numChildren : 当前节点的子节点个数
# Zookeeper 为数据节点引入了版本的概念,每个数据节点有三种类型的版本信息,对数据节点的任何操作都会引起版本号的变化。Zookeeper 的版本信息表示的是对节点数据内容、子节点信息或者ACL信息的修改次数
- 悲观锁认为进程对临界区的竞争总是会出现,为了保证进程在操作数据时,该节点数据不被其他进程修改。数据会一直处于被锁定的状态。可以通过不同进程在Zookeeper中竞争创建临时节点的方式来实现悲观锁,并通过在服务器端添加监听来通知其他进程重新获取锁。
- 乐观锁认为,进程对临界区资源的竞争不会总是出现,不会全程加锁,而是在数据进行提交更新时,对数据的冲突进行检测,如果发现冲突了,则拒绝操作。乐观锁基本可以分为读取、校验、写入三个步骤。在Zookeeper中version属性就是用来实现乐观锁机制中的校验的。