2.2.3 QJM读过程分析
膳绫擎所示的还有一个很重要的文件就是seen_txid,保存的是一个事务ID,这个事务ID是EditLog最新的一个停止事务id,当NameNode重启时,会次序遍积大年夜edits_0000000000000000001到seen_txid所记录的txid地点的日记文件,进行元数据恢复,如不雅该文件损掉或记录的事务ID有问题,会造成数据可托息的损掉。
HA其本质上就是要包管主备NN元数据是保持一致的,即包管fsimage和editlog在备NN上也是完全的。元数据的同步很大年夜程度取决于EditLog的同步,而这步调的关键就是共享文件体系,下面开端介绍一下关于QJM共享存储机制。
二、QJM道理
2.1 QJM背景
2.x版本中,HDFS架构解决了单点故障问题,即惹人双NameNode架构,同时借助共享存储体系来进行元数据的同步,共享存储体系类型一般有几类,如:Shared NAS+NFS、BookKeeper、BackupNode 和 Quorum Journal Manager(QJM),上图顶用的是QJM作为共享存储组件,经由过程搭建奇数结点的JournalNode实现主备NameNode元数据操作信息同步。Hadoop的元数据包含哪些信息呢,下面介绍下关于元数据方面的常识。
所以对于替代筹划而言,也必须解决NAS相干缺点才能让HA更好办事。即设备无须定制化,通俗设备即可设备HA,安排简单,相干设备集成到体系本身,无需本身定制,同时元数据的同步也必须包管完全HA,不会因client问题而同步掉败。
2.2 QJM道理
2.2.1 QJM介绍
QJM全称是Quorum Journal Manager, 由JournalNode(JN)构成,一般是奇数点结点构成。每个JournalNode对外有一个简略单纯的RPC接口,以供NameNode读写EditLog到JN本地磁盘。当写EditLog时,NameNode会同时向所有JournalNode并行写文件,只要有N/2+1结点写成功则认为此次写操作成功,遵守Paxos协定。其内部实现框架如下:

[ 图3.QJM内部实现框架 ]
大年夜图中可看出,主如果涉及EditLog的不合治理对象和输出流对象,每种对象发挥着各自不合感化:
- FSEditLog:所有EditLog操作的人口
- JournalSet: 集成本地磁盘和JournalNode集群上EditLog的相干操作
- FileJournalManager: 实现本地磁盘上 EditLog 操作
- QuorumJournalManager: 实现JournalNode 集群EditLog操作
- AsyncLoggerSet: 实现JournalNode 集群 EditLog 的写操作集合
- AsyncLogger:提议RPC请求到JN,履行具体的日记同步功能
- JournalNodeRpcServer:运行在 JournalNode 节点过程中的 RPC 办事,接收 NameNode 端的 AsyncLogger 的 RPC 请求。
- JournalNodeHttpServer:运行在 JournalNode 节点过程中的 Http 办事,用于接收处于 Standby 状况的 NameNode 和其它 JournalNode 的同步 EditLog 文件流的请求。
2. 恢复in-process日记
下面具体分析下QJM的读写过程。
2.2.2 QJM 写过程分析
膳绫擎提到EditLog,NameNode会把EditLog同时写到本地和JournalNode。写本地由设备中参数dfs.namenode.name.dir控制,写JN由参数dfs.namenode.shared.edits.dir控制,在写EditLog时会由两个不合的输出流来控制日记的写过程,分别为:EditLogFileOutputStream(本地输出流)和QuorumOutputStream(JN输出流)。写EditLog也不是直接写稻磁逄中,为包管高吞吐,NameNode会分别为EditLogFileOutputStream和QuorumOutputStream定义两个一致大年夜小的Buffer,大年夜小大年夜概是512KB,一个写Buffer(buffCurrent),一个同步Buffer(buffReady),如许可以一边写一边同步,所以EditLog是一个异步写过程,同时也是一个批量同步的过程,避免每写一笔就同步一次日记。
这个是怎么实现边写边同步的呢,这中心其实是有一个缓冲区交换的过程,即bufferCurrent和buffReady在达到前提时会触发交换,如bufferCurrent在达到阈值同时bufferReady的数据又同步完时,bufferReady数据会清空,同时会将bufferCurrent指针指向bufferReady以知足持续写,别的会将bufferReady指针指向bufferCurrent以供给持续同步EditLog。膳绫擎过程用流程图就是表示如下:
推荐阅读
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散! 作为数据的大年夜数据,是信息化、数字化、智能化技巧的应用,具有“4V”特点,亦即海量的数据范>>>详细阅读
地址:http://www.17bianji.com/lsqh/38095.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示