Zookeeper学习----zookeeper搭建与使用

1.简介

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口!

在这里插入图片描述数据模型:类似与文件系统
ZooKeeper提供的命名空间很像标准的文件系统。名称是由斜杠(/)分隔的路径元素序列。ZooKeeper命名空间中的每个节点都由路径标识。
在这里插入图片描述ZooKeeper非常快速和简单。但是,由于它的目标是作为构建更复杂的服务(如同步)的基础,所以它提供了一组保证。这些都是:

  1. 顺序一致性——来自客户端的更新将按照它们被发送的顺序被应用。
  2. 原子性——更新成功或失败。没有部分结果。
  3. 统一视图——客户机将看到服务的相同视图,而不管它连接到哪个服务器。也就是说,即使客户端故障转移到具有相同会话的不同服务器上,客户端也永远不会看到系统的旧视图。
  4. 可靠性——一旦应用了更新,它将从那时起一直持续,直到客户端覆盖更新。
  5. 时效性——保证客户端对系统的看法在一定的时间范围内是最新的。

4. zookeeper集群搭建

4.0 集群规划

节点名称 ip myid
study-01 192.168.127.201 1
study-02 192.168.127.202 2
study-03 192.168.127.203 3

4.1 解压zookeeper压缩包
#解压
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C 文件目录
#修改文件名
mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7				
4.2 修改配置文件
# 创建zk数据存储目录
cd /zookeeper-3.5.7
mkdir zkData
# 新增myid
cd zkData
echo 1 > myid
#修改配置文件
cd ../
cd conf/
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
#修改目录
dataDir=/opt/zookeeper-3.5.7/zkData
#在最后添加
server.1=192.168.127.201:2888:3888
server.2=192.168.127.202:2888:3888
server.3=192.168.127.203:2888:3888

#启动
./zkServer.sh start
#查看节点状态
./zkServer.sh status
#关闭
./zkServer.sh stop
#启动zk客户端
zkCli.sh
或
zkCli.sh 192.168.127.202:2181
#退出
quit

4.3 配置文件说明
# The number of milliseconds of each tick
# 心跳时间 单位毫秒
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
# 初始化时允许的最大心跳 10 * tickTime
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
# 同步数据允许的最大心跳 5 * tickTime
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
# zk数据存储的目录
dataDir=/opt/zookeeper-3.5.7/zkData
# the port at which the clients will connect
#客户端端口
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
# 集群节点信息 格式:server.myid=节点ip:主从节点通信端口:主从切换投票端口
server.1=192.168.127.201:2888:3888
server.2=192.168.127.202:2888:3888
server.3=192.168.127.203:2888:3888

5. 基本命令使用

5.0 节点类型

1. 持久化+无序节点
2. 持久化+有序节点
3. 临时+无序节点
4. 临时+有序节点

持久化和临时节点:持久化节点创建与会话无关,创建后所会话可见。临时节点创建与当前会话有关,会话结束,节点就会被删除。
有序节点和无序节点:有序节点会在ZNode后面加上一个自增的序列化号,此序列号有父节点进行维护自增。

5.1 客户端命令行

ZooKeeper -server host:port cmd args
	addauth scheme auth
	close 
	config [-c] [-w] [-s]
	connect host:port
	create [-s] [-e] [-c] [-t ttl] path [data] [acl]
	delete [-v version] path
	deleteall path
	delquota [-n|-b] path
	get [-s] [-w] path
	getAcl [-s] path
	history 
	listquota path
	ls [-s] [-w] [-R] path
	ls2 path [watch]
	printwatches on|off
	quit 
	reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
	redo cmdno
	removewatches path [-c|-d|-a] [-l]
	rmr path
	set [-s] [-v version] path data
	setAcl [-s] [-v version] [-R] path acl
	setquota -n|-b val path
	stat [-w] path
	sync path

5.1.1 节点创建

  1. 创建持久化+无序节点
# create 节点路径 节点值
create /ikun 'cxk'
ls /
#查询节点详细信息
ls -s /ikun  
#返回的节点详细信息
cZxid = 0x100000004				#创建的事务id
ctime = Sun Jul 10 01:56:50 CST 2022		#创建的时间
mZxid = 0x100000004				#修改的事务id
mtime = Sun Jul 10 01:56:50 CST 2022		#修改的时间
pZxid = 0x100000004				# 子节点修改事务id
cversion = 0
dataVersion = 0					
aclVersion = 0					
ephemeralOwner = 0x0			# 临时节点所有者
dataLength = 3						# 节点值长度
numChildren = 0					#子节点个数

