ZooKeeper初探

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实例,配置和操作几乎一致,只需要将端口号设置为不一致即可。

你可能感兴趣的:(ZooKeeper初探)