现在看看HDFS的通信协议,HDFS的所有通信协议是在TCP/IP协议之上的。客户端连接到NameNode上的一个可配置的TCP端口,按照ClientProtocol协议与NameNode回话,DataNode与NameNode按照DataNodeProtocol协议进行会话。远程过程调用(RPC)包装了ClientProtocol和DataNodeProtocol。NameNode从来不初始化任何RPCs,它只响应由DataNode或者客户端发起的RPC请求。
HDFS的健壮性。HDFS的主要目标即使出现故障时也可以保证数据的可靠性。三种常见的故障类型为NameNode故障、DataNode故障和网络分裂(一种在系统的任何两个组之间的所有网络连接同时发生故障后所出现的情况。发生这种情况时,分裂的系统双方都会从对方一侧重新启动应用程序,进而导致重复服务或裂脑。如果一个群集中配置的两个独立系统具有对指定资源(通常是文件系统或卷)的独占访问权限,则会发生裂脑情况。由网络分裂造成的最为严重的问题是它会影响共享磁盘上的数据)。
数据硬盘故障、心跳和重新复制。每个DataNode周期性地向NameNode发送心跳消息,网络分裂会导致一些DataNode与NameNode失去连接,NameNode根据这些DataNode节点缺少了心跳消息检测到这一情况。NameNode将最近没有心跳的DataNode标记为失效的,并不再向这些DataNode发送任何新的IO请求。失效的DataNode上的数据对于HDFS不再可用,DataNode失效可能导致某些块的复制因子降低到它们所指定的值。NameNode不断地跟踪哪些块需要复制并且在必要时开始复制。重新复制的必要性可能因为很多原因而增加:DataNode变为不可用,某个副本变为损坏的,DataNode上的硬