Linux搭建Zookeeper集群

Linux搭建Zookeeper集群

1 说明

1.1 编写目的

本博客编写旨在构建zookeeper分布式系统,分享本人安装部署过程,帮助读者了解和安装zookeeper。

1.2 适用范围

本博客仅适用于刚涉足zookeeper的开发人员、测试人员、实施人员了解和安装,关于其深入配置及参数优化未进行说明,以致专家可飘过。

2 Zookeeper说明

2.1 Zookeeper简介

2.1.1 Zookeeper概述

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.12\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

2.1.2 Zookeepery原理

ZooKeeper是以Fast Paxos算法为基础的,paxos算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader,只有leader才能提交propose,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。
ZooKeeper的基本运转流程:
1、选举Leader。
2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的zxid。
5、集群中大多数的机器得到响应并follow选出的Leader。

2.1.3 Zookeeper特点

在Zookeeper中,znode是一个跟Unix文件系统路径相似的节点,可以往这个节点存储或获取数据。如果在创建znode时Flag设置为EPHEMERAL,那么当创建这个znode的节点和Zookeeper失去连接后,这个znode将不再存在在Zookeeper里,Zookeeper使用Watcher察觉事件信息。当客户端接收到事件信息,比如连接超时、节点数据改变、子节点改变,可以调用相应的行为来处理数据。Zookeeper的Wiki页面展示了如何使用Zookeeper来处理事件通知,队列,优先队列,锁,共享锁,可撤销的共享锁,两阶段提交。
那么Zookeeper能作什么事情呢,简单的例子:假设我们有20个搜索引擎的服务器(每个负责总索引中的一部分的搜索任务)和一个总服务器(负责向这20个搜索引擎的服务器发出搜索请求并合并结果集),一个备用的总服务器(负责当总服务器宕机时替换总服务器),一个web的cgi(向总服务器发出搜索请求)。搜索引擎的服务器中的15个服务器提供搜索服务,5个服务器正在生成索引。这20个搜索引擎的服务器经常要让正在提供搜索服务的服务器停止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成可以搜索提供服务了。使用Zookeeper可以保证总服务器自动感知有多少提供搜索引擎的服务器并向这些服务器发出搜索请求,当总服务器宕机时自动启用备用的总服务器。

2.1.4 Zookeeper部署

我需要运行几个ZooKeeper?
你运行一个zookeeper也是可以的,但是在生产环境中,你最好部署3,5,7个节点。部署的越多,可靠性就越高,当然最好是部署奇数个,偶数个不是不可以的,但是zookeeper集群是以宕机个数过半才会让整个集群宕机的,所以奇数个集群更佳。你需要给每个zookeeper 1G左右的内存,如果可能的话,最好有独立的磁盘(独立磁盘可以确保zookeeper是高性能的)。如果你的集群负载很重,不要把Zookeeper和RegionServer运行在同一台机器上面。就像DataNodes 和 TaskTrackers一样。

3 安装准备

3.1 服务器准备

正常情况下,一般Zookeeper最好部署3,5,7个节点。部署的越多,可靠性就越高,当然最好是部署奇数个,偶数个不是不可以,接下来我们部署3台机器。操作系统采用CentOS7,JDK版本采用1.8版本。没有安装JDK的童鞋安装一下JDK.
各个节点及描述如下表所示:

节点 IP 描述
服务器1 192.168.204.127 Note1
服务器2 192.168.204.128 Note2
服务器3 192.168.204.129 Note3

3.1.1 可根据需要修改本机主机名

1、执行vi /etc/sysconfig/network命令,修改HOSTNAME为新的主机名
执行命令:vi /etc/sysconfig/network
修改:
NETWORKING=yes
HOSTNAME=node1
2、修改/etc/hosts文件,添加其他节点映射,自定义机器名访问目标机器
执行命令:vi /etc/hosts
修改前:
127.0.0.1 localhost localhost.localdomainlocalhost4 localhost4.localdomain4
::1 localhost localhost.localdomainlocalhost6 localhost6.localdomain6

修改localhost.localdomain为node1,并且添加映射;
修改后内容如下:
127.0.0.1 localhost node1 localhost4 localhost4.localdomain4
::1 localhost node1 localhost6 localhost6.localdomain6
192.168.204.128 node2
192.168.204.129 node3

3、修改/etc/hostname文件
执行命令:vi /etc/hostname
(在CentOs7中此步不操作,怎么修改都没有用,CentOs6略过)
删除文件中的所有文字,在第一行添加node1
4、重启机器
执行命令:reboot

3.2 软件准备

