ZooKeeper是一个开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Zookeeper集群必须是奇数台,故要保证可靠性至少要三台。理论上至少要保证一半以上的机器运行即可。分Leader和Follower。Leader只有一个,Follower可以有多个,当Leader宕掉后,会在在其余Follower中选举一个作为Leader。
数据同步是指:每台Cilent 机器都连接一个Follower或Leader。当Cilent上数据被修改后,其连接的Follower或Leader上的Server会首先接收到,而Leader会随时检测所有Follower上的Server,如果有数据变化就将数据同步到其他Follower上。
Hadoop2.0中使用Zookeeper确保整个NameService中只有一个Active的NameNode(会有多个Standby的NameNode但处于备用状态),当一个NameNode 宕掉后,会将其他一个Standby的NameNode切换为Active状态。此外在Hbase集群中也会使用Zookeeper来保证Hbase集群中只有一个HMaster,同时通过Zookeeper将Hbase客户端、RegionServer、Master三者联系在一起。
一、环境
操作系统:CentOS6.9
软件版本:Zookeeper3.4.13
集群架构:
Node1:10.200.4.117(oracle02)
Node2:10.200.4.116(oracle03)
Node3:10.100.125.156(db01)
二、搭建Zookeeper集群
1、安装JDK(在所有Node操作)
因为Hadoop是由Scala和Java开发的,所以必须先安装JDK。
安装方法见:https://blog.csdn.net/andyguan01_2/article/details/86701213
2、创建Zookeeper用户(在所有Node操作)
我这边服务器上面已经安装了Hadoop,安装Zookeeper直接用的hadoop用户。如果要新建用户,可用以下命令:
groupadd hadoop
useradd -g hadoop hadoop
passwd hadoop
3、下载Zookeeper(在Node1操作)
只需下载到Node1,在Node1上安装完成后,再复制安装文件到其他Node。
我用的是最新版Zookeeper3.4.13。打开以下网址:
http://mirror.bit.edu.cn/apache/zookeeper/
点击zookeeper-3.4.13/ :
找到zookeeper-3.4.13.tar.gz的下载链接:
http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
在root用户下载安装文件:
cd /install_pack/
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
4.1 创建目录
在root用户分别创建Zookeeper的安装目录、数据目录、日志目录:(在所有Node操作)
#创建安装目录
mkdir -p /u01/app/zookeeper-3.4.13
#创建数据目录
mkdir -p /data/zookeeper_data
#创建日志目录
mkdir -p /data/zookeeper_log
更改安装目录、数据目录、日志目录的所有者为hadoop:(在所有Node操作)
chown -R hadoop:hadoop /u01/app/zookeeper-3.4.13
chown -R hadoop:hadoop /data/zookeeper_data
chown -R hadoop:hadoop /data/zookeeper_log
4.2 解压安装文件(在Node1操作)
在root用户解压安装文件到Zookeeper安装目录:
tar -zxvf /install_pack/zookeeper-3.4.13.tar.gz -C /u01/app
4.3 添加环境变量(在所有Node操作)
在root用户下执行:
vi /etc/profile
在最后增加以下内容:
export ZK_HOME=/u01/app/zookeeper-3.4.13
export PATH=$PATH:$ZK_HOME/bin
使配置文件生效:
source /etc/profile
4.4 修改配置文件(在Node1操作)
在hadoop用户进入conf目录:
cd /u01/app/zookeeper-3.4.13/conf/
zoo_sample.cfg是官方给的zookeeper样例文件,复制一份命名为zoo.cfg。(zoo.cfg是官方指定的文件命名规则)
cp /u01/app/zookeeper-3.4.13/conf/zoo_sample.cfg /u01/app/zookeeper-3.4.13/conf/zoo.cfg
修改zoo.cfg配置文件:
vi zoo.cfg
增加以下内容:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper_data
dataLogDir=/data/zookeeper_log
clientPort=2181
server.1=10.200.4.117:2888:3888
server.2=10.200.4.116:2888:3888
server.3=10.100.125.156:2888:3888
参数说明:
tickTime:
这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每隔tickTime时间就会发送一个心跳。
initLimit:
这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到Leader的Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过5个心跳的时间(也就是tickTime)长度后Zookeeper服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5乘以2000=10 秒。
syncLimit:
这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5乘以2000=10秒。
dataDir:
快照日志的存储路径。
dataLogDir:
事物日志的存储路径,如果不配置这个那么事物日志会默认存储到dataDir制定的目录,这样会严重影响zk的性能,当zk吞吐量较大的时候,产生的事物日志、快照日志太多。
clientPort:
这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
创建myid文件:(在Node1输入"1";Node2输入"2";Node3输入"3")
echo "1" > /data/zookeeper_data/myid
4.5 在Node2和Node3安装Zookeeper
复制Node1的Zookeeper安装目录到Node2和Node3。在Node1的hadoop用户下执行:
scp -r /u01/app/zookeeper-3.4.13 [email protected]:/u01/app
scp -r /u01/app/zookeeper-3.4.13 [email protected]:/u01/app
修改安装文件的所有者。在Node2和Node3的root用户下分别执行:
chown -R hadoop:hadoop /u01/app/zookeeper-3.4.13
修改Node2的myid文件:(在hadoop用户)
echo "2" > /data/zookeeper_data/myid
修改Node3的myid文件:(在hadoop用户)
echo "3" > /data/zookeeper_data/myid
至此,Zookeeper在所有Node安装完成。
5、启动和停止服务
在hadoop用户进到Zookeeper的bin目录下:
cd /u01/app/zookeeper-3.4.13/bin
zkServer.sh start
zkServer.sh status
通过status就能看到状态:
zk集群一般只有一个leader(领导者),多个follower(跟随者)。Leader不接受client的请求,负责进行投票的发起和决议,最终更新状态。Follower用于接收客户请求并返回客户结果,参与Leader发起的投票。
Node2是leader:
Node1和Node3是follower:
(注意:我操作的情况是,3个Node都启动后,执行zkServer.sh status才会显示Mode为leader或者follower。如果有任一Node还未启动,会显示Error contacting service. It is probably not running.)
可以用jps命令查看zk的进程,这是zk整个工程的main。
jps
zkServer.sh stop