1. ZooKeeper是什么
ZooKeeper是一个开源的高性能(3主机的ZooKeeper集群可以达到12万左右的QPS)的分布式协调服务,它是一个分布式数据一致性解决方案。
ZooKeeper能解决的分布式数据一致性问题包括:
- 顺序一致性
从一个客户端发起事务请求,最终会严重按照其发起的顺序应用到ZooKeeper中。 - 原子性
所有事务的执行结果在ZooKeeper集群的所有主机上是一致的。 - 单一视图
无论客户端连接到哪个ZooKeeper服务器,它看到的数据都是一致的。 - 可靠性
服务端完成了一个事务并完成了对客户的响应,这个事务引起的服务端状态的变更会一致保留下来,除非另外的事务对此状态进行了变更。 - 实时性
ZooKeeper保证在一定时间内,客户端最终一定能从服务端读取到最新的数据状态。
2. 为什么要使用Zookeeper
Zookeeper可以解决很多分布式系统遇到的问题,如分布式锁、分布式协调、分布式消息队列等。
3. Zookeeper应用场景
3.1 数据发布/订阅
3.2 负载均衡
3.3 命名服务
如:生成数据库表主键
3.4 分布式协调/通知
如:心跳检测
4. ZooKeeper中的基本概念
4.1 集群角色
Leader:ZooKeeper集群工作中的核心
Follower:ZooKeeper集群状态的跟随者
Observer:充当一个观察者角色
4.2 会话
会话(Session)是指客户的和ZooKeeper服务器的连接,客户与服务器之间通过建立一个TCP长连接来维持Session,通过这个连接,客户端能够通过心跳检测与服务器保持有效会话,也能向服务器发送请求并获得响应。
4.3 数据节点
ZooKeeper中的节点有两类:
集群中的一台主机称为一个节点;
数据模型中的数据单元称为Znode,Znode又分为持久节点和临时节点。
4.4 版本
ZooKeeper中的版本类型如下:
version:当前数据节点数据内容的版本号;
cversion:当前数据节点子节点的版本号;
aversion:当前数据节点ACL变更版本号。
4.5 watcher
即事件监听,ZooKeeper允许用户在指定节点上注册一些Watcher,当数据节点发生变化时,ZooKeeper服务器会把这个变化通知给感兴趣的客户端。
4.6 ACL权限控制
即Access Control Lists的简写,ZooKeeper采用ACL策略来进行权限控制:
CREATE:创建子节点
READ:获取节点数据及子节点列表
WRITE:更新节点数据
DELETE:删除子节点
ADMIN:设置节点的ACL
5. Zookeeper安装启动
系统环境:CentOS 7.3
5.1 单机
1.准备Java运行环境(zookeeper依赖于Java环境)
2.下载zookeeper到/opt目录
wget -P /opt http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
3.进入/opt目录,解压下载的zookeeper包
tar -zxvf zookeeper-3.4.10.tar.gz
4.进入zookeeper的conf目录,复制配置文件
cp zoo_sample.cfg zoo.cfg
5.启动zookeeper
[root@localhost bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
6.检查默认端口2181是否处于监听状态
[root@localhost bin]# netstat -tnl | grep 2181
tcp6 0 0 :::2181 :::* LISTEN
7.使用telnet查看zookeeper状态信息
[root@zookeeper1 bin]# telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stat
Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
Clients:
/0:0:0:0:0:0:0:1:59402[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
Connection closed by foreign host.
8.停止zookeeper
[root@localhost bin]# ./zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
5.2 集群
系统环境:CentOS 7.3
主机:192.168.101.130、192.168.101.131、192.168.101.132
禁用firewalld
禁用selinux
1.准备Java运行环境(zookeeper依赖于Java环境)
2.下载zookeeper到/opt目录
wget -P /opt http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
3.进入/opt目录,解压下载的zookeeper包
tar -zxvf zookeeper-3.4.10.tar.gz
4.进入zookeeper的conf目录,复制配置文件
cp zoo_sample.cfg zoo.cfg
5.在所有主机上编辑配置文件zoo.cfg
cat << EOF > zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/zookeeper
clientPort=2181
server.1=192.168.1.111:2222:3333
server.2=192.168.1.112:2222:3333
server.3=192.168.1.113:2222:3333
EOF
6.创建配置文件中的dataDir指定的目录
mkdir -p /var/zookeeper
7.分别在3台主机的/var/zookeeper目录中创建myid文件,写入server id
# 192.168.1.111
echo "1" > /var/zookeeper/myid
# 192.168.1.112
echo "2" > /var/zookeeper/myid
# 192.168.1.113
echo "3" > /var/zookeeper/myid
8.在3台主机上启动zookeeper
[root@localhost bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
9.查看zookeeper状态,leader、follower与上面提到的zookeeper角色对应
# 192.168.1.111
[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
# 192.168.1.112
[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: leader
# 192.168.1.113
[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
10.使用telnet进一步查看zookeeper集群的状态
[root@zookeeper1 bin]# telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stat
Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
Clients:
/0:0:0:0:0:0:0:1:59400[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: follower
Node count: 4
Connection closed by foreign host.
5.3 伪集群
伪集群与集群是类似的,只不过是在同一主机上运行多个zookeeper实例,配置和操作几乎一致,只需要将端口号设置为不一致即可。