一、概述
1、介绍
- 是一个针对大型分布式系统的可靠协调系统;
- 提供的功能包括:配置维护、名字服务、分布式同步、组服务等;
- 目标就是封装好复杂易出错的关键职务,将简单易用的接口和性能高效、功能稳定的系统提供给用户;
- Zookeeper已经成为Hadoop生态系统中的基础组件
2、特点
- 最终一致性:为客户端展示同一视图,这是Zookeeper最重要的性能;
- 可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受;
- 原子性:更新只能成功或失败,没有中间状态
3、应用场景
3.1 统一命名服务
- (1) 分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同的服务
- 类似于域名与ip之间对应关系,域名容易记住
- 通过名称来获取资源或服务的地址,提供者信息
- (2) 按照层次结构组织服务/应用名称
- 可将服务名称以及地址信息写在Zookeeper上,客户端通过Zookeeper获取可用服务列表
3.2 配置管理
- (1) 分布式环境下,配置文件管理和同步是一个常见问题
- 一个集群中,所有节点的配置信息是一致的,比如Hadoop
- 对配置文件修改后,希望能够快速同步到各个节点上
- (2) 配置管理可交由Zookeeper实现
- 可将配置信息写入Zookeeper的一个znode上
- 各个节点监听这个znode
- 一旦znode中的数据被修改,Zookeeper将会通知各个节点
3.3 集群管理
- (1) 分布式环境下,实时掌握每个节点的状态是必要的
- 可根据节点实时状态做出一些调整
- (2) 可交由Zookeeper实现
- 可将节点信息写入Zookeeper的一个znode上
- 监听这个znode可获得它的实时状态变化
3.4 分布式通知/协调
- (1) 分布式环境下经常存在一个服务需要知道它所管理的子服务的状态
- NameNode需要知道各DataNode的状态
- (2) 心跳检测机制可通过Zookeeper实现
- (3) 信息推送可由Zookeeper实现(发布/订阅模式)
3.5 分布式锁
- (1) Zookeeper是强一致性的
- 多个客户端同时在Zookeeper上创建相同znode,只有一个创建成功
- (2) 实现锁的独占性
- 多个客户端同时在Zookeeper上创建相同znode,创建成功的那个客户端得到锁,其他客户端等待
- (3) 控制锁的时序
二、集群安装
1、安装准备
主机名 | IP地址 |
---|---|
master | 192.168.10.1 |
log1 | 192.168.10.2 |
log2 | 192.168.10.3 |
每一台机器都需要安装jdk环境
2、安装过程
- 编辑/etc/hosts文件加入各节点的主机名和ip信息
192.168.10.1 console
192.168.10.2 log1
192.168.10.3 log2
- 解压安装 console主机
tar zxf zookeeper-3.4.6.tar.gz
cd zookeeper-3.4.6
mkdir -p dataDir #创造快照日志存放目录
mkdir dataLogDir #创造事务日志存放目录
如果不配置dataLogDir,那么事务日志也会写在dataDir目录中。这样会严重影响zk的性能。因为在zk吞吐量很高的时候,产生的事务日志和快照日志太多
- 修改配置文件 /zookeeper/conf/zoo.cfg zk的默认端口为2181
# 存放数据文件
dataDir=/usr/local/zookeeper-3.4.6/dataDir
# 存放日志文件
dataLogDir=/usr/local/zookeeper-3.4.6/dataLogDir
# zookeeper cluster,2888为选举端口,3888为心跳端口
server.1=console:2888:3888
server.2=log1:2888:3888
server.3=log2:2888:3888
- 在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字
echo "1" > /usr/local/zookeeper-3.4.6/dataDir/myid
- 远程复制第一台的zk到另外两台上,并修改myid文件为2和3
- 启动、停止zookeeper
/usr/local/zookeeper-3.4.6/bin/zkServer.sh start|stop
- 验证zookeeper是否已经启动
jps | grep QuorumPeerMain #jps可以列出jvm启动的进程
3、连接zookeeper
3.1 测试集群
/usr/local/zookeeper-3.4.6/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
#follower代表此节点为从属状态
3.2 连接集群
可以通过客户端脚本,连接到ZooKeeper集群上。对于客户端来说,ZooKeeper是一个整体,连接到ZooKeeper集群实际上感觉在独享整个集群的服务,所以,你可以在任何一个结点上建立到服务集群的连接
usr/local/zookeeper-3.4.6/bin/zkCli.sh -server log1:2181
4、定期清理日志
正常运行过程中,ZK会不断地把快照数据和事务日志输出到dataDir和dataLogDir这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的。 我这里采用脚本切割
[root@log1 ~]# cd /usr/local/zookeeper-3.4.6/
[root@log1 zookeeper-3.4.6]# vim clean_zklog.sh
#!/bin/bash
###Description:This script is used to clear zookeeper snapshot file and transaction logs.
###Written by: jkzhao - jkzhao@wisedu.com
###History: 2016-04-08 First release.
# Snapshot file dir.
dataDir=/usr/local/zookeeper-3.4.6/dataDir/version-2
# Transaction logs dir.
dataLogDir=/usr/local/zookeeper-3.4.6/dataLogDir/version-2
# Reserved 5 files.
COUNT=5
ls -t $dataDir/snapshot.* | tail -n +$[$COUNT+1] | xargs rm -f
ls -t $dataLogDir/log.* | tail -n +$[$COUNT+1] | xargs rm -f
[root@log1 zookeeper-3.4.6]# chmod +x clean_zklog.sh
#每个节点配置定时任务
[root@console zookeeper-3.4.6]# crontab -e
0 0 * * 0 /usr/local/zookeeper-3.4.6/clean_zklog.sh