四、Hadoop-HA 与 Hadoop-federation
a. 每个群集同一时刻只能有一个NameNode,NameNode存在单点故障(SPOF)。
b. 如果该计算机或进程不可用,则整个群集在整个NameNode重新启动或在另一台计算机上启动之前将不可用
c. 如果发生意外事件(例如机器崩溃),则在操作员重新启动NameNode之前,群集将不可 用。
d. 计划内的维护事件,例如NameNode计算机上的软件或硬件升级,将导致群集停机时间的延 长
2、水平扩展 将来服务器启动的时候,启动速度慢
3、namenode随着业务的增多,内存占用也会越来越多 如果namenode内存占满,将无法继续提供服务
2、当主节点出现异常的时候,集群直接将备用节点切换成主节点
-
要求备用节点马上就要工作
-
主备节点内存几乎同步相同
3、独立的线程对主备节点进行监控健康状态
4、需要有一定的选举机制,帮助我们确定主从关系
a. 它的功能和原理的NN的功能是一样的
b. 接受客户端请求,查询数据块DN信息
c. 存储数据的元数据信息
数据文件:Block:DN的映射关系
d. 工作
启动时:接受DN的block汇报
运行时:和DN保持心跳(3s,10m)
e. 存储介质
完全基于内存
优点:数据处理效率高
缺点:数据的持久化(日志edits+快照fsimage)
Standby NameNode(SNN)
a. Standby NameNode:NN的备用节点
b. 他和主节点做同样的工作,但是它不会发出任何指令(同一时刻,集群只能有一个活跃的节点)
c. 存储:数据的元数据信息
数据文件:Block:DN的映射关系 它的内存数据和主节点内存数据几乎是一致的
d. 工作:
启动时: 接受DN的block汇报 运行时: 和DN保持心跳(3s,10m)
e. 存储介质:完全基于内存
优点:数据处理效率高
合并日志文件和镜像
2)当我们操作HDFS的时候ANN会产生日志信息edits_inprogress_0000000000001
3)主节点会将日志文件中新增的数据同步到JournalNode集群上
4)所以只需要snn有操作的日志信息,就可以合并fsImage与edits信息,理论上是一直在合并数据
fsimage -->初始化创建
edits-->从JournalNode集群上定时同步
现在只要同步到edits文件,就开始于fsimage合并
当达到阈值的时候,直接拍摄快照即可
5) SNN将合并好的Fsimage发送给ANN,ANN验证无误后,存放到自己的目录中
(带同学们画这一部分的架构图)
DataNode(DN)
a. 存储文件的Block数据
b. 介质:硬盘
c. 启动时:同时向两个NN汇报Block信息
JournalNode(JN)
b. JournalNode是一个独立的小集群,它的实现原理和Zookeeper的一致( Paxos 消息一致性算法)
c. ANN产生日志文件的时候,就会同时发送到 JournalNode的集群中每个节点上
d. JournalNode不要求所有的jn节点都接收到日志,只要有半数以上的(n/2+1)节点接受收到日志,那么本条日志就生效
e. SNN每间隔一段时间就去QJM上面取回最新的日志
SNN上的日志有可能不是最新的
f. HA集群的状态正确至关重要,一次只能有一个NameNode处于活动状态。
g. JournalNode只允许单个NameNode成为活跃的主节点。在故障转移期间,将变为活动状态的NameNode 将承担写入JournalNodes的角色,这将有效地防止另一个NameNode继续处于活动状态,从而使 新的Active节点可以安全地进行故障转移。
Failover Controller(ZKFC:故障转移控制器)
对 NameNode 的主备切换进行总体控制,能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,为了防止因为NN的GC失败导致心跳受影响,ZKFC作为一个deamon进程从NN分离出来
当集群启动时,主备节点的概念是很模糊的 当ZKFC只检查到一个节点是健康状态,直接将其设置为主节点 当zkfc检查到两个NN节点是的健康状态,发起投票机制 选出一个主节点,一个备用节点,并修改主备节点的状态
一个常见的问题:如果启动的时候,发现有两个备用节点,肯定是因为没有选举,检查一下zookeeper有没有启动起来,如果还是失败,重启一下
问题:
1、SNN为什么不直接去ANN去同步数据。
2、SNN挂了谁去合并日志呢?没有人
2) 运行时:
由 ZKFailoverController、HealthMonitor 和 ActiveStandbyElector 这 3 个组件来协同实现主备切换
a. ZKFailoverController启动的时候会创建 HealthMonitor 和 ActiveStandbyElector 这两 个主要的内部组件 b. HealthMonitor 主要负责检测 NameNode 的健康状态
c. ActiveStandbyElector 主要负责完成自动的主备选举,内部封装了 Zookeeper 的处理逻辑
如果 Active NameNode 对应的 HealthMonitor 检测到 NameNode 的状态异常时,ZKFailoverController 会主动删除当前在 Zookeeper 上建立的临时节点ActiveStandbyElectorLock
处于 Standby 状态的 NameNode 的 ActiveStandbyElector 注册的监听器就会收到这个节点的 NodeDeleted 事件,并创建 ActiveStandbyElectorLock 临时节点,本来处于 Standby 状态的 NameNode 就选举为 Active NameNode 并随后开始切换为 Active 状态。
如果是 Active NameNode 的机器整个宕掉的话,那么跟 zookeeper 连接的客户端线程也挂了 , 会话结束 , 那么根据 Zookeepe 的临时节点特性, ActiveStandbyElectorLock 节点会自动被删除,从而也会自动进行一次主备切换,
Zookeeper 为主备切换控制器提供主备选举支持。 辅助投票
原因
-
-
DataNode :需要保证只有一个 NN 发出与管理数据副本有关的命令;
-
Client 需要保证同一时刻只有一个 NN 能够对 Client 的请求发出正确的响应。 a) 每个 NN 改变状态的时候,向 DN 发送自己的状态和一个本次选举对应的序列号。 b) DN 在运行过程中维护此序列号,当 failover 时,新的 NN 在返回 DN 心跳时会返回自己的 active 状态和一个更大的序列号。 DN 接收到这个返回是认为该 NN 为新的 active 。
-
-
sshfence :通过 SSH 登录到目标机器上,执行命令 fuser 将对应的进程杀死
-
shellfence :执行一个用户自定义的 shell 脚本来将对应的进程隔离
HDFS federation就是使得HDFS支持多个命名空间,并且允许在HDFS中同时存在多个Name Node
单个datanode从4T增长到36T,集群的尺寸增长到8000个datanode。存储的需求从12PB增长到大于100PB。
由于HDFS仅有一个Namenode,无法隔离各个程序,因此HDFS上的一个实验程序就很有可能影响整个HDFS上运行的程序。那么在HDFS Federation中,可以用不同的Namespace来隔离不同的用户应用程序,使得不同Namespace Volume中的程序相互不影响。
这样纵向扩展带来的第一个问题就是启动问题,启动花费的时间太长。当前具有50GB Heap Namenode的HDFS启动一次大概需要30分钟到2小时,那512GB的需要多久?第二个潜在的问题就是Namenode在Full GC时,如果发生错误将会导致整个集群宕机。第三个问题是对大JVM Heap进行调试比较困难。优化Namenode的内存使用性价比比较低。
同一个datanode中可以存着属于多个block pool的多个块。
Block pool允许一个命名空间在不通知其他命名空间的情况下为一个新的block创建Block ID。同时,一个Namenode失效不会影响其下的datanode为其他Namenode的服务。 当datanode与Namenode建立联系并开始会话后自动建立Block pool。每个block都有一个唯一的标识,这个标识我们称之为扩展的块ID(Extended Block ID)= BlockID+BlockID。这个扩展的块ID在HDFS集群之间都是唯一的,这为以后集群归并创造了条件。 Datanode中的数据结构都通过块池ID(BlockPoolID)索引,即datanode中的BlockMap,storage等都通过BPID索引。 在HDFS中,所有的更新、回滚都是以Namenode和BlockPool为单元发生的。即同一HDFS Federation中不同的Namenode/BlockPool之间没有什么关系。
Namespace Volume(命名空间卷)
一个Namespace和它的块池合并在一起称为Namespace Volume,它是一个独立完整的管理单元。
当一个Namenode/Namespace被删除,与之相对应的块池也被删除。
在升级时,每一个nanespace Volume也会整体作为一个单元。
通过多个namenode/namespace把元数据的存储和管理分散到多个节点中
降低单个节点数据压力,计算压力
namenode/namespace可以通过增加机器来进行水平扩展
可以让更多的节点参与到运算
namespace命名空间,通过这种方式确定要处理数据的路径
我们可以通过namenode和namespace组合使用
所有的nn共享dn
但是每一个namespace会单独管理自己的模块
会创建一个管理块的机制:blocks pool
注意:联邦机制和HA完全不一样的,是解决不一样的问题,联邦机制解决的是业务水平扩展的问题,HA解决的是单点故障的问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律