zookeeper是什么
zookeeper是一个开源的分布式协调服务,是由雅虎创建的,基于google chubby。是分布式数据一致性的解决方案。
zookeeper的特性
顺序一致性
从同一个客户端发起的事务请求,最终会严格按照顺序被应用到zookeeper中
原子性
所有的事务请求的处理结果在整个集群中的所有机器上的应用情况是一致的,也就是说,要么整个集群中的所有机器都成功应用了某一事务、
要么全都不应用
可靠性
一旦服务器成功应用了某一个事务数据,并且对客户端做了响应,那么这个数据在整个集群中一定是同步并且保留下来的
实时性
一旦一个事务被成功应用,客户端就能够立即从服务器端读取到事务变更后的最新数据状态;(zookeeper仅仅保证在一定时间内,近实时)
单机环境安装
1.下载zookeeper的安装包
http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.8.tar.gz
2.解压zookeeper
tar -zxvf zookeeper-3.4.8.tar.gz
3.cd 到 zookeeper-3.4.8/conf
mv zoo_sample.cfg zoo.cfg
4./zkServer.sh start启动zookeeper
5.sh zkCli.sh 客户端链接到zookeeper上
集群环境
zookeeper集群, 包含三种角色: leader / follower /observerleader:一个zookeeper 集群 只有一个leader,类似master/slave模式,客户端提交请求之后,先发送到leader,leader作为接收者,广播到每个server,在folloer上创建:也会同步到leader ,一个节点上的数据发生变化后,通知其他节点。
observer: Observer机器不参与选举,也不参与写操作的“过半写成功”策略,因此Observe可以在不影响写性能的情况下提升集群的读性能。
在zoo.cfg里面增加
server.1=192.168.1.41:2888:3888
server.2=192.168.1.45:2888:3888
server.3=192.168.1.46:2888:3888
server.id=host:port:port
id的取值范围: 1~255; 用id来标识该机器在集群中的机器序号
2888是zookeeper集群之间通信的端口
3888表示leader选举的端口
把zk节点制定为observer
peerType=observer
server.3=192.168.1.46:2888:3888:observer
data存储路径为:dataDir=/home/admin/zookeeper-3.4.8/tmp,计入tmp目录,创建myid,文件就一行数据,数据内容是每台机器对应的server ID的数字。
安装完毕!
zoo.cfg配置文件分析
tickTime=2000 zookeeper中最小的时间单位长度 (ms)
initLimit=10 follower节点启动后与leader节点完成数据同步的时间,10*2000(20秒)
syncLimit=5 leader节点和follower节点进行心跳检测的最大延时时间,5*2000(5秒)
dataDir=/tmp/zookeeper 表示zookeeper服务器存储快照文件的目录
dataLogDir 表示配置 zookeeper事务日志的存储路径,默认指定在dataDir目录下
clientPort 表示客户端和服务端建立连接的端口号: 2181
zookeeper的命令操作
1. create [-s] [-e] path data acl
-s 表示节点是否有序
-e 表示是否为临时节点
默认情况下,是持久化节点
create /test 123 创建名字为test的持久化节点 并赋值123
create -e /test 123 创建名字为test临时节点 并赋值123(临时节点,客户端断开将会被删除)
2. get path [watch]
获得指定 path的信息,返回一个stat
get /test
3.set path data [version]
修改节点 path对应的data
乐观锁的概念
数据库里面有一个 version 字段去控制数据行的版本号
set /test 234
4.delete path [version]
删除节点
delete /test (如有子节点 需先删除子节点)
stat信息
cversion = 0 子节点的版本号
aclVersion = 0 表示acl的版本号,修改节点权限
dataVersion = 1 表示的是当前节点数据的版本号
czxid 节点被创建时的事务ID
mzxid 节点最后一次被更新的事务ID
pzxid 当前节点下的子节点最后一次被修改时的事务ID
ctime = Sat Aug 05 20:48:26 CST 2017
mtime = Sat Aug 05 20:48:50 CST 2017