本案例用四台服务器搭5个zk节点
10.51.0.27
10.51.0.28
10.51.0.29
10.51.0.30
在4台服务器分别安装zookeeper,其中27服务器安装亮个节点
官网下载地址
http://mirrors.hust.edu.cn/apache/zookeeper/
//除了27 其他服务器都做相应操作
mkdir /data/zookeeper
cd /data/zookeeper
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
解压到 /data/zookeeper/目录下
tar -zvxf apache-zookeeper-3.6.1-bin.tar.gz
mkdir zoo1 zoo2
//复制解压后的文件到两个子文件夹下 # 27-30 服务器
cp ./apache-zookeeper-3.6.1-bin ./zoo1
mv ./apache-zookeeper-3.6.1-bin ./zoo2
修改配置文件
# 27-30 服务器
cp /data/zookeeper/zoo1/conf/zoo_sample.cfg /data/zookeeper/zoo1/conf/zoo.cfg
vim /data/zookeeper/zoo1/conf/zoo.cfg
# 27服务器
cp /data/zookeeper/zoo2/conf/zoo_sample.cfg /data/zookeeper/zoo2/conf/zoo.cfg
vim /data/zookeeper/zoo2/conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/data/zookeeper/zoo1/dataDir
dataLogDir=/data/zookeeper/zoo1/dataLogDir
#端口
clientPort=2181
//配置各个zk的通讯端口
server.1=10.51.0.27:3111:3112
server.2=10.51.0.27:3113:3114
server.3=10.51.0.28:3115:3116
server.4=10.51.0.29:3117:3118
server.5=10.51.0.30:3119:3120
创建数据存储目录和日志目录
mkdir /data/zookeeper/zoo1/dataDir /data/zookeeper/zoo1/dataLogDir
创建myid文件, id 与 zoo.cfg 中的service后序号对应
#在10.51.0.27上
echo 1 > /data/zookeeper/zoo1/dataDir/myid
echo 2 > /data/zookeeper/zoo2/dataDir/myid
#在10.51.0.28上
echo 3 > /data/zookeeper/zoo1/dataDir/myid
#在10.51.0.29上
echo 4 > /data/zookeeper/zoo1/dataDir/myid
#在10.51.0.30上
echo 5 > /data/zookeeper/zoo1/dataDir/myid
启动服务
27-30服务器
/data/zookeeper/zoo1/bin/zkServer.sh start
# 27服务器
/data/zookeeper/zoo2/bin/zkServer.sh start
查看状态
/data/zookeeper/zoo1/bin/zkServer.sh status
使用客户端命令连接服务端
bin/zkCli.sh -server localhost:2181
注意: localhost是连接本地节点的服务端,也可以换成集群中的其他节点的服务端。
zk角色分配
角色 | 描述 | |
---|---|---|
领导者(Leader) | 领导者负责进行投票的发起和决定,更新系统状态 | |
学习者(Learner) | 跟随者(Follower) | 跟随者(Follower)用于接收客户端请求并向客户端返回结果,在选主过程中参与投票 |
观察者(ObServer) | 观察者(ObServer)可以接收客户端连接,将写请求转发给leader节点,但ObServer不参与投票过程,只同步leader的状态,ObServer的目的是为了拓展系统,提高读取速度 | |
客户端(Client) | 请求发起方 |
配置说明
参数 | 说明 |
---|---|
tickTime | 这个时间是作为Zookeeper服务器之间或者客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一下心跳。 |
initLimit | 这个配置项是用来配置zookeeper接受客户端的(这里所说的客户端不是用户连接Zookeeper服务器的客户端而是Zookeeper服务器集群中连接到Leader的Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后Zookeeper服务器还没有接到客户端的返回信息,那么表明这个客户端连接失败。总时间长度就是10*2000=20秒。 |
syncLimit | 这个配置项标示Leader与Follower之间发送消息、请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。 |
dataDir | Zookeeper保存数据的目录,默认情况下,Zookeeper将数据的日志文件也保存在这里。 |
dataLogDir | 日志存储目录 |
clientPort | 这个端口就是客户端连接Zookeeper服务器的端口。Zookeeper会监听这个端口,接受客户端的访问请求。 |
server.A=B:C:D | 其中A是一个数字,标示这是第几号服务器;B是这个服务器的ip地址;C标示的是这个服务器与集群中的Leader服务器交换信息的端口;D标示的是万一集群中Leader服务器挂了,需要一个端口来进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于B都是一样,所以不同的Zookeeper实例通信端口号不能一样,所以要给他们分配不同的端口号。 |
myid | 集群模式下配置一个文件myid,这个文件在daraDir目录下,这个文件里面就有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。 |
基础命令操作
- help
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
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 [-b batch size]
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
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]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
version
[zk: localhost:2181(CONNECTED) 1]
- ls 查看
- get 获取节点数据和更新信息
get内容为空
cZxid :创建节点的id
ctime : 节点的创建时间
mZxid :修改节点的id
mtime :修改节点的时间
pZxid :子节点的id
cversion : 子节点的版本
dataVersion : 当前节点数据的版本
aclVersion :权限的版本
ephemeralOwner :判断是否是临时节点
dataLength : 数据的长度
numChildren :子节点的数量
- stat 获得节点的更新信息
- ls2 ls命令和stat命令的整合
- create 创建节点
create [-s] [-e] [-c] [-t ttl] path [data] [acl] 可以注意一下各个版本的变化
- create -e 创建临时节点
- create -s 创建顺序节点 自动累加
- set path data [version] 修改节点
- delete path [version] 删除节点
- ....