HDFS High Availability 高可用(HA) with QJM

什么是高可用:

1.持续服务的能力。

           2.避免single point of failure 单点故障 SPOF

Fail Over

容灾

fault tolerent

容错

hadoop实现HA的两种方式

1.Using the Quorum Journal Manager (QJM)

2.NFS net FileSystem

3.QJM架构

          配置两个NN,同一时间只能有一个active节点,另一个是待命状态(standby)。

          standby的作用是维护足够多的状态数据,以备容灾使用。

           standby和active节点进行同步,两个节点使用单独的守护进程(JournalNodes)

            进行通信,

            active对namespace的修改会记录到jn中的主版本中,standby从JN中读取,

            灾难发生时,

            standby确保读取了所有的edit数据,再切换成active状态,确保名称节点的状

            态是同步的。

            为了达到快速容灾的目的,standby必须拥有所有数据节点的block信息,所以

            所有数据

           节点都需要配置两个名称节点,实时的向两个名称节点发送心跳信息

           脑裂(split-brain):两个名称节点都处于active状态。为防止这种情况,JN同一时

           刻只允许一个NN作为写入器,容灾发生时,成为active的NN接管向JN写入工

            作,防止其他active写入

4.QJM 容灾配置 (核心:共享编辑日志)

        1.硬件资源:

                           a.多个NN主机

                           b.多个JN

                              JN是轻量级进程,可以和其他数据节点在同一主机,至少配置三个JN节点。

                           c.注意事项:standy也运行检查点工作,所以不可以在配置2NN,否则会报错

         2.部署(可查看apache官方文档):

                            nameservice ID由多个NN构成

                            配置细节【hdfs-site.xml】

                            

1.dfs.nameservices
<property>
<!-- 名称服务逻辑名称 -->
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>


2.dfs.ha.namenodes.[nameservice ID]
<property>
<!-- 名称节点逻辑名称,2.x版本只允许两个名称节点 -->
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
Note: Currently, only a maximum of two NameNodes may be configured per nameservice.


 3.dfs.namenode.rpc-address.[nameservice ID].[name node ID] 
<!-- 名称节点远端过程调用地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>s101:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>s102:8020</value>
</property>


4.dfs.namenode.http-address.[nameservice ID].[name node ID]
<!-- 名称节点WEBUI地址 -->
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>s101:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>s102:50070</value>
</property>


5.dfs.namenode.shared.edits.dir
<!-- 共享日志目录地址 -->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://s103:8485;s104:8485;s105:8485/mycluster</value>
</property>

6.dfs.client.failover.proxy.provider.[nameservice ID]
<!-- 客户端容灾代理供应商就,客户端通过该类判断哪个NN是active状态 -->
<!-- 固定值 -->
<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

7.dfs.ha.fencing.methods 
<!-- 当容灾发生时,对active的保护方法 -->
<property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>

    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/exampleuser/.ssh/id_rsa</value>
    </property>

8.Fs.defaultFS
[core-site.xml]
<!-- 配置文件系统的主机 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>

9.dfs.Journalnode.Editor s.dir
[hdfs-site.xml]
<!-- JournalNode编辑日志的绝对路径 -->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/path/to/journal/node/local/data</value>
</property>

猜你喜欢

转载自blog.csdn.net/qq_29082603/article/details/95315292