目录
一.HDFS的高可用集群
1.1简单介绍
1.说明:
HDFS 高可用集群就是给 HDFS 的"文件总管(NameNode)"配备了一个时刻同步数据的"影子副手(Standby)",并 借助 JournalNode 共享日志和 ZooKeeper 选举裁判 ,实现了存储层元数据的自动容灾,保证即使单台服务器宕机,HDFS 依然能对外提供不间断的文件读写服务。
2.作用:
在典型的HA集群中,通常有两台不同的机器充当NN。在任何时间,只有一台机器处于Active状态;另一台机器是处于Standby状态。ActiveNN负责集群中所有客户端的操作;而StandbyNN主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。
如果同时出现两台Active,NameSpace状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为了保证这种情况不会发生,在任何时间,JNs只允许一个NN充当writer。在故障恢复期间,将要变成Active 状态的NN将取得writer的角色,并阻止另外一个NN继续处于Active状态。
3.工作机制:
为了让StandbyNN的状态和ActiveNN保持同步,即元数据保持一致,它们都将会和JournalNodes守护进程通信。
当ActiveNN执行任何有关命名空间的修改,它需要持久化到一半以上的JournalNodes上(通过edits log持久化存储),而StandbyNN负责观察edits log的变化,它能够读取从JNs中读取edits信息,并更新其内部的命名空间。 StandbyNN读取全部的edits可确保发生故障转移之前,是和ActiveNN拥有完全同步的命名空间状态 。
一旦ActiveNN出现故障,StandbyNN将会保证从JNs中读出了全部的Edits,然后切换成Active状态。
4.工作原理图:
1.2部署zookeeper集群
1.2.1简单介绍
1.说明:zookeeper集群是一个为分布式应用提供一致性服务的中央化系统。类似于分布式集群中的操作内核,负责管理集群中的各个节点的沟通和共识。同时,自身具有高可用架构,当Leader节点宕机时,会自动选举出新Leader。zookeeper集群本身不做数据存储。
注意:因为该集群采用投票方式决定新Leader,所以ZK集群中的节点必须是奇数
2.集群的角色划分:
|---------------|--------------|----------------------------------------------|
| 角色名 | 作用 | 说明 |
| Leader(领导者) | 集群的唯一写入口 | 所有数据的请求都必须经过Leader处理,它负责发起投票并协调事务 |
| Follower(追求者) | 核心参与者 | 主要负责处理客户端的请求,同时参与投票并同步数据,也可作为新Leader的竞选者 |
| Observer(观察者) | 观察员(只读) | 和 Follower 一样能处理读请求,提高集群的吞吐量,但它并不参与投票 |
3.核心作用:
1.领导者选举:
说明:在 HDFS HA 架构中,通常有两个 NameNode:一个处于Active(活跃/工作)状态,另一个处于Standby(待命/备份)状态.。
原理:当两个 NameNode 启动时,都会在 ZooKeeper 的指定目录下尝试创建同一个临时节点 。谁能成功创建这个节点,谁就被选举为 Active NameNode,获得"主控权";另一个则成为 Standby,随时待命。
2.故障检测与自动切换:
说明:在活跃的namenode上存在着一个组件------zkfc(zk集群的故障切换转移器)。
原理:Active 节点的 ZKFC 会定期向 ZooKeeper 发送心跳,并持续修改/刷新 它持有的那个临时节点的数据。如果 Active NameNode 宕机、网络断连或 JVM(Java虚拟机)崩溃,ZKFC 的心跳就会中断。ZooKeeper 检测到该临时节点超时被自动删除 时,会立刻触发新一轮选举,自动将 Standby NameNode 提升为 Active。
3.节点隔离防护:
说明:ZooKeeper 不仅负责"选出来",还负责"按住老的"。当网络出现极端抖动时,老 Active 可能还没彻底死掉,只是与 ZK 网络不通,但它仍认为自己是 Active(脑裂问题)
原理:ZK 在触发新选举并切换后,会利用 ZK 中记录的事务日志版本号(ACL 或 Epoch) ,强制旧 Active 节点进行自毁,例如:强制旧 NameNode 进程退出,或禁止其继续访问共享存储(如 JournalNode),确保只有一个活跃的 namenode 。
1.2.2准备工作
1.完成域名解析
|---------------|---------|-------------------------------------|
| IP地址 | 主机名 | 节点 |
| 192.168.7.191 | server1 | namenode,ZK控制点,ResourceManager |
| 192.168.7.192 | server2 | datanode,Journalnode,QuorumPeerMain |
| 192.168.7.193 | server3 | datanode,Journalnode,QuorumPeerMain |
| 192.168.7.194 | server4 | datanode,Journalnode,QuorumPeerMain |
| 192.168.7.195 | server5 | namenode,ZK控制点,ResourceManager |
2.关闭防火墙和selinux
bash
systemctl disable --now firewalld #关闭防火墙
vim /etc/selinux/config #关闭selinux,并重启系统
#修改以下内容
SELINUX=Disabled