目前Zookeeper安装使用的版本为zookeeper-3.4.12,可以到http://archive.apache.org/dist/zookeeper 下载,然后将安装包传到服务器上;如果服务器允许出外网,可以通过wget命令方方式下载 zookeeper
Wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz

4 Zookeeper安装

4.1 Zookeeper安装

4.1.1 第一步下载Zookeeper安装包

切换到你放安装包的目录下执行命令下载zookeeper:
Wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
或者直接到Wget http://archive.apache.org/dist/zookeeper/下载 zookeeper。

4.1.2 第二步解压Zookeeper安装包

在/usr/local下创建apps文件夹,我基本上把这个软件安装到这个目录下,读者君可以自己选择安装的常用目录:
mkdir /usr/local/apps
解压至apps
tar -zxvf zookeeper-3.4.12.tar.gz -C /usr/local/apps/

4.1.3 第三步 修改zookeeper目录名

为了方便操作还有配置环境变量,我们将zookeeper-3.4.12改为zookeeper;
mv zookeeper-3.4.12 zookeeper

4.1.4 第四步 复制配置文件

复制配置文件并改名为zoo.cfg
cp /usr/local/apps/zookeeper/conf/zoo_sample.cfg zoo.cfg

4.1.5 第五步 创建目录

mkdir /usr/local/apps/zookeeper/datatmp 目录
mkdir /usr/local/apps/zookeeper/logs 目录

4.1.6 第六步Zookeeper配置

修改zoo.cfg配置文件
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apps/zookeeper/datatmp
dataLogDir=/usr/local/apps/zookeeper/logs
clientPort=2181
server.1=192.168.204.127:2888:3888
server.2=192.168.204.128:2888:3888
server.3=192.168.204.129:2888:3888

4.1.7 第七步配置环境变量

为了方便启动,我们配置一下环境变量,在profile文件里配置一下:
vi /etc/profile

4.1.8 第八步 创建myid

在刚刚zoo.cfg文件中dataDir属性指定的目录(本文中为/usr/local/apps/zookeeper/datatmp)下创建一个myid,在里面添加你指定的server编号,因为这台机器是master,而zoo.cfg中master编号为1(server.1=192.168.204.127:2888:3888),所以myid内容只需要为1即可。
cd /usr/local/apps/zookeeper/datatmp
echo 1>myid
注:关于myid文件。myid文件中只有一个数字,即一个Server ID。例如,server.1 的myid文件内容就是“1”。注意,请确保每个server的myid文件中id数字不同,并且和server.id=host:port:port中的id一致。另外,id的范围是1~255。

4.1.9 第九步 复制节点

分别在其它2台机器重复第一步至第八步工作,第一步至第七步操作不变,第八步 在执行echo 1>myid 需要分别修改成 echo 2>myid echo 3>myid,保证 myid每台机器唯一。

4.1.10 第十步 关闭防火墙或者开放相应端口

对如何关闭防火墙不清楚的童鞋参考这位仁兄的博客

4.2 启动与停止

4.2.1 Zookeeper启动

cd /usr/local/apps/zookeeper/bin
zkServer.sh start(配置环境变量后其实在其他任何目录下执行都可以)
分别在3台机器执行相应操作,这样Zookeeper就安装完成,并启动。

4.2.2 Zookeeper 停止

cd /usr/local/apps/zookeeper/bin
zkServer.sh stop

4.2.3 Zookeeper 状态

cd /usr/local/apps/zookeeper/bin
zkServer.sh status

4.2.4 检查Zookeeper安装是否成功

cd /usr/local/apps/zookeeper/bin
zkCli.sh -server 192.168.204.127:2181

5 注意事项

5.1.1 独立的事务日志输出

对于每个更新操作,ZK都会在确保事务日志已经落盘后,才会返回客户端响应。因此事务日志的输出性能在很大程度上影响ZK的整体吞吐性能。强烈建议是给事务日志的输出分配一个单独的磁盘。

5.1.2 配置合理的JVM堆大小

确保设置一个合理的JVM堆大小,如果设置太大,会让内存与磁盘进行交换,这将使ZK的性能大打折扣。例如一个4G内存的机器的,如果你把JVM的堆大小设置为4G或更大,那么会使频繁发生内存与磁盘空间的交换,通常设置成3G就可以了。当然,为了获得一个最好的堆大小值,在特定的使用场景下进行一些压力测试。


作者:洪城屠夫
来源:CSDN
原文:https://blog.csdn.net/zhangkai19910815/article/details/84144059
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/zhangkai19910815/article/details/84230349