安全模式是 HDFS 的一种工作状态,处于安全模式的状态下,只接受客户端的读请求,不接受删除、修改等请求,它是一种保护机制,用于保护集群中的数据块的安全性。
在 NameNode 主节点启动时,HDFS 首先进入安全模式,集群会开始检查数据块的完整性。DataNode 在启动的时候会向 NameNode 汇报可用的 block 信息,当整个系统达到安全标准时,HDFS 自动离开安全模式。而在安全模式下,系统会处于只读状态,NameNode 不会处理任何块的复制和删除命令。
假设我们设置的副本数(即参数 dfs.replication)是 5,那么在 Datanode 上就应该有 5 个副本存在,假设只存在 3 个副本,那么比例就是 3/5=0.6。在配置文件 hdfs-default.xml 中定义了一个最小的副本的副本率(即参数 dfs.namenode.safemode.threshold-pct)0.999。
我们的副本率 0.6 明显小于 0.99,因此系统会自动的复制副本到其他的 DataNode, 使得副本率不小于 0.999. 如果系统中有 8 个副本,超过我们设定的 5 个副本,那么系统也会删除多余的 3 个副本。
注意:在启动一个刚刚格式化的 HDFS 时不会进入安全模式,因为没有数据块。
什么时候进入?
1. 手动进入 2. 集群二次启动
安全模式的特点:只能读,不能修改(包括增删改)
安全模式下集群在做什么?
在安全模式下,集群在进行恢复元数据,也就是合并 fsimage 和 edit logs,并且接收 datanode 的心跳信息,还有恢复 block 的位置信息,将集群恢复到上次关机前的状态。
安全模式命令:
手动进入安全模式:hdfs dfsadmin -safemode enter
手动退出安全模式:hdfs dfsadmin -safemode leave
获取集群是否处于安全模式:hdfs dfsadmin -safemode get(也可在 web 页面查看)