Zookeeper的介绍与基本部署
目录
简介
zookeeper是一个为分布式应用所设计的分布式的、开源的协调服务。它提供了一项基本服务:分布式锁服务,同时也提供了分布式应用数据的维护和管理机制,包括统一命名服务、状态同步服务、集群管理、分布式消息队列、分布式应用配置项的管理等。zookeeper支持独立安装以及集群部署。
zookeeper官方网站:http://zookeeper.apache.org/
zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/
架构
Zookeeper集群主要角色有Server和Client,其中Server分为Leader、Follower和Observer三个角色:
- Leader:领导者角色,主要负责投票的发起和决议,以及更新系统状态
- Follower:跟随者角色,用于接收客户请求并向客户端返回结果,在选主过程中参与投票
- Observer:Observer可以接收客户端连接,将写请求转发给leader。但observer不参加投票,只同步leader状态。observer的目的是为了扩展系统,提高读取速度。
- Client:客户端,用于向zk发起请求。
zk集群中每个server在内存中存储一份数据。在zk启动时,将从实例中选举一个server作为leader,leader负责处理数据更新等操作,当且仅当大多数server在内存中成功修改数据,才认为数据修改成功。
zk写的流程:
- 客户端首先和一个server或者observer通信,发起写请求
- server将写请求转发给leader
- leader再将写请求转发给其他server,其他server在接收到写请求后写入数据并响应leader
- leader在接收到大多数写成功回应后,认为数据写成功
- server响应client,完成一次写操作
安装
StandAlone模式
1. 安装
tar xf zookeeper-3.4.14.tar.gz -C /usr/local/
cd /usr/local/
ln -s zookeeper-3.4.14 zookeeper
# 创建数据目录和日志目录
mkdir /usr/local/zookeeper/{data,logs}
注: zk的安装依赖java,所以需要先安装jdk
2. 修改配置
cd /usr/local/zookeeper/conf
cp zoo_sample.conf zoo.conf
#vim zoo.conf
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
clientPort=2181
配置项说明:
- tickTime: zk中使用的基本时间单元,单位为毫秒,用于控制心跳和超时。更低的tickTime值可以更快的发现超时问题
- initLimit:zk集群中follower初始化连接到leader时,最长能忍受多少个tickTime,默认值为10,即为20s
- syncLimit:用于配置leader和follower间进行心跳检测的最大超时时间。如果在设置的时间内followers无法与leader进行通信,那么follower将会被丢弃。默认值为5,即10s
- dataDir:zk用于存储内存数据库快照的目录。如果不指定dataLogDir参数,则数据库更新的事务日志也将会存储在该目录下
- dataLogDir:指定zk事务日志的存储目录
- clientPort:服务器监听客户端连接的端口,默认值为2181
- maxClientCnxns:限制单个客户端与单台服务之间的并发连接数,默认值为60,设置为0则不限制
- autopurge.snapRetainCount:配置zk在自动清理的时候需要保存的数据文件快照的数量和对应的事务日志文件,默认为3
- autopurge.purgeInterval:和autopurge.snapRetainCount配置使用,用于配置zk自动清理文件的频率,默认为1小时,即默认开启自动清理功能,设置为0,则表示禁用清理功能
3. 启动
/usr/local/zookeeper/zkServer.sh start
4. 验证
[root@app conf]# telnet 127.0.0.1 2181
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stat
Zookeeper version: 3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
Clients:
/127.0.0.1:42638[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 4
5. 基本用法
[root@app conf]# /usr/local/zookeeper/bin/zkCli.sh -server localhost:2181
Connecting to localhost:2181
...
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
[zk: localhost:2181(CONNECTED) 1]
Distributed模式
1. 配置hosts
#vim /etc/hosts
zk1 192.168.0.101
zk2 192.168.0.102
zk3 192.168.0.103
2. 配置zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
clientPort=2181
server.1=192.168.0.101:2888:3888
server.2=192.168.0.102:2888:3888
server.3=192.168.0.103:2888:3888
配置项说明:
- 集群模式中,集群中的每台机器都需要感知其它机器,在zoo.cfg配置文件中,可以按照如下格式进行配置:
server.id=host:port:port
,其中id即server id,用于标识服务器在集群中的序号。每台zk服务器上,都需要在数据目录下创建一个myid文件,该文件中只有一行内容,即对应于每台服务器的server id。 - zk集群中,每台服务器上的zoo.cfg配置文件内容一致
3. 创建myid文件
# 每个服务器上的myid内容都不同,且需要保证和自己的zoo.cfg配置文件中"server.id=host:port:port"的id值一致
# id的范围是1~255
echo "1" > /usr/local/zookeeper/data/myid
4. 启动服务
/usr/local/zookeeper/zkServer.sh start
5. 验证
[root@app conf]# telnet 127.0.0.1 2181
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stat
Zookeeper version: 3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
Clients:
/127.0.0.1:41142[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x100000000
Mode: leader
Node count: 4
Proposal sizes last/min/max: -1/-1/-1
Connection closed by foreign host.
6. 查询状态
[root@app conf]# ../bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader