从零开始搭建个人大数据集群(1)——zookeeper安装

从零开始搭建个人大数据集群——环境准备篇
我准备搭建的是高可用集群,所以要先安装zookeeper

环境准备

1.由于zookeeper的选举机制是leader选举,要求 可用节点数量 > 总节点数量/2 。注意 是 > , 不是 ≥。所以需要用三台虚拟机来装,当然内存足够任性的话选五台也不是不行,我这里就用三台,主机名分别为hd1,hd2,hd3
2.准备好安装包
我选用的版本是apache-zookeeper-3.5.9-bin.tar.gz,下载链接:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.9/
在写这篇文章时最新的版本是3.7.0,不过为了稳定考虑选用稍微老两个版本的3.5.9

开始安装

上传并解压

我一般把安装包放在/opt/packages,安装目录统一在/opt/apps,方便管理

cd /opt/packages
tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz -C ../apps/
cd ../apps
# 创建软链接
ln -s apache-zookeeper-3.5.9-bin zookeeper
cd zookeeper/conf
cp zoo_sample.cfg zoo.cfg

配置zookeeper

zoo.cfg

注意各项配置的末尾不要有空格,不然无法识别

# 修改配置文件
vim zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 设置数据目录
dataDir=/data/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
# 第一个端口用于Follower和Leader之间的数据同步和其他通信,第二个端口用于Leader选举过程中投票通信
server.1=hd1:2888:3888
server.2=hd2:2888:3888
server.3=hd3:2888:3888

zkEnv.sh

修改 zookeeper/bin/zkEnv.sh 脚本,在脚本中给 ZOO_LOG_DIR 设置日志所在目录
后续安装的所有软件的数据目录我都会设置在/data下,方便查看管理
修改后

ZOOBINDIR="${ZOOBINDIR:-/usr/bin}"
ZOOKEEPER_PREFIX="${ZOOBINDIR}/.."
ZOO_LOG_DIR=/data/zookeeper/logs

#check to see if the conf dir is given as an optional argument
if [ $# -gt 1 ]
then
    if [ "--config" = "$1" ]
          then
              shift
              confdir=$1
              shift
              ZOOCFGDIR=$confdir
    fi
fi

if [ "x$ZOOCFGDIR" = "x" ]
then

创建myid

上面在zoo.cfg中把dataDir设置为了/data/zookeeper
所以需要在这个目录下新建myid文件用来区分三个zookeeper
注意三台的id必须不同

hd1:
echo "1" > /data/zookeeper/myid 
hd2:
echo "2" > /data/zookeeper/myid 
hd3:
echo "3" > /data/zookeeper/myid 

配置环境变量

这里直接修改系统变量就可以,没装jdk的自行装一下,我用的版本是:java version “1.8.0_202”

vim /etc/profile

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
JAVA_HOME=/usr/local/jdk
ZOOKEEPER_HOME=/opt/apps/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

:wq

# 保存后重载环境变量
source /etc/profile

分发软件包

这里通过多机批量同步脚本来分发,脚本写法可以看我这篇文章:
Linux多机文件批量同步脚本
ips文件中写hd2,hd3,然后执行rsync-script /opt/apps/zookeeper

启动zookeeper

为了方便,这里同样准备多机操作脚本

cd ~
mkdir zk
cd zk
touch ips
vim ips

hd1
hd2
hd3
:wq
# 创建多机操作脚本
vim ssh_all.sh
#!/bin/bash

#获得执行的文件所在的目录

cd `dirname $0`

#查看当前所在的工作目录
path=`pwd`

#使用cat命令查看ips文件内容,获得5台机器的主机名称,是字符串形式
#转数组
ips=(`cat ${path}/ips`)

for i in ${ips[*]};
do
        #拼接命令 使用位置变量$*接收执行的linux命令
	#这里要写你安装软件用的用户名,我用的是hadoop
        cmd="ssh hadoop@${i} \"source /etc/profile;source ~/.bash_profile;$*\""
        echo $cmd
        if eval $cmd;then
                echo "OK"
        else
                echo "FAIL"
        fi
done;
:wq
chmod +x ssh_root.sh
# 写好脚本后在hd1上执行
[hadoop@hd1 zk]$ sh ~/zk/ssh_all.sh zkServer.sh start
ssh hadoop@hd1 "source /etc/profile;source ~/.bash_profile;zkServer.sh start"
/usr/local/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
OK
ssh hadoop@hd2 "source /etc/profile;source ~/.bash_profile;zkServer.sh start"
/usr/local/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
OK
ssh hadoop@hd3 "source /etc/profile;source ~/.bash_profile;zkServer.sh start"
/usr/local/jdk/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/apps/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
OK

# 进入客户端
[hadoop@hd1 zk]$ zkCli.sh -server hd1:2181.hd2:2181,hd3:2181
WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: hd1:2181.hd2:2181,hd3:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: hd1:2181.hd2:2181,hd3:2181(CONNECTED) 1]

附:小知识

Zookeeper服务自身组成一个集群,2n+1个(奇数)服务允许n个失效,集群内一半以上机器可用,Zookeeper就可用。 3台 nn1 nn2 s1

    问题 : 为啥ZK最好是奇数台呢?其实是有一定考虑的
    首先需要明确zookeeper选举的规则:leader选举,要求 可用节点数量 > 总节点数量/2 。注意 是 > , 不是 ≥。
    注:为什么规则要求 可用节点数量 > 集群总结点数量/2   
    如果不这样限制,在集群出现脑裂的时候,可能会出现多个子集群同时服务的情况(即子集群各组选举出自己的leader), 这样对整个zookeeper集群来说是紊乱的。
    换句话说,如果遵守上述规则进行选举,即使出现脑裂,集群最多也只能会出现一个子集群可以提供服务的情况(能满足节点数量> 总结点数量/2 的子集群最多只会有一个)。所以要限制 可用节点数量 > 集群总结点数量/2 。
    采用奇数个的节点主要是出于两方面的考虑:

1、防止由脑裂造成的集群不可用。

    首先,什么是脑裂?集群的脑裂通常是发生在节点之间通信不可达的情况下,集群会分裂成不同的小集群,小集群各自选出自己的master节点,导致原有的集群出现多个master节点的情况,这就是脑裂。
    下面举例说一下为什么采用奇数台节点,就可以防止由于脑裂造成的服务不可用:

(1) 假如zookeeper集群有 5 个节点,发生了脑裂,脑裂成了A、B两个小集群:
(a) A : 1个节点 ,B :4个节点 , 或 A、B互换
(b) A : 2个节点, B :3个节点 , 或 A、B互换
可以看出,上面这两种情况下,A、B中总会有一个小集群满足 可用节点数量 > 总节点数量/2 。所以zookeeper集群仍然能够选举出leader , 仍然能对外提供服务,只不过是有一部分节点失效了而已。

(2) 假如zookeeper集群有4个节点,同样发生脑裂,脑裂成了A、B两个小集群:

(a) A:1个节点 , B:3个节点, 或 A、B互换
(b) A:2个节点 , B:2个节点
可以看出,情况(a) 是满足选举条件的,与(1)中的例子相同。 但是情况(b) 就不同了,因为A和B都是2个节点,都不满足 可用节点数量 > 总节点数量/2 的选举条件, 所以此时zookeeper就彻底不能提供服务了。
综合上面两个例子可以看出:
在节点数量是奇数个的情况下, zookeeper集群总能对外提供服务(即使损失了一部分节点);如果节点数量是偶数个,会存在zookeeper集群不能用的可能性(脑裂成两个均等的子集群的时候)。
在生产环境中,如果zookeeper集群不能提供服务,那将是致命的 , 所以zookeeper集群的节点数一般采用奇数个。

2、在容错能力相同的情况下,奇数台更节省资源。

    leader选举,要求 可用节点数量 > 总节点数量/2 。注意 是 > , 不是 ≥。
    举两个例子:
    (1) 假如zookeeper集群1,有3个节点,3/2=1.5 , 即zookeeper想要正常对外提供服务(即leader选举成功),至少需要2个节点是正常的。换句话说,3个节点的zookeeper集群,允许有一个节点宕机。
    (2) 假如zookeeper集群2,有4个节点,4/2=2 , 即zookeeper想要正常对外提供服务(即leader选举成功),至少需要3个节点是正常的。换句话说,4个节点的zookeeper集群,也允许有一个节点宕机。
    那么问题就来了, 集群1与集群2都有 允许1个节点宕机 的容错能力,但是集群2比集群1多了1个节点。在相同容错能力的情况下,本着节约资源的原则,zookeeper集群的节点数维持奇数个更好一些。

ZK的基本运行流程
ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。

ZooKeeper的基本运转流程:
1、选举Leader。
2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的执行ID,类似root权限。
5、集群中大多数的机器得到响应并接受选出的Leader。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值