hadoop的ha部署-利用zookeeper和jns來實現 ...
在正式環境中,搭建高可靠(ha)的系統是必須的。
例如oralce的rac,apache集群,windows伺服器集群
本文不再贅言ha的重要性。
的翻譯,外加一些其它參考和個人的感悟。
譯註:ha-high availability 。原文說了半天,就是要求我們使用zookeeper來實現自動故障轉移(切換),當然這也是絕大部分管理員所期望的。
1.目的
本指引提供關於HDFS高可靠特性的概覽和如何配置管理高可靠hdfs集群(利用日誌管理器特性qjm).
本文檔假定讀者已經理解主要的部件和節點類型。
2.註意:使用日誌管理器還是傳統的共用存儲
本指引討論如何使用qjm配置高可靠的HDFS集群,qjm的作用在於活動名稱幾點和備份名稱節點之間共用編輯日誌。
3.背景
在hadoop 2.0.0之前,HDFS集群中名稱節點是單一故障點。每個集群只有單一的名稱節點,如果機器或者進程發生故障,那麼集群就不可用了,除非名稱節點重啟或者在新的機器上搭建。
這影響了HDFS集群的總體可用性,主要體現在兩個途徑:
- 機器突然故障,直到一個操作員重啟了名稱節點
- 計劃中的維護,例如軟體或者硬體升級(升級名稱節點)會導致整個集群不可用
通過運行兩個冗餘的名稱節點(一個活動,一個待命),可以避免以上提到的問題。這樣如果其中一個有問題或者需要,就可以快速切換到備用節點(譯註:standby ,待命,等待,備用)。
4.框架
在一個典型的ha集群中,有兩個分開的機器被配置為名稱節點。在任何時候,只有一個名稱節點是活動狀態(active),另外一個是等待狀態(standby).活動的名稱節點負責所有客端操作,而等待節點僅僅簡單維護名稱空間狀態,以便需要的時候切換。
為了讓等待狀態的節點保持和活動節點的狀態同步,兩個節點都需要通過一組的守護程式來通訊,這個守護程式稱為journalNodes(JNs-日誌節點)。當活動節點發生任何的名稱空間修改的時候,活動節點記錄這些修改,並告知JNS。等地節點從JNS讀取編輯日誌,並立刻尋找編輯日誌的變更信息。當等待節點看到編輯信息,它會應用到自身的名稱空間。如果主節點發生故障,等待節點會確保自己已經從jns讀取了所有的編輯信息,之後才會把自己設置為活動。這樣確保名稱空間完全同步故障前的內容。
為了提供給一個快速的故障切換,也需要等待節點具有及時的塊位置信息。為了獲得這個,數據節點必須配置兩個名稱節點的信息,並且心跳信息和快報告需要發送給兩個節點。
一個時刻只能有一個名稱節點是活動的,這是ha的必須條件。否則,名稱節點的狀態會分散在兩個節點上,就可能導致數據丟失或者其它錯誤的結果。為了確保這點,並防止稱為腦裂的場景,jns在一個時間點,只會允許一個寫入程式。活動的節點負責寫信息給jns,同時這樣也會主持其它名稱節點變成活動狀態。
5.硬體資源
為了部署一個ha集群,我們應該準備以下內容:
- 名稱節點機器-用於運行活動名稱節點和等待名稱節點,它們應該具有同樣的硬體。
- jns機器-用於運行日誌管理程式(jns)。jns守護程式相對看起來比較輕量,所以可以和其它的hadoop守護程式部署在同一機器上,那些守護程式可以是名稱節點,jobtracker(作業追蹤器),或者yarn資源管理器。註:至少必須有3個jns守護程式,因為編輯日誌必須寫入到大部分jns中。這樣如果其中一些設備出現問題,那麼還有一些jns可以繼續工作。我們也可以運行多於3個jns,但為了提升系統的容錯性,我們應該運行奇數個jns(3,5,7等等)。因為這樣系統至少可以提供(n-1)/2的容錯次數。
需要註意的是,在一個ha集群中,等待名稱節點也執行名稱空間的檢查點,所以就無需運行第二名稱節點,檢查點節點,或者備份名稱節點。
譯註:關於為什麼jns的守護守護程式是奇數個,這個應該和名稱節點寫編輯日誌到jns的方式有關,由於本人並沒有研究代碼,所以不能解釋具體是什麼。
6.部署
6.1配置一覽
類似於聯合配置,ha配置向後相容,並允許現有的單名稱節點配置可以不用修改(配置)而繼續運行。
新的配置允許集群中所有的節點具有相同的配置,這樣不需要根據不同的節點類型部署同的配置文件。
譯註:這的確是一個很好的想法,否則部署成千上萬的集群的確是非常麻煩的,現在不用擔心配置搞混這種事情。
類似於HDFS Federation,ha集群會重用nameservice ID來識別單個的HDFS實例,這個實例可能包含了多個ha名稱節點。此外,一個新的抽象稱為NAMENODE id 加入到ha 中。每個獨立的名稱節點有一個不同的NAMENODE id.
為了支持單一配置文件,相關的配置參數必須把nameservice id作為尾碼,同時也帶上namenode id.
6.2配置明細
為了配置ha名稱節點,我們必須在hdfs-site.xml中添加幾個配置。
配置的順序無關緊要,但dfs.nameservices 和 dfs.ha.namenodes.[nameservice ID]的值會決定接下來配置的關鍵信息。因此,我們必須優先考慮這個兩個。
dfs.nameservices - 名稱服務的邏輯名稱
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
譯註:如果啟用federation,那麼就可以同時啟用多個集群。啟用多個集群的唯一原因,就是為了便於大家共用,其次就是增加namenode的輸出能力,屬於典型的併排模式。
dfs.ha.namenodes.[nameservice ID] - 名稱服務中唯一的名稱節點標識
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
譯註:上面藍色的mycluster是通過dfs.nameservices來決定,並非固定的。其次,目前只能允許一個ha集群終有兩個名稱節點,將來會支持更多一些。
最後,nn1,nn2也是一個邏輯名稱罷了,不是設置為機器的實際名稱。
dfs.namenode.rpc-address.[nameservice ID].[name node ID] - 名稱節點的全稱PRC地址,名稱節點通過這個偵聽rpc信息
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>machine1.example.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>machine2.example.com:8020</value>
</property>
譯註:必須指定埠
dfs.namenode.http-address.[nameservice ID].[name node ID] -名稱節點的http地址全稱,用於偵聽http信息。客戶端則通過這個瀏覽名稱空間,查看文件等等之類的。
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>machine1.example.com:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>machine2.example.com:50070</value>
</property>
註:如果啟用了hadoop的安全選項,則必須配置https-address,配置類似上面的http-address.
dfs.namenode.shared.edits.dir-jns地址,名稱節點寫編輯日誌的目標,多個以分號分隔
uri的格式必須形如:qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*.
其中journalid實際就是名稱服務的唯一標識符。雖然不是強制的,但把journalid設置為何nameservice id一致,是不錯的主意。(譯註:也許將來hdfs就不存在journalid,直接是nameservice id了)
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
</property>
這個地址用於活動節點寫入編輯信息,等待節點讀取編輯信息。雖然我們必須設定多個jns地址,但我們只能配置一個uri.
dfs.client.failover.proxy.provider.[nameservice ID] - hdfs客戶端聯繫活動名稱節點的類
這個類的作用是識別活動節點。當前hadoop提供了兩個實現,分別是ConfiguredFailoverProxyProvider 和 RequestHedgingProxyProvider (第一次調用,會同時聯繫多個節點來判斷哪個是活動的,隨後的請求會激活活動的節點,除非發生了故障切換),
請使用兩者之一,除非自行定製。例如:
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
譯註:RequestHedgingProxyProvider 和 ConfiguredFailoverProxyProvider 有什麼區別
dfs.ha.fencing.methods - 腳本或者java類的列表,用於在故障切換中隔離活動名稱節點
重點,當使用仲裁日誌管理器的時候,一個時間點,只能有一個活動的名稱節點,只能是活動名稱節點寫jns,所以即使腦裂,也不會破壞系統元數據。然而,當故障切換髮生的時候,仍然有可能,前面一個活動名稱節點為客戶端提供讀請求,這樣客戶端獲得信息就可能是過時的。因此,即使有使用仲裁日誌管理器,也有必要配置一些隔離方法。為了在隔離機制失敗的時候,提升系統的可靠性,仍然有必要配置那麼一個隔離方法,這個方法用於保證返回成功,好像最近的隔離方法還在清單中。
註意,如果我們選擇一些沒有實際作用的隔離方法,我們依然需要配置這些,例如"shell(/bin/true)".
隔離方法用回車符分隔,它們會逐個被嘗試,直到返回成功。hadoop提供了兩個方法:shell和sshfence.
如果想實現定製的隔離方法,請看 org.apache.hadoop.ha.NodeFencer 類。
sshfence - ssh到活動名稱節點,並kill進程
sshfence選項通過ssh連接到目標節點,並使用fuser殺掉偵聽特定服務TCP埠的進程。為了讓這個可以使用,必須事先創建不需要用戶密碼的ssh連接。因此,我們必須配置dfs.ha.fencing.ssh.private-key-files選項,ssh私鑰文件用逗號分隔。
例如:
<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>
此外,還可以配置連接的用戶和埠,連接時限(單位毫秒, 如果超過這個連接時限沒有連接到活動節點,那麼表示隔離失敗).
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence([[username][:port]])</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
譯註:這就必要要求名稱節點上要有fuser這個程式。此外,hadoop目前這種做法,也許將來不會再採取了,個人認為有點low!
shell - 運行一個強制shell命令來隔離活動名稱節點
配置看起來如下:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
</property>
位於小括弧內的字元串傳遞了bash shell的路徑,並且可能不包含任何的反小括弧。(譯註:對於 may not include any closing parentheses 不是很理解)
shell命令必須在具有當前hadoop配置的環境變數中運行,使用下劃線(_)替換配置關鍵信息中任意的點號(.)。使用的配置早有名稱節點有關的配置-例如dfs_namenode_rpc-address包含了目標名稱節點的rpc地址,當然也可能是形如dfs.namenode.rpc-address.ns1.nn1.
此外,以下變數也是可以使用的:
$target_host hostname of the node to be fenced --被隔離名稱節點的主機名稱
$target_port IPC port of the node to be fenced --被隔離節點的ipc埠
$target_address the above two, combined as host:port --以上兩個變數的合併
$target_nameserviceid the nameservice ID of the NN to be fenced --被隔離節點的名稱服務ID
$target_namenodeid the namenode ID of the NN to be fenced --被隔離節點的名稱節點ID
這些變數,可以直接在參數中使用,例如:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/path/to/my/script.sh --nameservice=$target_nameserviceid $target_host:$target_port)</value>
</property>
如果shell命令返回0,那麼表示格式成功。反之,失敗,並且下一個隔離方法會被使用。
註:這個隔離方法沒有考慮任何的超時。如果要實現這個,必須在shell腳本中實現。
fs.defaultFS - 如果客戶沒有提供路徑首碼,那麼使用這個預設的
我們可以為hadoop客戶端配置預設的路徑,以便可以使用啟用了ha的邏輯uri.
如果早先使用"mycluster"作為名稱服務ID,那麼這個id就是所有HDFS路徑的重要部分。
我們可以在core-site.xml文件中,如下配置:
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
譯註: 以後訪問ha的hdfs就需要帶上 hdfs://mycluster之類的首碼(不需要使用hdfs://host:port之類的)
如果啟用viewfs,則這個可能又不同了。
dfs.journalnode.edits.dir - jns守護程式本地用於存儲編輯日誌等的路徑
這是一個絕對路徑,位於jns機器上,用於存儲編輯日誌和其它本地狀態。我們可能只使用一個路徑。如果要路徑冗餘,那就需要運行多個jns,或者是路徑位於raid磁碟上。例如:
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/path/to/journal/node/local/data</value>
</property>
6.3部署明細
在所有配置完成後,就必須啟動有關機器上的jns守護程式。這可以通過運行 hadoop-daemon.sh start journalnode 來完成,然後就是等待守護程式在有關的機器上啟動。
一旦守護程式完成啟動,就必須初始同步兩個ha名稱節點磁碟上的元數據。
- 如果配置的是一個新的hdfs集群,那麼必須其中一個名稱節點上先運行hdfs namenode -format
- 如果早已經格式化過,或者僅僅是把一個非ha集群轉換為ha集群,那麼必須把元數據目錄下的數據拷貝到另外一臺,沒有格式化的那一臺節點必須運行hdfs namenode -bootstrapStandby.
- 如果是把一個非ha名稱節點轉為ha節點,那麼必須運行 hdfs namenode -initializeSharedEdits,這樣會使用名稱節點本地編輯日誌目錄中的數據初始化jns。
譯註:關於上面的第二點和第三點的區別,第三點中提到的名稱節點可能是第二名稱節點,檢查點節點,或者是備份節點;而第二點的應該是屬於新增一個名稱節點了。
然後,就可以啟動兩台名稱節點了。
然後可以通過web瀏覽器來訪問兩個名稱節點。需要註意的是,配置地址(configured address)後跟著的是"active"或者"standby".無論什麼時候,一個名稱幾點啟動的時候,其初始狀態是"standby".
6.4 管理命令
Usage: haadmin
[-transitionToActive <serviceId>]
[-transitionToStandby <serviceId>]
[-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
[-getServiceState <serviceId>]
[-checkHealth <serviceId>]
[-help <command>]
-
transitionToActive and transitionToStandby - 傳輸狀態到另外一個節點(active或者standay)
註意,這個命令不提供隔離,所以要少用。應該使用hdfs haadin -failover
-
failover -開始在兩個節點之間進行故障切換
命令用戶切換第一節點到第二個節點。如果 第一個節點是standby,那麼可以沒有錯誤地切換到第二個(第二個變為active).如果第一個是active的,那麼會先嘗試把它變為standby.如果嘗試失敗,那麼隔離方法會被啟用,直到其中一個格式嘗試成功。如果有成功,那麼第二個會被置為active.如果隔離都失敗,那麼切換失敗,並返回錯誤信息。(譯註:如果第一個是standy,還有需要切換嗎?難道兩個都可能是standby嗎)
-
getServiceState -監測名稱節點的狀態,是active還是standby
-
checkHealth -檢查指定節點的健康狀態
成功(健康)返回0,其它就是不健康.註:在2.8.0版本中,尚未實現,總是返回0,除非指定名稱節點關閉了。
7.自動故障轉移
7.1簡介
以上章節描述如何手動配置故障轉移。那種模式下,系統不會子弟on個觸發一個故障轉移,即使活動節點失敗了。以下內容描述如何配置和部署一個自動故障轉移。
7.2組件
自動故障轉移會添加兩個組件:一個zookeeper仲裁者,一個ZKFC(ZK故障轉移控制器進程)。譯註:為了便於書寫,後文把zookeeper簡寫為zk
阿帕奇的zookeeper是一個高可靠服務,可用於維護少量的協調數據,通知客戶數據的變更,並監控客戶端的故障。HDFS的自動故障轉移依賴於zookeeper的以下幾個方面:
-
故障偵測 - 集群中每個名稱節點上都會運行一個zookeeper的持久會話.如果機器崩潰,那麼zk會話就會過期,然後就通知其它節點應該觸發故障轉移了。
-
活動節點選舉 - zk提供了一個簡單的機制來選擇唯一一個節點作為活動節點。如果當前的活動節點完蛋,另外一個節點可能會在zk中設立一個排他鎖,宣告它要成為下一個活動節點。
ZKFC是zk的新組件,屬於zk的客戶端,也會監控和管理名稱節點的狀態。每個運行名稱節點的機器同時也會運行一個zkfc,zkfc負責:
-
監控監控 - zkfc使用健康檢查命令定期檢查本地的名稱節點(譯註:原文使用的是ping,大意是提醒讀者這個行為很像ping). 只要名稱節點及時回應健康的狀態,那麼zkfc就會認為節點是健康的。如果節點崩潰,或者凍結(譯註:原文是frozen),或者進入一個不健康的狀態,那麼zkfc就會把它標記為不健康.
-
zk會話管理- 當本地的名稱節點健康的時候,zkfc會和zk保持一個打開的會話。如果本地節點是活動的,那麼會話就持有一個特定的“lock” znode(譯註:這個可能zk系統的一個說法,運行zkfc的節點稱為znode). 這個鎖會把當前節點當作一個“ephemeral”節點;如果會話過期,那麼鎖定的節點會被刪除掉。(譯註:ephemeral-本意是“
- zk-基本選舉 - 如果本地節點是健康的,zkfc認為沒有其它節點持有一個鎖定的znode,它自己會試圖獲取鎖。如果成功,那麼它就“贏得選舉”,並負責啟動一個故障轉移,把本地節點設定為活動的名稱節點。故障轉移的過程類似於前文的手動方式: 首先,隔離先前的節點(如果有必要),然後本地節點轉為為活動的狀態.
要瞭解更多自動故障轉移的設計細節,請參考apache hdfs jira--https://issues.apache.org/jira/browse/HDFS-2185
譯註:現有版本的ha-hdfs相對比較簡單,總共部署了兩個名稱節點,將來可能會支持更多的節點。zk可以支持許多znode
zk的監控和選舉看起來還是相對簡單的:每個znode不斷試圖證明自己ok,如果不ok,就被zk刪除掉。剩下的健康znode就會爭寵,成功了就切換到特定的節點。
當然,還有更多的細節。不過這不是ha的重點。
7.3部署zookeeper
在一個典型的部署中,zk守護程式運行在3到5個節點中。由於zk自己對資源要求很低,把它們和hdfs的名稱節點(活動的或者等待的)部署在同樣的硬體上也是可以接受的。許多人會選擇把第三個zk進程和yarn資源管理器部署在一起。
強烈建議:不要和名稱節點部署在一起,考慮到性能和隔離性。
zk的配置已經超過了本文的範圍。我們假定你已經在3到5個節點上成功部署並運行了一個zk集群,並通過zk cli驗證過了。
譯註:把zk和nn部署在一起,簡直就是犯罪,不如不做,但原文作者也不會強制阻止那種“勇敢”的行為。
7.4開始前準備
在開始配置自動故障轉移前,我們必須關閉現有的hadoop集群。集群正在運行得時候,是無法從手動模式切換到自動模式的。
7.5配置自動故障轉移
需要在hdfs-site.xml中添加以下部分:
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>啟動自動故障轉移</description>
</property>
在core-site.xml中添加如下:
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
<description>列出運行zk的機器和埠,以逗號分隔</description>
</property>
譯註:原文說到,還有幾種配置的方式。 由於不常用,所以本人也可以少打幾個字了。
7.6初始化zookeeper的ha狀態
在添加了關鍵配置之後,下一步就是初始化zk的數據。我們可以在其中一臺名稱節點上運行名稱來完成這個步驟:
$HADOOP_PREFIX/bin/hdfs zkfc -formatZK
這個命令的作用就是在ZK中創建一個ZNODE數據。
譯註:一般人安裝的時候,不一定設定了HADOOP_PREFIX的變數,多是設定HADOOP_HOME,而且一般有設定PATH,所以以上的命令可以簡化為 hdfs zkfc -formatZK ,或者簡單把HADOOP_PREFIX替換為HADOOP_HOME,實在不行多設置一環境變數也可以 export HADOOP_PREFIX=$HAOOP_HOME
7.7使用start-dfs.sh啟動集群
由於自動故障轉移已經啟用,所以start-dfs.sh腳本會自動啟動ZKFC守護程式(在所有每次節點上)。當zkfc啟動的時候,它們會自動選舉一個活動節點。
譯註:自從有了start-dfs.sh之後,啟動集群變得方便了許多,不用關心在哪個節點上啟動哪些命令。
7.8手動啟動集群
如果是手動管理集群,請使用以下命令(在每一個名稱節點上執行)
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start zkfc
7.9安全訪問zookeeper
如果我們運行的是一個安全集群,我們可能會想確保存儲在zk中的數據也是安全的。這樣可以阻止一些惡意客戶端修改zk的元數據,或者觸發一些錯誤的故障轉移。
為了保全zk的信息,第一步是在core-site.xml中添加如下信息:
<property>
<name>ha.zookeeper.auth</name>
<value>@/path/to/zk-auth.txt</value>
</property>
<property>
<name>ha.zookeeper.acl</name>
<value>@/path/to/zk-acl.txt</value>
</property>
符號@是一個指示,意思是後面跟上的才是一個整個要用到的文件。
第一步,設置zk-auth.txt的內容,內容格式如下:
digest:hdfs-zkfcs:mypassword
hdfs-zkfcs是zk的用戶名稱,mypassword是zk用戶的密碼
第二步,生成zk-acl.txt(需要和zk-auth.txt中的用戶對應)
請使用以下命令生成:
[hdfs]$ java -cp $ZK_HOME/lib/*:$ZK_HOME/zookeeper-3.4.2.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider hdfs-zkfcs:mypassword
output: hdfs-zkfcs:mypassword->hdfs-zkfcs:P/OQvnYyU/nF/mGYvB/xurX8dYs=
把上面輸出中"->"後的紅色字元串整合如下: digest:hdfs-zkfcs:vlUvLnd8MlacsE80rDuu6ONESbM=:rwcda
最後,為了保證這些acl起作用,必須重新運行 hdfs zkfc -formatZK (譯註:如果一開始就配置了安全存取,那麼格式化一次就可以了)
之後,就是通過zk-cli來驗證:
[zk: localhost:2181(CONNECTED) 1] getAcl /hadoop-ha
'digest,'hdfs-zkfcs:vlUvLnd8MlacsE80rDuu6ONESbM= : cdrwa
7.10驗證自動故障轉移
一旦自動故障轉移已經設置好,我們必須測試下。首先找到活動的節點-這個可以通過名稱節點的http來訪問獲取,例如http://nn1:50070
之後,在活動的節點上搞個破壞。例如斷線,kill進程,關機等等。然後看下另外一個節點的狀態是否變成active了(不是馬上,可能要幾秒鐘)。這個等待間隔取決於配置 ha.zookeeper.session-timeout.ms,預設是5秒。
如果沒有成功,那麼一定那麼配錯了。檢查下zfkc的日誌和名稱節點的日誌,或者再看看配置那裡出現錯誤了沒有。
8.自動故障轉移FAQ
- zkfc和名名稱節點的啟動順序是否重要?
不。任何名稱節點上zkfc都可以在名稱節點前或者後啟動 。 譯註:這個是比較令人奇怪的事情,不過當ha中使用zk和多個名稱節點配置之後,除非zk啟動了,否則無法使用的。所以不需要關註這個問題。
-
是否需要額外監測一些東西?
應該更多關註每個名稱節點,確保其上的zkfc是正在運行中。有些情況的zk故障,例如zkfc可能會意外退出,那麼就需要確保重啟zkfc。此外,必須監控zk伺服器。如果zk伺服器完蛋了,也無法自動故障轉移。
- zk關閉的時候發生了什麼?
如果狀況集群甭快,那麼就無法自動觸發故障轉移。然而這對hdfs沒有任何影響,還是可用的. 當zk重啟,hdfs會靜悄悄重連zk。
譯註:就這個方面而言,個人覺得oracle rac做得還是挺不錯的,當然hdfs做得也還可以。
-
是否可以指定某個名稱節點為主要的?
不。當前不允許。那個先啟動,那個就是活動的。你可以選擇先啟動其中一個,或者關閉另外一個然後再重啟來切換到其中一個為主要的點。但不能總是指定為主要的。
-
如果已經配置了自動化的,那麼如何手動故障切換?
即使配置了自動故障轉移,我們也可以使用hdfs haadmin來做手動的故障轉移,效果是一樣的。
9.ha HDFS 的升級/就緒/回滾
當升級HDFS某些版本的時候,有些時候新版本軟體可以簡單安裝並重啟集群。有些時候,升級hdfs,可能要求修改磁碟數據。在這種情況下,必須使用HDFS Upgrade/Finalize/Rollback工具。在ha環境下,這個更加複雜,因為名稱節點磁碟上的元數據是分佈的,除了名稱節點是這樣,jns也是如此。這個章節描述在ha hdfs中如何使用 Upgrade/Finalize/Rollback。
為了執行一個ha升級,操作人員必須做以下事情:
-
正常關閉所有的名稱節點,然後安裝新的軟體。
-
啟動所有jns。至關重要-Upgrade/Finalize/Rollback的時候jns必須都在運行。如果期間,有任意的jns停止運行,那麼操作會失敗。
-
使用-upgrade選項啟動其中一個名稱節點
-
啟動的時候,這台名稱節點立即進入ACTIVE狀態,然後執行對本地存儲目錄和共用編輯日誌的升級。
-
然後使用-bootstrapStandby選項啟動另外一個名稱節點。
註意,如果想就緒或者回滾,那麼只需要正常啟動名稱節點。
就緒一個升級, 操作人員使用‘hdfs dfsadmin -finalizeUpgrade’命令即可,其中一臺名稱節點執行即可。活動的那個會做共用日誌的就緒工作,另外一臺則會把以前的FS的磁碟信息刪除掉(譯註:登臺下一次jns的同步).
執行回滾, 兩個名稱節點都需要關閉,操作人員在執行upgrade的那臺上名稱節點上執行roll back命令,然後那個節點會執行數據回滾。然後這個節點,再次執行正常啟動,另外一臺則執行 `-bootstrapStandby' .
譯註:
1)升級/就緒/回滾之類的都是hdfs namenode中的幾個命令。關於“Finalization”原文的意思就是為升級掃尾並打上正常標記的意思。Finalization本意是終結,但可能會讓讀者誤會。
因為終結一個升級狀態後,就是集群的就緒,所以譯文使用“就緒"而不是”終結".
2) 當故障轉移發生的時候,如何保證hadoop應用可以正常使用了? 由於一些應用可能直接通過直接指向其中一臺名稱節點,這樣可能存在問題。 所以解決這個問題,要麼hadoop已經提供了類似oracle的透明故障轉移,要麼使用api的開發人員必須考慮自己編碼實現
應用的透明故障轉移。由於本人並沒有使用hadoop的api編程,尚不清楚這個。 也不清楚更新的版本中的是什麼情況。
3)hadoop的 federation和ha是可以同時部署的,這個方面可以參考 http://www.linuxidc.com/Linux/2014-05/101181.htm
不好比較hadoop的這種ha和提高吞吐的架構,如果和oracle rac比較,個人覺得後者更加高級一些,既能提高吞吐,也可以提高可靠性, 至少對於開發人員和用戶而言是這樣的。
如果你的應用並不需要同時運行那麼多的task,建議暫時部署ha即可。