3.确认时间同步
bash
timedatectl #查看时间同步

1.2.3下载并解压软件包
方式一:官网下载
Releases - Apache ZooKeeper
https://zookeeper.apache.org/releases


方式二:wget下载
bash
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.6/apache-zookeeper-3.8.6.tar.gz
ls


1.2.4编辑配置文件
1.复制模板配置文件(server1)
bash
cd apache-zookeeper-3.8.6-bin/conf #进入zookeeper的配置目录下
cp zoo_sample.cfg zoo.cfg #生成配置文件


**说明:**默认情况下,是没有zoo.cfg文件的,需要你去手动复制模板,生成一份
2.编辑配置文件(sever1)
bash
vim zoo.cfg


**说明:**在配置文件的尾行,根据你的数据节点(datanode)的个数,添加相应的地址IP
前面的server.1,server.2等表示数据节点的ID号,不要重复命名
后面的IP加端口号,表示你的数据节点ID对应的主机
3.为数据节点添加ID(三个数据节点)
bash
mkdir /tmp/zookeeper #创建/tmp/zookeeper目录
echo ID > /tmp/zookeeper #添加ID号




**说明:**这里的myid的值,需要与上面的配置文件相对应。
**例如:**myid:1 -> server2(192.168.7.192)
myid:2 -> server3(192.168.7.193)
myid:3 -> server4(192.168.7.194)
1.2.5启动zookeeper集群节点
说明:在三个数据节点datanode上启动zkServer.sh脚本
bash
cd apache-zookeeper-3.8.6-bin/bin #进入zookeeper的程序目录下
./zkServer.sh start #启动服务
./zkServer.sh status #查看当前节点的集群状态


**说明:**三个ZK节点中,一个节点为leader,其他两个节点均为follower
1.3启动HDFS高可用集群
1.3.1编辑.xml文件
1.编辑core-site.xml文件
bash
cd hadoop
vim etc/hadoop/core-site.xml


2.编辑hdfs-site.xml文件
bash
cd hadoop
vim etc/hadoop/hdfs-site.xml


3.编辑工作节点
bash
cd hadoop
vim etc/hadoop/worker


说明:在该文件下定义的节点会被作为数据节点添加进集群中。
bash
cd hadoop
bin/hdfs --daemon start journalnode
1.3.2初始化集群
1.启动journalnode节点(server2,server3,server4)
bash
cd hadoop
bin/hdfs --daemon start journalnode #启动节点
jps #查看当前的节点状态


2.格式化HDFS集群(仅在server1)
bash
bin/hdfs namenode -format


说明:如果你之前有做过hdfs集群,这个操作会清理掉你之前的数据,会让你选择清理数据:
3.将初始化数据传送给另一个namenode节点
bash
scp /tmp/hadoop-hadoop server5:/tmp/ #将初始化的数据传送给另一个namenode节点

说明:hadoop-hadoop目录为初始化后产生的数据,需要将他同步给另一个namenode,确保它存在该数据,确保namenode切过去时,能够正常运行
4.初始化ZK集群(仅在server1上)
bash
bin/zkfc --formatZK


1.3.3启动hdfs集群
1.手动启动集群(仅在server1)
bash
cd hadoop
sbin/start-dfs.sh #确保启动时,无错误

