Zookeeper从入门到源码系列(一)

微信扫一扫,分享到朋友圈

Zookeeper从入门到源码系列(一)

转载请标注URL:https://juejin.im/post/5ec7a627e51d457889260b64

Zookeeper诞生记

ZooKeeper最早起源于雅虎公司研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型的系统需要依赖一个类似的系统进行分布式协调,但是这些系统往往存在分布式单点问题。所以雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架。

在项目初期给这个项目命名的时候,准备和很多项目一样,按照雅虎公司的惯例要用动物的名字来命名的(例如著名的Pig项目)。在进行探讨取什么名字的时候,研究院的首席科学家Raghu Ramakrishnan开玩笑说:再这样下去,我们这儿就变成动物园了。此话一出,大家纷纷表示就叫动物园管理员吧,于是,ZooKeeper的名字由此诞生了。

什么是 Zookeeper

Zookeeper的定位是一种分布式协调服务。分布式协调服务可以在分布式系统中共享配置,协调锁资源,提供命名服务。

ZooKeeper 的优势

Zookeeper的核心优势是实现了分布式环境的数据一致性。简单地说:每时每刻我们访问ZooKeeper的树结构时,不同的节点返回的数据都是一致的。也就是说,对 ZooKeeper 进行数据访问时,无论是什么时间,都不会引起脏读、重复读。

注:脏读是指在数据库存取中无效数据的读出。

Zookeeper 集群

一个 Zookeeper 集群如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之间能够正常通信。基于这个特性,如果想搭建一个能够允许N台机器挂掉的集群,那么就需要部署一个由 2 * N + 1 台服务器构成的 Zookeeper 集群。

例如,一个由5台机器构成的 Zookeeper 集群,能够在挂掉2台机器后依然正常工作,而如果是一个由6台服务器构成的 Zookeeper 集群,同样只能够挂掉2台机器,因为如果挂掉3台,剩下的机器就无法实现过半了。

因此对于一个由6台服务器组成的 Zookeeper 集群来说,和一个由5台服务器构成的 Zookeeper 集群相比,其在容灾能力上没有任何明显的提升。基于这个原因,Zookeeper 集群通常设计部署成奇数台服务器即可。

使用 Docker-compose 搭建 Zookeeper 集群

Docker-Compose环境安装

参考我的历史文章:传送门

docker-compose-zookeeper.yaml 文件

ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 集群需要设置的两个环境变量, 其中 ZOO_MY_ID 表示 ZK 服务的 id, 它是1-255 之间的整数, 必须在集群中唯一。ZOO_SERVERS 是ZK 集群的主机列表。

version: '3'
services:
zoo1:
image: zookeeper:3.4.11
restart: always
hostname: zoo1
ports:
- 2181:2181
networks:
- zookeeper
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo2:
image: zookeeper:3.4.11
restart: always
hostname: zoo2
ports:
- 2182:2181
networks:
- zookeeper
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo3:
image: zookeeper:3.4.11
restart: always
hostname: zoo3
ports:
- 2183:2181
networks:
- zookeeper
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
networks:
zookeeper:
driver: bridge
复制代码

启动 Zookeeper 集群

# 启动所有Zookeeper服务
docker-compose -f docker-compose-zookeeper.yaml up -d
# 移除所有Zookeeper服务
docker-compose -f docker-compose-zookeeper.yaml rm -sf
复制代码

查看集群状态

可以看到 zoo1 和 zoo2 为当前集群的 follower,zoo3 为当前集群的 leader

[root@hostname ~]# echo stat | nc 127.0.0.1 2181
Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
Clients:
/172.19.0.1:38584[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
[root@hostname ~]# echo stat | nc 127.0.0.1 2182
Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
Clients:
/172.19.0.1:48802[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: follower
Node count: 4
[root@hostname ~]# echo stat | nc 127.0.0.1 2183
Zookeeper version: 3.4.11-37e277162d567b55a07d1755f0b31c32e93c01a0, built on 11/01/2017 18:06 GMT
Clients:
/172.19.0.1:53120[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
复制代码

连接Zookeeper集群

docker run -it --rm 
--link zoo1:zk1 
--link zoo2:zk2 
--link zoo3:zk3 
--net root_zookeeper 
zookeeper zkCli.sh -server zk1:2181,zk2:2181,zk3:2181
复制代码

踩坑记录

最新的 zookeeper:3.6.1 版本使用 environment 设置 ZOO_MY_ID 环境变量后,无法正确读取配置,zookeeper 服务启动后报错:

root@zoo1:/apache-zookeeper-3.6.1-bin/bin# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port not found in static config file. Looking in dynamic config file.
grep: : No such file or directory
Client port not found. Terminating.
复制代码

改为 zookeeper:3.4.11 问题解决。

都看到这里啦,点个赞再走吧~

微信扫一扫,分享到朋友圈

Zookeeper从入门到源码系列(一)

如何让简历中的「项目经验」更出众?

上一篇

儿童夏季忌大补,试试这5大保健心法

下一篇

你也可能喜欢

Zookeeper从入门到源码系列(一)

长按储存图像,分享给朋友