HDFS成员
为了防止namenode挂掉又重启导致数据丢失的问题:可以使用两类文件帮助,fsimage 和 edits
-
fsinage文件
NameNode里面放的都是元数据,是存储在内存里面的,如果电脑突然宕机,数据就会消失,并且NameNode里面存储的元数据非常重要,所以会每隔一个小时,NameNode里面的内存数据就会备份一下,备份的文件就是 fsimage ,并且备份的内容只会保留最近的两次。
如果真的宕机了,重启NameNode,他就会自动加载 fsimage 里面的数据到内存里面
-
edits文件
fsimage 会每隔一个小时保存一份,如果在着一个小时内,电脑突然宕机,也会丢失数据的,在这期间的所有操作都会记录到 edits 文件里面。
edits里面记录的是你的每一次操作,比如:上传,删除等;
如果电脑突然宕机了,这里面的操作就会自动帮你执行一遍,从而达到跟宕机之前一模一样的效果
edits 的生成规则:
1、默认是一小时生成一个
2、如果在一个小时内,疯狂的进行操作,操作的次数超过100万次,就会生成一个新的
3、edits 文件不能太大,超过64M,也会生成一个新的
将老的 fsimage 文件和从未合并的 edits 文件合并在一起,生成一个新的 fsimage ,这个操作是每隔一个小时操作一次。这个事情是 SecondaryNameNode 来做的。
SecondaryNameNode:他会读取当前的 fsimage 文件 和 edits 文件,两个文件合并是在内存上进行的,他会先把 fsimage 文件里面的元数据加载到内存上,然后再按照 edits 文件上所记录的进行操作,这样 NameNode 里面的数据就是最新的数据,然后 SecondaryNameNode 再把最新的数据记录到新的 fsimage 文件当中。
HDFS集群的开机启动原理
开启集群的命令:start-dfs.sh
1、如果是一个新的集群:
当开启新的集群后,就会创建一个新的 edits 文件和一个空的 fsimage 文件,仅此而已
什么是新的集群:
刚格式化了 NameNode 的就是一个新的集群。
要是想重新格式化,需要删除 tmp 下的所有文件及文件夹
2、如果是一个老的集群
首先,整个集群会先进入安全模式(此时的安全模式是只读模式,不允许上传、删除、重命名等操作),只有达到一定的条件之后,才会离开安全模式
在这种情况下,其实最耗时的操作就是加载最新的 fsimage 到 NameNode 节点的内存中, 因为 NameNode 是整个集群的核心,处理大量的数据,速度必须很快;
执行尚未合并的 edits 文件 ,执行里面的每一次操作,达到跟关机之前一样的效果;
重新创建一个新的 edits 文件 ,用来记录接下来的操作。
edits 文件生成的条件:
-
要么是每小时生成一个
-
要么就是大小超过64M
-
要么就手动操作,生成一个
edits 文件也可以通过命令强制让其重新生成一个新的。
//edits 文件可以强制让其滚动,结束当前的 edits 文件,产生一个新的
hdfs dfadmin -rollEdits
什么是文件的滚动?
将一个正在使用的文件结束,并且开启一个新的文件,这个操作就叫滚动
HDFS的安全模式
当hdfs 集群启动的时候,由于要做很多事情,所以这期间集群会进入 安全模式.
当 NameNode 启动之后会进入一个称为安全模式的特殊状态 。处于安全模式的 NameNode 对于客户端来说是只读的。 NameNode 会从所有的 DataNode 接收心跳信号 和块状态报告(blockreport)
离开安全模式的条件:
通俗来说,
就是先判断 每一个 DataNode 的备份(副本)的数量够不够,每一个 DataNode 的最少副本数量都至少是 1 才行;
然后 至少需要99.9%的 DataNode 的备份数量至少是 1;
最后 ,NameNode 还需要接收到 NameNode 上的数据信息。(这个时间可以通过 dfs.namenode.safemode.extension 参数配置)
NameNode将退出安全模式状态。接下来NameNode会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他DataNode上。
也可以手动的进入安全模式,也可以手动的离开安全模式:
1、查看是否处于安全模式:
hdfs dfsadmin -safemode get ON 说明是安全模式,OFF 说明不是安全模式
2、通过命令⼿动进⼊或者离开
hdfs dfsadmin -safemode enter 进入
进入安全模式,上传不起作用,会提示的
hdfs dfsadmin -safemode leave 离开
在公司中,集群全年的可靠性达到:99.99% 365*24*60*60,意味着全年的某个时刻,停止50多分钟。
可通过如下配置修改:
1. dfs.namenode.replication.min:
可用的block 的数量,必须都有一个副本数 1
2. dfs.namenode.safemode.threshold-pct:
集群中,可用的块的数量占全部的数量的比如:99.9% 即可,没必要达到100%,100% 意味着永远离不开安全模式。
3. dfs.namenode.safemode.min.datanodes:
离开安全模式的最小可用(alive)datanode数量要求,默认为0.也就是即使所有datanode都不可用,仍然可以离开安全模式。
4. dfs.namenode.safemode.extension:
当集群中所有的条件都满足后,需要保持多久才能真正的离开,默认为30000 即 30s