ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。
环境准备
规范目录
#root用户执行
useradd hadoop
mkdir -p /application/hadoop #zookeeper安装目录
mkdir -p /data/zookeeper/zkdata #zookeeper数据目录
mkdir -p /data/zookeeper/zklog #zookeeper日志目录
chown -R hadoop.hadoop /application/hadoop #授权
chown -R hadoop.hadoop /data/zookeeper安装jdk
su - hadoop
#普通用户执行
tar -xf jdk-8u161-linux-x64.tar.gz -C /application/hadoop/
ln -s /application/hadoop/jdk1.8.0_161/ /application/hadoop/jdkjava环境变量
#普通用户执行
cat >>~/.bashrc <<'EOF'
export JAVA_HOME=/application/hadoop/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
EOF
. ~/.bashrc
[hadoop@cdh001 ~]$ java -versionZooKeeper Standalone模式
从Apache网站上(zookeeper.apache.org)下载ZooKeeper软件包,我选择了3.4.5版本的(zookeeper-3.4.5-cdh5.10.0.tar.gz),在一台Linux机器上安装非常容易,只需要解压缩后,简单配置一下即可以启动ZooKeeper服务器进程。
解压安装zookeeper
[hadoop@cdh001 ~]$ tar -xf zookeeper-3.4.5-cdh5.10.0.tar.gz -C /application/hadoop/
[hadoop@cdh001 ~]$ cd /application/hadoop/
[hadoop@cdh001 ~]$ ln -s /application/hadoop/zookeeper-3.4.5-cdh5.10.0/ /application/hadoop/zookeeper添加配置
cat > /application/zookeeper/conf/zoo.cfg <<'EOF'
# The number of milliseconds of each tick
# 这个时间是作为 Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
# 配置 Zookeeper接受客户端初始化连接时最长能忍受多少个心跳时间间隔数。
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
# Leader与Follower之间发送消息,请求和应答时间长度
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 数据目录
dataDir=/data/zookeeper/zkdata
# 日志目录
dataLogDir=/data/zookeeper/zklog
# the port at which the clients will connect
# 侦听端口
clientPort=2181
#
# 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
#server,每个节点服务编号=服务器ip地址:集群通信端口:选举端口(Leader宕机后)
server.1=zoo-01:2888:3888
EOF
修改单节点的服务编号
cdh001:
cat>/data/zookeeper/zkdata/myid<<EOF
1
EOFZookeeper环境变量
#普通用户执行
cat >>~/.bashrc <<'EOF'
export ZOOKEEPER_HOME=/application/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH=/application/aria2/bin:$PATH
EOF
. ~/.bashrc防火墙放行并启动
2181zookeeper服务端口 2888集群通信端口 3888选举端口
zkServer.sh restart 重启服务 zkServer.sh status 查看服务运行状态 zkServer.sh stop 关闭服务
检查进程
jps
1558 QuorumPeerMainZookeeper客户端连接
在客户端连接ZooKeeper服务器,执行如下命令: bin/zkCli.sh -server dynamic:2181 上面dynamic是我的主机名,如果在本机执行,则执行如下命令即可: bin/zkCli.sh
ZooKeeper Distributed模式
首先要明确的是,ZooKeeper集群是一个独立的分布式协调服务集群,“独立”的含义就是说,如果想使用ZooKeeper实现分布式应用的协调与管理,简化协调与管理,任何分布式应用都可以使用,这就要归功于Zookeeper的数据模型(Data Model)和层次命名空间(Hierarchical Namespace)结构。
主机名称到IP地址映射配置
ZooKeeper集群中具有两个关键的角色:Leader和Follower集群中所有的节点作为一个整体对分布式应用提供服务,集群中每个节点之间都互相连接,所以,在配置的ZooKeeper集群的时候,每一个节点的host到IP地址的映射都要配置上集群中其它结点的映射信息。
hosts解析(所有节点执行)
cat >> /etc/hosts <<'EOF'
10.0.0.50 cdh001
10.0.0.60 cdh002
10.0.0.70 cdh003
EOFZooKeeper采用一种称为Leader election的选举算法。在整个集群运行过程中,只有一个Leader,其他的都是Follower,如果ZooKeeper集群在运行过程中Leader出了问题,系统会采用该算法重新选出一个Leader(通过3388端口)。因此,各个结点之间要能够保证互相连接,必须配置上述映射。
ZooKeeper集群启动的时候,会首先选出一个Leader,在Leader election过程中,某一个满足选举算的结点就能成为Leader。
配置节点互信
批量密钥分发,配置所有节点互信(所有节点执行)
#!/bin/bash
#yum install sshpass -y
ssh-keygen -f ~/.ssh/id_rsa -P '' -q
for ip in 50 60 70 #<==客户端ip
do
sshpass -p123 ssh-copy-id -p22 -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 10.0.0.$ip
done
#个人习惯非必要二进制安装
解压安装zookeeper(所有节点执行)
[hadoop@cdh001 ~]$ tar -xf zookeeper-3.4.5-cdh5.10.0.tar.gz -C /application/hadoop/
[hadoop@cdh001 ~]$ ln -s /application/hadoop/zookeeper-3.4.5-cdh5.10.0/ /application/hadoop/zookeeper修改ZooKeeper配置文件
配置文件(所有节点执行)
cat >> /application/hadoop/zookeeper/conf/zoo.cfg <<'EOF'
# The number of milliseconds of each tick
# 这个时间是作为 Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
# 配置 Zookeeper接受客户端初始化连接时最长能忍受多少个心跳时间间隔数。
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
# Leader与Follower之间发送消息,请求和应答时间长度
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 数据目录
dataDir=/data/zookeeper/zkdata
# 日志目录
dataLogDir=/data/zookeeper/zklog
# the port at which the clients will connect
# 侦听端口
clientPort=2181
#
# 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
#server,每个节点服务编号=服务器ip地址:集群通信端口:选举端口
server.1=cdh001:2888:3888
server.2=cdh002:2888:3888
server.3=cdh003:2888:3888
EOF修改每个节点的服务编号
在我们配置的`dataDir`指定的目录下面,创建一个`myid`文件,里面内容为一个数字,用来标识当前主机,`conf/zoo.cfg`文件中配置的server.X中X为什么数字,则`myid`文件中就输入这个数字
cdh001:
cat>/data/zookeeper/zkdata/myid<<EOF
1
EOF
cdh002:
cat>/data/zookeeper/zkdata/myid<<EOF
2
EOF
cdh003:
cat>/data/zookeeper/zkdata/myid<<EOF
3
EOF启动zookeeper(所有节点执行)
zkServer.sh restart 重启服务 zkServer.sh status 查看服务运行状态 zkServer.sh stop 关闭服务
集群验证
[hadoop@cdh001 ~]$ /application/hadoop/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /application/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[hadoop@cdh002 ~]$ /application/hadoop/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /application/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[hadoop@cdh003 ~]$ /application/hadoop/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /application/hadoop/zookeeper/bin/../conf/zoo.cfg
Mode: leader