1. Hadoop的高可用性(总结了Hadoop的高可用显而易见的部分,纯理论无启动高可用的操作,笔记和想法9:1)
读hadoop权威指南的笔记所以有大量hadoop权威指南的内容!!!
如果觉得这些太浅显戳这里–>深入学习
1.1. 问题引入
1.2. 新的namenode响应服务的条件
现在来考虑一下如果旧的namenode失效后,启动一个新的namenode需要满足什么条件?
假设在单一的namenode下,namenode失效。系统管理员需要启动一个拥有文件系统元数据副本
的新的namenode,并配置datanode和客户端
以便使用这个新的namenode。
那么新的namenode的响应条件为:
1. 将命名空间映像导入内存中
2. 使用最新修改的编辑日志文件
3. 然后namenode等待datanode报告其块3
上述操作过程中namenode保持在安全模式4。在DataNode报告大多数文件系统的块可用之后(多少块可用退出安全模式见下面),NameNode会自动离开安全模式。
namenode如何知道何时有足够的阻止报告退出安全模式?需要在hdfs-site.xml中配置属性(如果未配置,则使用默认值)。
(dfs.namenode.safemode.threshold-pct 指定块恢复的百分比)5
(dfs.namenode.safemode.extension 指定时间退出)6
(dfs.namenode.safemode.min.datanodes 指定(被认为是活动)的数据节点的最小数量)7
1.3. 高可用HDFS
上述的恢复被称作冷启动。对于一个拥有大量文件的大规模集群,冷启动甚至可以达到30分钟以上。一旦namenode宕机,就会造成HDFS长时间无法操作文件。
Hadoop2 增加了对高可用的支持。对高可用的实现是:配置了一对namenode(活动-备用)。当活动namenode失效的时候,备用namenode接管活动namenode的任务并服务与客户端的请求,且不会有明显的中断。
为了实现上述的高可用,对架构进行一些更改:
- namenode需要通过高可用共享存储8实现编辑日志共享。备用namenode接管工作以后,会读取整个共享日志来同步状态并继续读取活动namenode写入的新条目。
- datanode需要向两个namenode发送数据块处理报告,因为数据块的映射信息保存在namenode的内存中
- 备用namenode包含The secondary namenode 的角色,备用namenode为活动namenode的namespace提供周期性检查点
在确定namenode已经失效的情况下,备用的namenode可以几十秒内接管活动namenode,但是两个都失效就只能冷启动了。
1.4. 故障切换与规避(20.4.24写入)
其实按理来说故障切换和规避也应该属于高可用HDFS的一部分
上述的高可用的HDFS中的namenode要进行切换,那么整个切换开始和过程由什么来监管?有一个被称之为故障转移器[^9]管理着将活动namenode转为备用namenode的过程。
每个namenode都运行着一个轻量级的故障转移器,转移器的工作是:
1. 监控宿主namenode是否失效(通过一个简单的心跳机制实现)
2. 在namenode失效的时候进行故障切换
可以手动发起故障转移。
这时候就有一个新的问题产生了,怎么保证只用一个namenode在运行?在网络不好或者网络分区导致活动namenode假死(依然活动中,但是ping失败)进而进行故障切换。但是在网络改善情况下,假死的namenode恢复,怎么避免产生脑裂(两个namenode同时工作)?
保证之前的namenode不会继续执行产生危害系统的行为,被称为规避。以下是一些方法。
- 如果使用QJM仅允许一个namenode写入日志。(但是可能先前的活动namenode继续处理过时请求)
- 设置一个SSH规避命令来杀死namenode进程(我只要启动了一个就会杀死另一个进程)
在NFS中币可以只允许一个namenode写入数据,所以要更强的措施。
- 撤销先前的namenode访问共享存储目录的权限(通常使用供应商指定的NFS命令)或者远程管理命令屏蔽相应的端口
终极手段:
- 不用哪个namenode就直接对namenode所在的主机供电单元断电。
到这高可用就结束了,至于怎么开启高可用这个本篇没有,留着再写一篇
以下为一些备注:
唯一存储元数据与文件到数据块映射的地方。 ↩︎
包含一群不协调(不通信)独立(互不影响)一起工作的namenode的HDFS ↩︎
请注意,有关块位置的信息由Namenode保留在内存中,不会存储在任何文件中。因此,Namenode需要时间来从Datanodes获取块位置。 ↩︎
NameNode的安全模式本质上是HDFS集群的只读模式,该模式不允许对文件系统或块进行任何修改。对于namenode在恢复的整个过程中保持安全模式非常重要,因为没有足够的时间从Datanode获取块列表会导致Namenode开始过早地复制块(hdfs会自动进行冗余备份直到达到我们设置的副本数),尽管集群中已经存在足够的副本(但是namenode没完全恢复过来,不知道有足够的副本)。 ↩︎
dfs.namenode.safemode.threshold-pct –指定要满足的块百分比最小复制要求。小于或等于0的值表示退出安全模式前不等待特定百分比的块。值大于1将使安全模式永久生效。此属性的默认值为99.9%,这意味着当文件系统中99.9%的块满足最小复制级别时,Namenode退出安全模式。 ↩︎
dfs.namenode.safemode.extension –确定达到阈值级别后以毫秒为单位的安全模式扩展。默认值为30000毫秒(30秒)。如果采用默认值,则当文件系统中99.9%的块满足最小复制级别加上30秒的扩展名时, Namenode退出安全模式。 ↩︎
dfs.namenode.safemode.min.datanodes –指定[(被视为活动的数据节点)的数量]在namenode退出安全模式之前。小于或等于0的值表示在决定是否在启动过程中保持安全模式时不考虑活动数据节点的数量。大于群集中数据节点数量的值将使安全模式永久生效。此属性的默认值为0。 ↩︎
NFS过滤器或群体日志管理器(QJM) ↩︎