Ambari-Server 高可用解決方案

  <small>目前apache官方提供的ambari最新版為2.5.1,還未提供ambari-server 的HA方案,因工作需要實現了一版簡易的Ambari-Server HA。</small>

  • 架構設計

因為ambari-server 與namenode 的作用不同,所以對于宕機的處理實時性的要求相對來講沒有那么高,只需要在active server宕機后,standby 的ambari-server 能夠正常切換,順利接管agent的心跳信息,能夠處理用戶的訪問請求即可。
  此系統的HA解決方案使用hadoop集群內的zookeeper作為協調器,ambari-server 啟動后,在zookeeper內創建一個臨時節點(/ambari/ha/master-hostname),并與zookeeper保持一個長鏈接,再設置一個watcher監控這個節點的狀態。此節點的值為該主機的hostname,所有的agent向ambari-server發送心跳之前,先來zookeeper中獲取此時active的ambari-server的hostname,再向這個ambari-server 發送心跳。
  如果ambari-server 啟動時,向zookeeper創建臨時節點(/ambari/ha/master-hostname)失敗,并且失敗的原因是節點已存在(報 NodeExistsException異常),說明已經有一個ambari-server已成功啟動,則將此ambari-server定義為standby 的角色,設置watcher監聽/ambari/ha/master-hostname,并在zookeeper中創建一個另一個臨時節點(/ambari/ha/standby-hostname),用來做ambari-server HA 管理。


*** -ambari-server HA整體架構圖- ***
*** zookeeper 節點信息 ***

*** 具體細節,我們以Q&A的形式體現... ***

Q1: 因為原生ambari-server依賴內嵌的postgresql數據庫,那么數據同步是如何實現的?

底層的數據同步使用postgersql 的主從結構進行同步

Q2: ambari-server 依賴的是8.4版本的postgresql 數據庫,此版本不支持主從結構怎么辦?

修改ambari-server依賴的postgresql版本,使其依賴9.2版本的postgersql數據庫

Q3: ambari-server 啟動時,需要連接zookeeper,并向zookeeper內創建節點,如果此時zookeeper不可用怎么辦?

開發以stand-alone模式啟動ambari-server的功能,在使用curator連接zookeeper之前,使用zookeeper原生的api試著連接一次zookeeper(創建或訪問/ambari/check-connection),如果能夠正常成功,說明zookeeper可用,則繼續使用curator連接zookeeper。如果zookeeper不可用,則向外層拋出提示信息,提示用戶zookeeper不可用,請執行 ambari-server start --stand-alone 。以stand-alone 模式啟動ambari-server。

Q4: ambari-agent 連接zookeeper,需要使用python 工具包,這些工具包不易管理,如何方便維護?

使用kazoo(pipy官網可搜),將源碼下載下來,打成ambari_kazoo.rpm包,然后讓ambari-agent.rpm包依賴ambari_kazoo.rpm,在安裝ambari-agent時,rpm的包依賴機制會自動幫助我們安裝好Python操作zookeeper 的工具包。

Q5: 如何保證在同一時刻,只有active 的ambari-server 能夠被訪問?

standby ambari-server 啟動時,如果在zookeeper內創建master節點失敗,那么線程阻塞(object.wait()),不繼續啟動ambari-server內部的jetty容器,所以用戶無法訪問standby ambari-server 的web頁面。

Q6: ambari-server 啟動時向zookeeper注冊master節點失敗,則會被定義為standby 的角色,除了阻塞線程,還做了什么事?

執行shell腳本,將本機的postgresql 數據庫設置為slave角色,以便active的ambari-server 的數據庫能夠正常同步到slave機器

Q7: 什么時候觸發ambari-server 的切換?

active ambari-server 宕機時,在zookeeper內創建的臨時節點(/ambari/ha/master-hostname)因為session失效而消失,standby ambari-server 的watcher會被觸發,向zookeeper創建一個新的節點(/ambari/ha/master-hostname),ambari-agent 會向新的ambari-server 發送心跳。

Q8:ambari-server 是如何切換的?

standby ambari-server 中的watcher被觸發后,向zookeeper內創建master-hostname節點,如果創建成功,則notify之前的object.wait() 繼續啟動ioc容器和jetty容器,更新zookeeper中/ambari/ha/history-hostname,執行shell腳本將當前的postgresql數據庫設置為master角色。

Q9: agent識別到ambari-server發生變化時,除了向新的主機發送心跳,還會做什么?

更新本機內的/etc/hosts,將repo源,ntpd服務器信息更新

Q10:如果zookeeper宕機,ambari-agent 向哪個ambari-server 發送心跳?

在ambari-agent 內部會緩存一個變量:activeServerHostName,發生ambari-server切換時,會更新這個變量,如果zookeeper不可用時,將會向此變量對應的ambari-server發送心跳。

Q11: 在切換ambari-server時,涉及到了數據庫的重啟操作,如果數據庫未完全啟動,此時數據庫不能訪問,那么如何保證不出問題?

數據庫內創建一張專門用來測試數據庫是否可用的表,在每次重啟數據庫時,都先想這個表中寫如一條數據,再將此數據讀出來,完成一次操作才視為數據庫完全啟動,再執行原來的業務邏輯,否則每隔5S重試一次。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容