Hadoop2.0 QJM方式的HA的配置

日期:2014-05-03                            來源:Linux社區

本文在《Hadoop2.0的安裝和基本配置》(見 http://www.linuxidc.com/Linux/2014-05/101173.htm )一文的基礎上繼續介紹hadoop2.0 QJM(Quorum Journal Manager)方式的HA的配置(hadoop2.0架構,具體版本是hadoop2.2.0)。本文只介紹HA的主備的手工切換,自動切換在下一篇文章繼續介紹(見http://www.linuxidc.com/Linux/2014-05/101176.htm)。

--------------------------------------分割線 --------------------------------------

相關閱讀

Ubuntu 13.04上搭建Hadoop環境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1版本集羣配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu上搭建Hadoop環境(單機模式+僞分佈模式) http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu下Hadoop環境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

單機版搭建Hadoop環境圖文教程詳解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建Hadoop環境(在Winodws環境下用虛擬機虛擬兩個Ubuntu系統進行搭建) http://www.linuxidc.com/Linux/2011-12/48894.htm

--------------------------------------分割線 --------------------------------------

1 準備

文中描述的機器角色包含2個namenode:

  • namenode1

  • namenode2


其中namenode1爲active namenode;namenode2爲standby namenode。 

包含3個journalnode:

  • journalnode1

  • journalnode2

  • journalnode3

journalnode的機器的數量是奇數,可以是3,5,7...,2n+1。

其他機器角色本文中不涉及的可以參考《hadoop2.0的安裝和基本配置》一文。

2 配置

HA的配置只涉及到core-site.xml和hdfs-site.xml兩個配置文件,其他配置可以文件參考《Hadoop2.0的安裝和基本配置》一文。

2.1 core-site.xml

<configuration>

        <property>

                <name>fs.defaultFS</name>

                <value>hdfs://mycluster</value>

        </property>

        <property>

                <name>hadoop.tmp.dir</name>

                <value>/home/tmp/hadoop2.0</value>

        </property>

</configuration>


2.2 hdfs-site.xml

<configuration>

        <property>

                <name>dfs.replication</name>

                <value>1</value>

        </property>

        <property>

                <name>dfs.namenode.name.dir</name>

                <value>/home/dfs/name</value>

        </property>

        <property>

                <name>dfs.datanode.data.dir</name>

                <value>/home/dfs/data</value>

        </property>

        <property>

                <name>dfs.permissions</name>

                <value>false</value>

        </property>

        <property>

                <name>dfs.nameservices</name>

                <value>mycluster</value>

        </property>

        <property>

                <name>dfs.ha.namenodes.mycluster</name>

                <value>nn1,nn2</value>

        </property>

        <property>

                <name>dfs.namenode.rpc-address.mycluster.nn1</name>

                <value>namenode1:8020</value>

        </property>

        <property>

                <name>dfs.namenode.rpc-address.mycluster.nn2</name>

                <value>namenode2:8020</value>

        </property>

        <property>

                <name>dfs.namenode.http-address.mycluster.nn1</name>

                <value>namenode1:50070</value>

        </property>

        <property>

                <name>dfs.namenode.http-address.mycluster.nn2</name>

                <value>namenode2:50070</value>

        </property>

        <property>

                <name>dfs.namenode.shared.edits.dir</name>

                <value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/mycluster</value>

        </property>

        <property>

                <name>dfs.journalnode.edits.dir</name>

                <value>/home/dfs/journal</value>

        </property>

        <property>

                <name>dfs.client.failover.proxy.provider.mycluster</name>

                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

        </property>

        <property>

                <name>dfs.ha.fencing.methods</name>

                <value>sshfence</value>

        </property>

        <property>

                <name>dfs.ha.fencing.ssh.private-key-files</name>

                <value>/root/.ssh/id_rsa</value>

        </property>

        <property>

                <name>dfs.ha.fencing.ssh.connect-timeout</name>

                <value>6000</value>

        </property>

        <property>

                <name>dfs.ha.automatic-failover.enabled</name>

                <value>false</value>

        </property>

</configuration>

上述有些參數這裏需要解釋一下。

dfs.ha.automatic-failover.enabled

這裏是把主備自動切換關閉,需要手工來切換。在下一篇文章會介紹通過配置zookeeper來實現主備自動切換。

fs.ha.namenodes.mycluster

<value>中的nn1,nn2分別是active namenode和standby namenode的namenode id,你也可以自己起一個namenode id,只要在參數中都保持一致就可以了。

dfs.namenode.shared.edits.dir

配置一組journalnode(3,5,7,...,2n+1)的URI,用於active namenode和standby namenode讀寫edits文件(原理可以參考前面的文章《hadoop2.0的HA介紹》),<value>中的mycluster是dfs.nameservices保持一致。你可以自己起一個nameservice ID,只要在參數中都保持一致就可以了。

dfs.journalnode.edits.dir

是在journalnode節點上用於存放active namenode和standby namenode共享的edits文件的目錄。

dfs.ha.log-roll.period

active namenode的edits文件輪轉的時間間隔,前面沒有設置這個參數,默認值是120秒。即standby namenode會隔120秒要求active namenode切出一個edits文件,然後通過journalnode去同步這個文件。

active namenode會隔120秒會切出一個新edits文件,並且給這些edits文件一個編號,越新的edits文件編號越大。

日誌輪轉的時候開始會先生成一個新的“inprogress” edits文件(文件名帶着“inprogress”),說明日誌正在生成,輪轉沒完成。當過了120秒之後,日誌輪轉完成,文件改名,文件名字帶着一個目前最大的編號(文件名沒有“inprogress”)。然後生成一個新的“inprogress” edits文件,開始下一次edits文件輪轉。

當發生主備切換的時候,會觸發一次edit文件的輪轉,這樣standby namenode就會把剩下的edits文件同步過來,在切換到active狀態時元數據能保持一個最新的狀態。

dfs.ha.tail-edits.period

standby namenode每隔多長時間去檢測新的edits文件。它只會檢查已經完成輪轉的edits文件,不會檢查“inprogress” edits文件。

dfs.ha.fencing.methods

在hdfs-site.xml文件中,隔離策略可以設置兩個(有兩個),即:

<property>

     <name>dfs.ha.fencing.methods</name>

     <value>

            sshfence   

            shell(/bin/true)

     </value>

</property>

分行寫,一行一個。
系統在任何時候只有一個namenode節點處active狀態。在主備切換的時候,standby namenode會變成active狀態,原來的active namenode就不能再處於active狀態了,否則兩個namenode同時處於active狀態會造成所謂的“腦裂”問題。所以在failover的時候要設置防止2個namenode都處於active狀態的方法,可以是java類或者腳本。

fencing的方法目前有兩種,sshfence和shell

sshfence方法是指通過ssh登陸到active namenode節點殺掉namenode進程,所以你需要設置ssh無密碼登陸,還要保證有殺掉namenode進程的權限。

shell方法是指運行一個shell腳本/命令來防止“腦裂”問題,腳本需要自己寫。

注意,QJM方式本身就有fencing功能,能保證只有一個namenode能往journalnode上寫edits文件,所以是不需要設置fencing的方法就能防止“腦裂”問題的。但是,在發生failover的時候,原來的active namenode可能還在接受客戶端的讀請求,這樣客戶端很可能讀到一些過時的數據(因爲新的active namenode的數據已經實時更新了)。因此,還是建議設置fencing方法。如果確實不想設置fencing方法,可以設置一個能返回成功(沒有fencing作用)的方法,如“shell(/bin/true)”。這個純粹爲了fencing方法能夠成功返回,並不需要真的有fencing作用。這樣可以提高系統的可用性,即使在fencing機制失敗的時候還能保持系統的可用性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章