最新消息:运维之路

ZooKeeper 配置与安装

系统运维 admin 161浏览 0评论

近期有用到Zookeeper这东东 测试环境用的单台伪集群 正式环境用的3台集群机器 记录整理下过程.

一、Zookeeper的基本概念
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。Zookeeper是hadoop的一个子项目,其发展历程无需赘述。在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此。

1.1 zookeeper集群角色介绍
zookeeper集群中主要有两个角色:Leader和Follower。

领导者(Leader),用于负责进行投票的发起和决议,更新系统状态。

学习者(Learner),包括跟随者(Follower)和观察者(Observer)。

其中Follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票。

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

1.2 Zookeeper设计目的

最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
可靠性:具有简单、健壮、良好的性能,如果消息m被到一台服务器接受,那么它将被所有的服务器接受。
实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。
原子性:更新只能成功或者失败,没有中间状态。
顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。

二、安装与配置
2.1 下载
https://zookeeper.apache.org/ 首页找一个当前Stable(稳定版本)下载 JDK版本需要在1.6以及以上

wget  http://apache.communilink.net/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
tar -zxvf   zookeeper-3.4.10.tar.gz

配置选项解释:
#tickTime: zookeeper中使用的基本时间单位, 毫秒值.
#dataDir: 数据目录. 可以是任意目录.
#dataLogDir: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和#dataDir相同的设置.
#clientPort: 监听client连接的端口号.
#server.1=master:2287:3387 //server.X=A:B:C 其中X是一个数字,表示这是第几号server。A是该server所在的IP地址或主机号。B配置该server和集群中的leader交换消息所使用的端口。C配置选举leader时所使用的端口。由于配置的是伪集群模式,所以各个server的B,C参数必须不同。

其他脚本介绍:
zkServer.sh : ZooKeeper服务器的启动、停止和重启脚本;
zkCli.sh : ZooKeeper的简易客户端;
zkEnv.sh : 设置ZooKeeper的环境变量;
zkCleanup.sh : 清理ZooKeeper历史数据,包括事务日志文件和快照数据文件。

首先是单台伪集群
配置如下
zookeeper01 配置

tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/opt/zookeeper/zookeeper01/data
dataLogDir=/opt/zookeeper/zookeeper01/logs
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

zookeeper02 配置

tickTime=2000
initLimit=10
syncLimit=5
clientPort=2182
dataDir=/opt/zookeeper/zookeeper02/data
dataLogDir=/opt/zookeeper/zookeeper02/logs
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

zookeeper03 配置

tickTime=2000
initLimit=10
syncLimit=5
clientPort=2183
dataDir=/opt/zookeeper/zookeeper03/data
dataLogDir=/opt/zookeeper/zookeeper03/logs
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

注意点:单台可以IP全部用127.0.0.1 每个server的port要不一致的 避免端口占用
然后建立logs和data

mkdir /opt/zookeeper/zookeeper01/data
mkdir /opt/zookeeper/zookeeper01/logs
mkdir /opt/zookeeper/zookeeper02/data
mkdir /opt/zookeeper/zookeeper02/logs
mkdir /opt/zookeeper/zookeeper03/data
mkdir /opt/zookeeper/zookeeper03/logs

注意写入myid (这个非常重要)写入在data目录

echo 1 >/opt/zookeeper/zookeeper01/data/myid
echo 2 >/opt/zookeeper/zookeeper02/data/myid
echo 3 >/opt/zookeeper/zookeeper03/data/myid

最后启动它
启动zkServer.sh start
停止zkServer.sh stop
查看状态zkServer.sh status
关于状态:每个Server在工作过程中有三种状态
LOOKING:当前Server不知道leader是谁,正在搜寻
LEADING:当前Server即为选举出来的leader
FOLLOWING:leader已经选举出来,当前Server与之同步
最后贴上多台集群的配置 (如果做集群一般都是2n-1台 因为投票选举机制)
假设3台IP为 :
192.168.211.1 192.168.211.2 192.168.211.3
1配置
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/logs
server.1=0.0.0.0:2888:3888
server.2=192.168.211.2:2888:3888
server.2=192.168.211.3:2888:3888

2配置
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/logs
server.1=192.168.211.1:2888:3888
server.2=0.0.0.0:2888:3888
server.2=192.168.211.3:2888:3888

3配置
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/opt/zookeeper/data
dataLogDir=/opt/zookeeper/logs
server.1=192.168.211.1:2888:3888
server.2=192.168.211.2:2888:3888
server.2=0.0.0.0:2888:3888
记得创建目录和写入myid文件
再启动它们观察日志 配下防火墙就ok啦

三、水平扩容
水平可扩容可以说是对一个分布式系统在高可用性方面提出的基本的,也是非常重要的一个要求,通过水平扩容能够帮助系统在不进行或进行极少改进工作的前提下,快速提高系统对外的服务支撑能力。简单地讲,水平扩容就是向集群中添加更多的机器,以提高系统的服务质量。

很遗憾的是,ZooKeeper 在水平扩容扩容方面做得并不十分完美,需要进行整个集群的重启。通常有两种重启方式,一种是集群整体重启,另外一种是逐台进行服务器的重启。

3.1 整体重启

所谓集群整体重启,就是先将整个集群停止,然后更新 ZooKeeper 的配置,然后再次启动。如果在你的系统中,ZooKeeper 并不是个非常核心的组件,并且能够允许短暂的服务停止(通常是几秒钟的时间间隔),那么不妨选择这种方式。在整体重启的过程中,所有该集群的客户端都无法连接上集群。等到集群再次启动,这些客户端就能够自动连接上——注意,整体启动前建立起的客户端会话,并不会因为此次整体重启而失效。也就是说,在整体重启期间花费的时间将不计入会话超时时间的计算中。

3.2 逐台重启

这种方式更适合绝大多数的实际场景。在这种方式中,每次仅仅重启集群中的一台机器,然后逐台对整个集群中的机器进行重启操作。这种方式可以在重启期间依然保证集群对外的正常服务。

转载请注明:DevOps » ZooKeeper 配置与安装

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址