Zookeeper原理

发布 : 2016-02-26 分类 : 大数据 浏览 :

Zookeeper介绍

What is Zookeeper?

1
2
3
4
5
6
7
一个开源的分布式的,为分布式应用提供协调服务的Apache项目。

提供一个简单的原语集合,以便于分布式应用可以在它之上构建更高层次的同步服务

设计非常易于编程,它使用的是类似于文件系统那样的树形数据结构

目的就是将分布式服务不再需要由于协作冲突而另外实现协作服务

Zookeeper是简易的

1
2
3
4
5
6
7
8
9
10
11
12
13
Zookeeper通过一种和文件系统很像的层级命名空间来让分布式进程互相协同工作。

这命名空间由一系列数据寄存器组成,我们也叫这些数据寄存器为znodes。这些znodes就有点像是文件系统中的文件和文件夹。

和文件系统不一样的是,文件系统的文件是存储在存储区上的,而Zookeeper的数据是存储在内存上的。

同时,这就意味着Zookeeper有着高吞吐和低延时

Zookeeper实现了高性能,高可靠性,和有序的访问。

高性能更保证了Zookeeper能应用在大型的分布式系统上
高可靠性保证它不会由于单一节点的故障而造成任何问题
有序的访问能保证客户端可以实现较为复杂的同步操作

Zookeeper设计目标

1
2
3
Zookeeper是可重用的

Zookeeper Service

1
2
3
4
5
6
7
8
9
组成Zookeeper的各个服务器必须要能相互通信。他们在内存中保存了服务器状态,也保存可操作的日志,并且持久化快照。只要大多数的服务器是可用的,那么Zookeeper就是可用的。

Zookeeper能帮我们做什么?

Hadoop,使用Zookeeper的时间处理确保整个集群只有一个NameNode,存储配置信息等

HBase,使用Zookeeper的时间处理确保整个集群只有一个HMaster,

察觉HRegionServer联机和宕机,存储访问控制列表


Zookeeper的角色:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
领导者(leader),负责进行投票的发起和决议,更新系统状态

学习者(learner),包括跟随者(folower)和观察者(observer),follower用于接受客户端请求并向客户端返回结果

在选主过程中参与投票

Observer可以接受客户端连接,将写请求转发给leader,但obsrver不参加投票过程,只同步leader的状态,
observer不参加投票过程,只同步leader的状态,observer的目的是为了拓展系统,提高读取速度

客户端(client),请求发起方

配置Zookeeper的Observer观察者

关闭Zookeeper集群
1
2
3
4
5
6
7
8
9
10
11
12
13
进入Zookeeper目录更改zoo.cfg配置
[root@node2 ~]# cd /opt/modules/zookeeper/conf
[root@node2 conf]# ll
total 16
-rw-r--r-- 1 root root 535 Mar 7 12:07 configuration.xsl
-rw-r--r-- 1 root root 2161 Mar 7 12:07 log4j.properties
-rw-r--r-- 1 root root 1077 Mar 7 12:30 zoo.cfg
-rw-r--r-- 1 root root 922 Mar 7 12:07 zoo_sample.cfg
[root@node2 conf]# vi zoo.cfg

将更改后的配置发送给node3、node5
[root@node2 ~]# scp -r /opt/modules/zookeeper/conf/zoo.cfg root@node3:/opt/modules/zookeeper/conf/
[root@node2 ~]# scp -r /opt/modules/zookeeper/conf/zoo.cfg root@node3:/opt/modules/zookeeper/conf/

1
2
3
4
5
6
7
8
9
10
11
12
13
启动Zookeeper集群

[root@node2 ~]# cd /opt/modules/zookeeper
[root@node3 ~]# cd /opt/modules/zookeeper
[root@node5 ~]# cd /opt/modules/zookeeper

[root@node2 ~]# ./bin/zkServer.sh start
[root@node3 ~]# ./bin/zkServer.sh start
[root@node5 ~]# ./bin/zkServer.sh start

[root@node2 ~]# ./bin/zkServer.sh status
[root@node3 ~]# ./bin/zkServer.sh status
[root@node5 ~]# ./bin/zkServer.sh status

Zookeeper角色

Leader选举

为什么Zookeeper集群的数目,一般为奇数个?(从容灾角度入手)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Leader选举算法采用了Paxos协议

Paxos核心思想:当多数server写成功,则任务数据写成功

如果有3个Server,则两个写成功即可

如果有4或5个server,则三个写成功即可

Server数目一般为奇数(3,5,7)

如果有3个Server,则最多允许1个Server挂掉

如果有4个Server,则同样最多允许1个Server挂掉

由此,我们看出3台服务器和4台服务器的容灾能力是一样的,所以为了节省服务器资源,一般我们采用奇数个数,作为服务器部署个数

Zookeeper的节点

Znode有两种类型,短暂的(ephemeral)和持久的(persistent)
Znode的类型在创建时确定并且之后不能再修改
短暂znode的客户端会话结束时,Zookeeper会将该短暂znode删除,短暂znode不可以有子节点
持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除

Znode有四种形式的目录节点
PERSISTENT、
EPHEMERAL、
PERSISTENT_SEQUENTAL、
EPHEMERAL_SEQUENTIAL

观察(watcher)

Watcher在Zookeeper是一个核心功能,Watcher可以监控目录节点的数据变化以及子目录的变化,一旦这些状态发生变化,

服务器就会通知所有设置这个目录节点上的Wathcer,

从而每个客户端都很快知道它关注的目录节点的状态发生变化,而做出相应的反应



1
[root@node5 zookeeper]# ./bin/zkCli.sh

1
[zk: localhost:2181(CONNECTED) 0] ls /

1
2
[zk: localhost:2181(CONNECTED) 5] ls /zookeeper  
[zk: localhost:2181(CONNECTED) 6] get /zookeeper

1
2
[zk: localhost:2181(CONNECTED) 3] ls /hadoop-ha
[zk: localhost:2181(CONNECTED) 4] get /hadoop-ha

1
[zk: localhost:2181(CONNECTED) 7] set /hadoop-ha 1

1
2
3
4
5
更改之前
mZxid = 0x2a0000000c

更改之后
mZxid = 0x2a0000000d

关于Znode节点:

持久化和短暂

1
2
3
4
5
6
7
8
9
10
1,运行RmiServer
2,运行RmiClient
测试RMI通信

1,获取你的本地IP
2,更改Server里面的IP
3,更改Constant.ZK_CONNECTION_STRING
4,/registry这个ZNode要手动创建出来
5,分别启动多个Server
6,运行Client
1
2
3
4
5
6
7
8
[zk: localhost:2181(CONNECTED) 5] ls /
[registry, yarn-leader-election, hadoop-ha, zookeeper]


[zk: localhost:2181(CONNECTED) 4] create /registry 2
Created /registry

[zk: localhost:2181(CONNECTED) 10] get /registry

启动server

在/opt/modules/zookeeper/bin/目录下执行zkServer.sh

查看Zookeeper的目录树

1
2
[zk: localhost:2181(CONNECTED) 5] ls /
[yarn-leader-election, hadoop-ha, zookeeper]

创建znode

1
2
[zk: localhost:2181(CONNECTED) 4] create /registry 2
Created /registry

本文作者 : Matrix
原文链接 : https://matrixsparse.github.io/2016/02/26/Zookeeper原理/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我投食

微信扫一扫, 向我投食

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