使用Atlas進行元數據管理之容錯和高可用

1. 介紹

Apache Atlas使用各類系統並與之交互,爲數據管理員提供元數據管理和數據血緣信息。經過適當地選擇和配置這些依賴關係,可使用Atlas實現高度的服務可用性。本文檔介紹了Atlas中的高可用性支持狀態,包括其功能和當前限制,以及實現此高級別可用性所需的配置。html

在高級架構章節(請參閱我翻譯的《Atlas開發指南(中文版)》)概述了構成Atlas的各類組件。下面提到的各類組件的選項從上面的頁面中獲取上下文,在繼續閱讀本頁以前值得一看。web

2. Atlas Web Service

目前,Atlas Web Service有一個限制,即它一次只能有一個活動實例。在早期版本的Atlas中,能夠配置備份實例並使其可用。可是,須要手動故障轉移才能使此備份實例處於活動狀態。算法

今後版本開始,Atlas將經過自動故障轉移支持活動(active)/被動(passive)配置中的多個Atlas Web服務實例。這意味着用戶能夠同時在不一樣的物理主機上部署和啓動Atlas Web Service的多個實例。其中一個實例將自動選爲「active」實例以服務用戶請求。其餘人將自動被視爲「passive」。若是「active」實例因故意中止或因爲意外故障而變得不可用,則其餘實例之一將自動被選爲「active」實例並開始爲用戶請求提供服務。apache

「active」實例是惟一能夠正確響應用戶請求的實例。它能夠建立,刪除,修改或響應元數據對象上的查詢。 「passive」實例將接受用戶請求,但會使用HTTP重定向將其重定向到當前已知的「active」實例。具體而言,passive實例自己不會響應對元數據對象的任何查詢。可是,全部實例(active和passive)都將響應返回有關該實例的信息的管理請求。bootstrap

在高可用性模式下配置時,用戶能夠得到如下操做收益:後端

  • 維護間隔期間不間斷的服務:若是須要關閉Atlas Web Service的活動實例以進行維護,則另外一個實例將自動變爲活動狀態並能夠爲請求提供服務。
  • 意外故障時的不間斷服務:若是Atlas Web Service的活動實例因軟件或硬件錯誤而失敗,則另外一個實例將自動變爲活動狀態並能夠爲請求提供服務。

在如下小節中,咱們將介紹爲Atlas Web Service設置高可用性所需的步驟。咱們還描述瞭如何設計部署和客戶端以利用此功能。最後,咱們描述了底層實現的一些細節。api

2.1 在Atlas中設置高可用性功能

設置高可用性功能必須知足如下先決條件。瀏覽器

  • 確保在一組計算機上安裝Apache Zookeeper(建議至少使用3臺服務器進行生產)。
  • 選擇2個或更多物理計算機以運行Atlas Web Service實例。這些機器定義了咱們稱之爲Atlas的「服務器集合」。

要在Atlas中設置高可用性,必須在atlas-application.properties文件中定義一些配置選項。雖然在配置頁面中定義了完整的配置項列表,但本節列出了一些主要選項。緩存

  • 高可用性是Atlas中的可選功能。所以,必須經過將配置選項atlas.server.ha.enabled設置爲true來啓用它。
  • 接下來,定義標識符列表,每一個物理機一個用於Atlas Web Service實例。這些標識符能夠是簡單的字符串,如id1,id2等。它們應該是惟一的,不該包含逗號。
  • 將這些標識符的逗號分隔列表定義爲選項atlas.server.ids的值。
  • 對於每臺物理計算機,將IP地址/主機名和端口列爲配置atlas.server.address.id的值,其中id表示此物理計算機的標識符字符串。
    • 例如,若是您選擇了2臺主機名爲host1.company.comhost2.company.com的計算機,則能夠按以下方式定義配置選項:
    atlas.server.ids=id1,id2
    atlas.server.address.id1=host1.company.com:21000
    atlas.server.address.id2=host2.company.com:21000
  • 定義將由Atlas高可用性功能使用的Zookeeper集羣。
atlas.server.ha.zookeeper.connect=zk1.company.com:2181,zk2.company.com:2181,zk3.company.com:2181
  • 您能夠查看爲高可用性功能定義的其餘配置選項,並根據須要在atlas-application.properties文件中進行設置。
  • 對於生產環境,還必須在高可用性模式下設置Atlas所依賴的組件。這將在如下部分中詳細介紹。按照這些說明設置和配置它們。
  • 在所選物理計算機上安裝Atlas軟件。
  • 將使用上述步驟建立的atlas-application.properties文件複製到全部計算機的配置目錄中。
  • 啓動從屬組件。
  • 啓動Atlas Web Service的每一個實例。