注意: 如果之前的文件配置有错误,导致节点无法启动。切记一定要先去停止掉正在运行的集群,接着去修改配置文件,重新启动 ,否则会造成数据冗余
说明:当发生数据冗余时,即文件修改后,存在错误的节点,比如:server1缺乏某些节点,或者多了些节点,这时需要你手动去修改它
例如:我的配置文件已正确,现在存在数据冗余
bashbin/hdfs --daemon stop datanode #停止该节点上的datanode
bashbin/hdfs --daemon start namenode #停止该节点上的namenode
2.查看集群各节点的状态(在所有节点上执行)
说明:确保主机上的节点正确
bash
jps



3.启动hdfs集群(仅在server1)
bash
bin/zkCli.sh

4.查看namenode的节点状态
bash
浏览器:主机(server1或server5)IP:9870


1.4Yarn高可用集群(RM节点)
1.4.1简单介绍
1.说明**:YARN 高可用集群** 是指为解决 Hadoop 集群中 ResourceManager(资源管理器)单点故障 问题而设计的高可靠运行模式。该集群中存在一个活跃的RM节点和一个standby状态的RM节点。
注意 :RM节点并非是HDFS集群的必需品。如果你的HDFS集群只做冷数据存储,则无需RM节点控制。但如果既存数据又需要计算分析,那就需要RM节点分配计算资源。
2.工作机制:
YARN HA 通过引入 Active/Standby(主/备)双节点架构 ,通常在一台物理机上部署一个 Active RM(对外提供服务),在另一台完全独立的物理机上部署一个 Standby RM(热备,时刻同步状态,随时准备接管)。整个集群同时只存在一个 Active RM,由 Standby RM 作为"影子内阁"实时监控。
3.核心作用:
1.自动选举与故障检测:Active RM 会在 ZooKeeper 上创建一个临时节点(锁)。Standby RM 监控该节点。一旦 Active 心跳消失(宕机),临时节点被删除,Standby 会立刻抢注并提升为新的 Active,整个过程无需人工干预。
2.运行状态持久化 :与 HDFS HA 依赖 JournalNode 存储元数据不同,YARN HA 将当前集群正在运行的应用程序列表、已完成任务的计数器等轻量级状态信息直接存储在 ZooKeeper 的持久节点中 。这使得 Standby 升主时无需加载庞大日志,切换速度通常比 HDFS HA 更快
1.4.2编辑配置文件
1.编辑 etc/hadoop/mapred-site.xml 文件
bash
cd hadoop
vim etc/hadoop/mapred-site.xml

添加以下内容:

2.编辑 etc/hadoop/yarn-site.xml 文件
bash
cd hadoop
vim etc/hadoop/yarn-site.xml

添加以下内容:


1.4.3启动集群
1.启动yarn集群(仅在server1)
bash
sbin/start-yarn.sh

2.查看集群各节点的状态
bash
jps


1.4.4浏览器访问web页面
说明:一般情况下,在高可用架构中,哪个RM节点先启动,它就是activate,另一个则是standby
第一个Web页面
bash
server1IP:8088


第二个Web页面:
说明:第二个页面地址一定要输全,否则会被解析成域名,导致无法访问
bash
server5IP:8088/cluster


第二个页面的访问地址没输全时,会出现类似下面的情况:
1.4.5测试yarn故障切换
说明:
|---------|---------|
| server1 | standby |
| server5 | active |
切换后:
|---------|---------|
| server1 | active |
| server5 | standby |
1.停止server5上的RM节点
bash
kill -9 RM节点PID

2.查看RM节点状态
说明:节点已切换到server1上,server5的web页面无法访问


3.恢复server5上的RM节点
bash
bin/yarn --daemon start resourcemanager

1.5停止所有集群
1.停止yarn集群和dfs集群(仅在server1)
bash
cd hadoop
sbin/stop-yarn.sh #停止yarn集群
sbin/stop-dfs.sh #停止dfs集群

2.停止ZK集群(server2,server3,server4)
bash
cd apache-zookeeper-3.8.6-bin
bin/zkServer.sh stop








