1. zookeeper引言
- 简介
Apache ZooKeeper是Apache软件基金会的一个软件项目,大数据集群服务器的管理者协调者。
简言:ZK就是一个管理多个服务(集群分布式环境下)的
通知机制 Watcher
+文件系统
ZNode 文件系统:保存少量,服务器相关的配置文件信息。
Watcher 监听通知机制:注册监听服务器的上下线。
- 特点
- zk集群中的数据内容,完全一致。
- zk作为集群管理者,天生不存在单点问题。
- zk的主机是动态选举出来的。
- 应用场景
2. 集群安装
1.准备三台服务器
(hadoop11/hadoop12/hadoop13)
0. 设置ip
1. 安装jdk
2. 配置java环境变量
3. 关闭防火墙
4. 设置hostname
5. 设置hosts(3台彼此之间集群互通)
2.安装
# 1. 解压
[root@hadoop11 modules]# tar zxvf zookeeper-3.4.6.tar.gz -C /opt/installs/
# 2. 修改文件名
[root@hadoop11 installs]# mv zookeeper-3.4.6/ zookeeper3.4.6
# 3. 编辑环境变量配置文件
[root@hadoop11 zookeeper3.4.6]# vi /etc/profile
# ------------------下面是添加的内容------
# zookeeper
export PATH=$PATH:/opt/installs/zookeeper3.4.6/bin/
# 4. 重新加载profile配置
source /etc/profile
3.标记主机号
# 1. zk目录下新建一个data目录
作为后续zk的数据存放位置
[root@hadoop11 zookeeper3.4.6]# mkdir data
# 2. 在data下,新建一个myid文件。
[root@hadoop11 zookeeper3.4.6]# cd data
# 3. 里面内容填写当前zk节点的编号
[root@hadoop11 data]# echo 11 > myid
4.初始化配置文件
# 1. 拷贝zoo.cfg文件
[root@hadoop11 conf]# cp zoo_sample.cfg zoo.cfg
# 2. 配置zoo.cfg
-------------以下是内容--------------
#Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
tickTime=2000 #心跳时间周期(单位: 毫秒)
#集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
initLimit=10 #启动zk时候的时间延迟最大值(10倍心跳)
##Leader发送心跳包给集群中所有Follower,若Follower在syncLimit时间内没有响应,那么Leader就认为该follower已经挂掉了,单位:tickTime
syncLimit=5 # zk的主机和从机之间的通信访问的最大延迟(5倍心跳)
dataDir=/opt/installs/zookeeper3.4.6/data/ #zk的数据存储位置
clientPort=2181 # zk的客户端访问zk的端口号
# server.myid=zk的ip:2888:3888
server.11=hadoop11:2888:3888
server.12=hadoop12:2888:3888
server.13=hadoop13:2888:3888
# 2888(内部数据通信的端口) #3888(选举投票使用的端口)
5.同步配置文件
# 1. 同步zookeeper的软件及其内部配置文件信息
scp -r zookeeper3.4.6 root@hadoop12:/opt/installs/
scp -r zookeeper3.4.6 root@hadoop13:/opt/installs/
# 2. 同步zookeeper的环境变量文件/etc/profile
scp -r /etc/profile root@hadoop12:/etc
scp -r /etc/profile root@hadoop13:/etc
# 3. 重新加载其他节点上的zk的环境变量
source /etc/profile
# 4. 修改其他节点上的myid的zk编号。
6.zk服务器管理命令
# 1. 启动
zkServer.sh start
[root@hadoop11 data]# jps
2610 QuorumPeerMain # zk节点的进程。
3500 Jps
# 2. 查看状态
zkServer.sh status
# 3. 停止
zkServer.sh stop
# 4. 客户端
zkCli.sh 登录本机的zk
zkCli.sh -server ip:2181 登录指定ip的zk主机
日志 zk启动异常,查看日志文件:zookeeper.out
默认位置: 启动zkServer的命令所在的目录,
可以通过conf/zkEnv.sh修改 ZOO_LOG_DIR = “/opt/installs/zookeeper3.4.6/logs”
3. HadoopHA(高可用)
HAHadoop(High Available Hadoop) 高可用Hadoop集群。
1.HDFS分布式集群的问题
1. NameNode单点故障
2. NameNode备机空闲
3. NameNode仍然存在少量数据丢失的问题
4. NameNode假死和双主问题
5. NameNode主备自动切换,客户端无法知晓入口地址
2.问题解决思路分析
# 1. NameNode单点故障
思路:提供NameNode备机
在两个NameNode机器上,各自提供一个zkclient。负责注册节点,并监控节点变化
方案:ZKFC--基于zookeeper实现的故障转移程序(基于zk实现的客户端程序)
# 2. NameNode假死和双主问题
思路:
只要NN备机切换,无论NN主机是否死机,都强制杀死。
① 远程登录NN主机节点:ssh
② 执行杀死NameNode进程命令:killall namenode
方案: ZKFC自带该效果,当NN主机宕机,切换备机的同时,会远程登陆NN主机,使用psmisc的命令killall杀死NameNode。防止出现双主。
# 3. NameNode备机空闲
思路:承担SNN的职责
好处:
① NameNode备机资源不闲置,同时替换SNN
② NameNode备机转正,则可以直接从本地读取fsimage恢复数据,方便快捷。
# 4. NameNode仍然存在少量数据丢失的问题
思路:
提供一个分布式存储空间,并可以数据同步共享,用来存储editslog_inprogress文件。
方案:
QJN:基于zookeeper实现的分布式存储系统,还有数据共享同步机制。
QJN之间通过网络进行数据同步--RPC技术
好处:
NameNode备机节点,也存在一个QJN,存储了editslog,这边可以避免从NameNode主机远程拷贝editslog,提升ckeckpoint性能。
NameNode备机转正,除了恢复本地fsimage,还能恢复本地的editslog数据文件,恢复完整数据。
# 5. NameNode主备自动切换,客户端无法知晓入口地址
思路:
① 不能写死ip,将NN主机ip注册再Zk集群中,zk负责主备切换,并更新该节点的值。
② Java客户端通过读取zk节点中的节点之,动态读取HDFS的入口地址(NameNode现主机ip)
方案:
HDFS的NameNode入口地址,配置虚拟ip。
3.架构图
4 HDFS-HA安装
1.配置NN主机和NN备机所在节点的免密登录
# 1. NameNode主节点执行
# 生成密钥(在namenode主和namenode备生成,将公钥发布其他节点)
[root@hadoop11 ~]# ssh-keygen
# 发送公钥(所有NameNode节点都要发送)
[root@hadoop11 ~]# ssh-copy-id hadoop11
[root@hadoop11 ~]# ssh-copy-id hadoop12
[root@hadoop11 ~]# ssh-copy-id hadoop13
# 2. NameNode备机节点执行
# 生成密钥(在namenode主和namenode备生成,将公钥发布其他节点)
[root@hadoop12 ~]# ssh-keygen
# 发送公钥(所有NameNode节点都要发送)
[root@hadoop12 ~]# ssh-copy-id hadoop11
[root@hadoop12 ~]# ssh-copy-id hadoop12
[root@hadoop12 ~]# ssh-copy-id hadoop13
2.安装psmisc
# ZKFC远程杀死假死NN使用的killall namenode命令属于该软件中的。
# 建议所有节点都安装psmisc
[root@hadoop11 ~]# yum install -y psmisc
[root@hadoop12 ~]# yum install -y psmisc
3.安装配置jdk
# 1. 解压jdk
[root@hadoop11 modules]# tar zxvf jdk-8u221-linux-x64.tar.gz -C /opt/installs/
# 2. 改jdk的目录名
# 3. 配置profile环境变量
export JAVA_HOME=/opt/installs/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
# 4. 同步集群环境:
1. 其他节点同步JDK的安装