要驗證高可用性是否正常,請在安裝了Atlas Web Service的每一個實例上運行如下腳本。服務器

$ATLAS_HOME/bin/atlas_admin.py -status

此腳本能夠打印如下值之一做爲響應:

  • ACTIVE:此實例處於活動狀態,能夠響應用戶請求。
  • PASSIVE:這個實例是被動的。它會將收到的任何用戶請求重定向到當前活動實例。
  • BECOMING_ACTIVE:若是服務器正在轉換爲ACTIVE實例,則會打印出來。服務器沒法在此狀態下爲任何元數據用戶請求提供服務。
  • BECOMING_PASSIVE:若是服務器正在轉換爲PASSIVE實例,則會打印出來。服務器沒法在此狀態下爲任何元數據用戶請求提供服務。

在正常操做狀況下,這些實例中只有一個應該打印值ACTIVE做爲對腳本的響應,而其餘實例將打印PASSIVE。

2.2 配置客戶端以使用高可用性功能

能夠經過兩種方式訪問​​Atlas Web Service:

  • 使用Atlas Web UI:這是一個基於瀏覽器的客戶端,可用於查詢存儲在Atlas中的元數據。
  • 使用Atlas REST API:因爲Atlas公開了RESTful API,所以可使用任何標準REST客戶端,包括其餘應用程序中的庫。實際上,Atlas附帶了一個名爲AtlasClient的客戶端,能夠做爲構建REST客戶端訪問的示例。

爲了利用客戶端中的高可用性功能,有兩種選擇。

(1)使用中間代理

實現對Atlas的高可用性訪問的最簡單的解決方案是安裝和配置一些中間代理,該代理具備基於狀態透明地切換服務的能力。一個這樣的代理解決方案是HAProxy

如下是可使用的示例HAProxy配置。請注意,此提供僅用於說明,而不是推薦的生產配置。請參閱HAProxy文檔以獲取適當的說明。

frontend atlas_fe
  bind *:41000
  default_backend atlas_be

backend atlas_be
  mode http
  option httpchk get /api/atlas/admin/status
  http-check expect string ACTIVE
  balance roundrobin
  server host1_21000 host1:21000 check
  server host2_21000 host2:21000 check backup

listen atlas
  bind localhost:42000

上面的配置綁定HAProxy以監聽端口41000以獲取傳入的客戶端鏈接。而後,它會根據HTTP狀態檢查將鏈接路由到主機host1或host2。狀態檢查是使用REST URL /api/atlas/admin/status上的HTTP GET完成的,僅當HTTP響應包含字符串ACTIVE時才被視爲成功。

(2)使用活動實例自動檢測

若是不想設置和管理單獨的代理,則使用高可用性功能的另外一個選項,是構建可以檢測狀態和重試操做的客戶端應用程序。在這樣的設置中,可使用造成總體的全部Atlas Web Service實例的URL啓動客戶端應用程序。而後,客戶端應在每一個上面調用REST URL/api/atlas/admin/status以肯定哪一個是活動實例。 Active實例的響應形式爲{Status:ACTIVE}。此外,當客戶端在操做過程當中面臨任何異常時,它應該再次肯定哪些剩餘URL處於活動狀態並重試該操做。

Atlas附帶的AtlasClient類可用做示例客戶端庫,該庫實現處理集合並選擇正確的Active Server實例的邏輯。

Atlas中的實用程序(如quick_start.pyimport-hive.sh)能夠配置爲與多個服務器URL一塊兒運行。在此模式下啓動時,AtlasClient會自動選擇並使用當前活動實例。若是在二者之間設置了代理,則在運行quick_start.pyimport-hive.sh時可使用其地址。

2.3 Atlas高可用性的實現細節

Atlas高可用性工做在主JIRA ATLAS-510下進行跟蹤。在其下提交的JIRA提供了有關如何實施高可用性功能的詳細信息。在高層次上,能夠調出如下幾點:

  • 自動選擇Active實例,以及經過領導者選舉算法自動故障轉移到新的Active實例。
  • 對於領導者選舉,咱們使用Leader Latch Recipe of Apache Curator
  • Active實例是惟一一個在後端存儲中初始化,修改或讀取狀態以保持一致的實例。
  • 此外,當實例被選爲活動時,它會刷新來自後端存儲的任何緩存信息以獲取最新信息。
  • servlet過濾器確保只有活動實例服務用戶請求。若是被動實例接收到這些請求,它會自動將它們重定向到當前活動實例。