在这里插入图片描述

  1. 创建持久化+有序节点
create -s /ikun/chang "chang"

在这里插入图片描述

  1. 创建临时节点+无序节点
create -e /ikun/tiao "tiao"

在这里插入图片描述

  1. 创建临时节点+有序节点
create -e -s /ikun/rap "rap"

在这里插入图片描述

5.1.2 节点查询

get /ikun
get -s /ikun
get -w /ikun

在这里插入图片描述

5.1.3 修改节点信息

set /ikun/tiao "5 i cxk"
get /ikun/tiao
set -v 2 /ikun/tiao "ni gan ma"

5.1.4 删除节点

#删除单个节点
delete /ikun/chang0000000000
#删除节点以及子节点
deleteall  /ikun

5.1.5 监听节点

#监听节点值的变化
get -w /ikun

#监听节点的变化
ls -w /ikun

注意:监听某个节点只会监听节点一次,想要再次监听需要重新注册
在这里插入图片描述

节点信息:
**cZxid:**表示这个节点目录被创建时的事务id。在zookeeper集群中,只有leader节点才可以进行数据的写操作,其他从节点接受到写操作会调用主节点进行执行,然后所有节点进行数据同步。由于所有写操作都是leader节点执行,所有写操作会在leader节点进行排序,每执行一个写操作,事务id就会自增1.每一个写操作都会有一个唯一的事务id.事务id总共有64位,前32表示leader节点选举了几次,以后每选举一次,都会自增。后32位表示执行的写操作次数。首次启动从0x10000000开始,切换leader事务会从0x200000000开始计数。
**mZxid:**表示这个节点被修改的事务id。
pZxid表示这个节点以及子节点最新被创建的事务id。
ephemeralOwner表示这节点时持久节点还是短暂节点。通过create -e的方式可以创建短暂节点。短暂节点,这个属性位此次连接的session。如果连接关闭,节点就会被删除。每次客户端连接leader节点都会占用一个事务把session保存起来,并且同步到从节点中。

3.内部运行机制

paxos算法

zookeeper首次启动时,集群处于LOOKING状态,由于没有进行任何事务的提交,会根据myid最大的作为leader。如果zookeeper集群同时启动服务时,会根据myid最大的那一个作为leader。如果zookeeper集群一台一台启动时,当集群半数节点都已经起来时,会从这些已启动的节点中选取最大的myid作为leader。除了leader节点之外,其他节点时follower或者observer节点(当zookeeper集群节点很多时,当选取leader时会很难在很短的时间内得到选取结果,为了解决这个情况,会选取一部分节点作为follower,没被选上的作为observer。在zoo.cfg配置时,在节点后面加上observer。只有follower有选举和被选举的权利,observer没有选举权利)。
集群启动后,只有leader节点可以进行写操作,而follower只能进行读操作。当客户端cli请求follower节点时,如果涉及写操作的请求时,follower节点会通过2888端口把写操作请求发给leader节点。leader接收到请求后,会把自身的zxid(事务id,根据事务,线性增长)加1,然后会通过3888端口放入队列中发送给所有的follower节点,尝试把事务操作写入节点的log日志中。把如果半数以上的节点返回ok,leader节点会把请求以消息队列的方式分发到各个节点之上,并且接收到消息的节点会进行写操作和leader节点数据同步。
集群运行一段时间后,当leader由于某种原因宕机时,集群会进入LOOKING状态,此时会在follower节点中进行选举leader,此时的选举会根据zxid和myid进行选举,首先会根据zxid最大的节点中选取myid最大的节点作为leader。如果集群的节点数小于N/2+1时,zk服务会暂停接受请求,进程仍然存在,等待节点恢复 。
在这里插入图片描述

4.数据模型

zookeeper中数据模型时znode目录结构
节点间具有父子关系
层次的,目录型结构,便于管理逻辑关系
节点znode而非文件file
znode信息
包含最大1MB的数据信息
记录了Zxid等元数据信息
节点类型
Znode有两种类型,短暂的(ephemeral)和持久的(persistent)
Znode支持序列SEQUENTIAL:leader
短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点
持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除
Znode的类型在创建时确定并且之后不能再修改
Znode有四种形式的目录节点
PERSISTENT
EPHEMERAL
PERSISTENT_SEQUENTIAL
EPHEMERAL_SEQUENTIAL

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值