赞
踩
假设 NameNode1 当前为 Active 状态,NameNode2 当前为 Standby 状态。如果某一时刻 NameNode1 对应的 ZKFailoverController 进程发生了“假死”现象,那么 Zookeeper 服务端会认为 NameNode1 挂掉了,根据前面的主备切换逻辑,NameNode2 会替代 NameNode1 进入 Active 状态。但是此时 NameNode1 可能仍然处于 Active 状态正常运行,这样 NameNode1 和 NameNode2 都处于 Active 状态,都可以对外提供服务。这种情况称为脑裂
Zookeeper的工作原理 Paxos帕克索斯
半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产
选举过程,假设有五台服务器组成的Zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么。
https://www.cnblogs.com/si-137/p/13289673.html
HDFS的启动和关闭都是先启动NameNode,再启动DataNode,最后在启动secondarynamenode。
NameNode启动时,会将镜像文件(Fsimage)和编辑日志(Edits)加载到内存。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode处于安全模式。
当数据块的副本数不满足(dfs.replication.min=1)最小副本数时 数量少于要求的99%,会自动补全,不会主动退出安全模式;
当系统处于安全模式时会检查数据块的完整性。在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求
hdfs dfsadmin -safemode get #查看安全模式状态
hdfs dfsadmin -safemode enter #进入安全模式
hdfs dfsadmin -safemode leave #离开安全模式
为了保证namenode和各个datanode的联系,HDFS采用了心跳机制。位于整个HDFS核心的namenode,通过周期性的活动来检查datanode的活性,像跳动的心脏一样。Namenode周期性向各个datanode发送心跳包,而收到心跳包的datanode要进行回复。因为心跳包是定时发送的,所以namenode就把要执行的命令也通过心跳包发送给datanode,而datanode收到心跳包,一方面回复namenode,另一方面就开始了用户或者应用的数据传输。
如果侦测到datanode失效,namenode之前保存在这个datanode上的数据就变成不可用数据。如果有的副本存储在失效的datanode上,则需要重新创建这个副本,放到另外可用的地方。
一般来讲,datanode与应用交互的大部分情况都是通过网络进行的,而网络数据传输带来的一大问题就是数据是否原样到达。为了保证数据的一致性,HDFS采用了数据校验和(checkSum)机制。创建文件时,HDFS会为这个文件生成一个校验和,校验和文件和文件本身保存在同一空间中。传输数据时会将数据与校验数据和一同传输,应用收到数据后可以进行校验,如果两个校验的结果不同,则文件肯定出错了,这个数据块就变成无效的。如果判定无效,则需要从其他datanode上读取副本。
在linux中,为了防止多个进程向同一个文件写数据的情况,采用了文件加锁的机制。而在HDFS中,同样需要一个机制来防止同一个文件被多个人写入数据。这种机制就是租约(Lease),每当写入数据之前,一个客户端必须获得namenode发放的一个租约。Namenode保证同一个文件只发放一个允许写的租约。那么就可以有效防止多人写入的情况。
HDFS安装或升级时,会将当前的版本信息保存起来,如果升级一段时间内运行正常,可以认为这次升级没有问题,重新保存版本信息,否则,根据保存的旧版本信息,将HDFS恢复至之前的版本。
HDFS 为了降低整体的网络带宽消耗和数据读取延时,HDFS 集群一定会让客户端尽量去读取近的副本,那么按照以上头解释的副本存放策略的结果:
但是 HDFS 是如何确定两个节点是否是统一节点,如何确定的不同服务器跟客户端的远近呢?答案就是机架感知。!!!!
在默认情况下,HDFS 集群是没有机架感知的,也就是说所有服务器节点在同一个默认机架中。那也就意味着客户端在上传数据的时候,HDFS 集群是随机挑选服务器节点来存储数据块的三个副本的
那么假如,datanode1 和 datanode3 在同一个机架 rack1,而 datanode2 在第二个机架 rack2,那么客户端上传一个数据块 block_001,HDFS 将第一个副本存放在 dfatanode1,第二个副本存放在 datanode2,那么数据的传输已经跨机架一次(从 rack1 到 rack2),然后 HDFS 把第三个副本存 datanode3,此时数据的传输再跨机架一次(从 rack2 到 rack1)。显然,当 HDFS 需要处理的数据量比较大的时候,那么没有配置机架感知就会造成整个集群的网络带宽的消耗非常严重。
NameNode内存占用问题
NameNode占用的内存大概是300GB。那么当它重启时,则需要从本地磁盘读取每个文件的元数据。这意味着NameNode需要加载300GB大小的数据到内存中,从而不可避免的导致服务启动时间较长。
在HDFS中,DataNode会通过定时的心跳来上报其数据块的位置信息,NameNode会不断跟踪并检查每个数据块的存储位置。所以数据节点需要上报的数据块越多,则会消耗越多的网络带宽,进而对网络造成压力。
大量的小文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。