3. 元數據存儲

Atlas使用JanusGraph存儲和管理元數據。默認狀況下,Atlas使用獨立的HBase實例做爲JanusGraph的底層存儲。爲了爲元數據存儲提供HA,咱們建議將Atlas配置爲使用分佈式HBase做爲JanusGraph的底層存儲。要將Atlas配置爲在HA模式下使用HBase,請執行如下操做:

  • 選擇在HA模式下設置的現有HBase羣集,以在Atlas(OR)中進行配置在HA模式下設置新的HBase羣集。
    • 若是爲Atlas設置HBase,請按照Atlas官網「Installation Steps」,列出的HBase的相關設置說明進行操做。
  • 建議在使用Zookeeper進行協調的不一樣物理主機上的羣集中使用多個HBase主服務器(至少2個),以提供HBase的冗餘和高可用性。
  • 有關在atlas.properties中配置以使用HBase設置Atlas的選項,請參閱我翻譯的《Atlas開發指南(中文版)》中「配置」章節。

4. 索引存儲

如上所述,Atlas經過JanusGraph索引元數據以支持全文搜索查詢。爲了給索引存儲提供HA,咱們建議將Atlas配置爲使用SolrElasticsearch做爲JanusGraph的索引存儲支撐。

4.1 Solr

要將Atlas配置爲在HA模式下使用Solr,請執行如下操做:

  • 選擇HA模式下的現有SolrCloud羣集設置以在Atlas中配置(OR)設置新的SolrCloud羣集。
    • 確保Solr在至少2個物理主機上啓用以實現冗餘,而且每一個主機都運行Solr節點。
    • 建議將冗餘數量設置爲至少2個副本。
  • 建立Atlas所需的SolrCloud集合,詳見Atlas官網「Installation Steps」。
  • 有關在atlas.properties中配置以使用Solr設置Atlas的選項,請參閱我翻譯的《Atlas開發指南(中文版)》的文檔中「配置」章節。

4.2 Elasticsearch

要將Atlas配置爲在HA模式下使用Elasticsearch,請執行如下操做:

  • 選擇現有的Elasticsearch集羣設置,(或)設置新的集羣Elasticsearch集羣。
  • 確保Elasticsearch在至少五個物理主機上啓用以實現冗餘。
  • 建議設置分片數量爲3
  • 有關在atlas.properties中配置以使用Elasticsearch設置Atlas的選項,請參閱我翻譯的《Atlas開發指南(中文版)》的文檔中「配置」章節。

5. 通知服務

來自Hook的元數據通知事件經過寫入名爲ATLAS_HOOK的Kafka Topic發送到Atlas。一樣,從Atlas到其餘集成組件(如Ranger)的事件也會寫入名爲ATLAS_ENTITIES的Kafka Topic。因爲Kafka持久化這些消息,即便消費者因發送事件而關閉,事件也不會丟失。此外,咱們建議Kafka也設置容錯,以便它具備更高的可用性保證。要將Atlas配置爲在HA模式下使用Kafka,請執行如下操做:

  • 選擇在HA模式下設置的現有Kafka羣集,以在Atlas(OR)中配置設置新的Kafka羣集。
  • 建議羣集中不一樣的Kafka代理在不一樣的物理主機上使用Zookeeper進行協調,以提供Kafka的冗餘和高可用性。
    • 設置至少2個物理主機以實現冗餘,每一個主機託管一個Kafka代理。
  • 爲Atlas使用設置Kafka主題:
    • ATLAS主題的分區數應設置爲1(numPartitions)
    • 肯定Kafka主題的副本數量:將此設置爲至少2以實現冗餘。
    • 運行如下命令:
    $KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper <list of zookeeper host:port entries> --topic ATLAS_HOOK --replication-factor <numReplicas> --partitions 1
          $KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper <list of zookeeper host:port entries> --topic ATLAS_ENTITIES --replication-factor <numReplicas> --partitions 1
          Here KAFKA_HOME points to the Kafka installation directory.

    atlas-application.properties中,設置如下配置:

    atlas.notification.embedded=false
      atlas.kafka.zookeeper.connect=<comma separated list of servers forming Zookeeper quorum used by Kafka>
      atlas.kafka.bootstrap.servers=<comma separated list of Kafka broker endpoints in host:port form> - Give at least 2 for redundancy.

6. 問題

若是託管Atlas表的HBase region servers掛掉,Atlas將沒法存儲或檢索HBase中的元數據,直到它們從新聯機。

相關文章
相關標籤/搜索