Apache Atlas容錯與高可用方案

筆者近期在和團隊的小夥伴進行數據資產管理方向的探索,本書的翻譯基於Apache Atlas v1.1版本。筆者翻譯的《Atlas開發指南(中文版)》地址爲: https://mantoudev.com 置頂文章 。希望對大家有幫助,閱讀過程中遇到問題歡迎留言或與我聯繫。

1. 介紹

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

在Atlas文檔高級架構章節(請參閱我翻譯的《Atlas開發指南(中文版)》)概述了構成Atlas的各種組件。下面提到的各種組件的選項,都是基於上述文檔中的架構描述,在繼續閱讀本文之前推薦先行閱讀文檔中相關章節。

2. Atlas Web Service

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

從此版本開始,Atlas將通過自動故障轉移支持活動(active)/被動(passive)配置中的多個Atlas Web服務實例。這意味着用戶可以同時在不同的物理主機上部署和啓動Atlas Web Service的多個實例。其中一個實例將自動選爲“active”實例以服務用戶請求。其他實例將自動被視爲“passive”。如果“active”實例因故意停止或由於意外故障而變得不可用,則其他實例之一將自動被選爲“active”實例並開始爲用戶請求提供服務。

“active”實例是唯一可以正確響應用戶請求的實例。它可以創建,刪除,修改或響應元數據對象上的查詢。 “passive”實例將接受用戶請求,但會使用HTTP重定向將其重定向到當前已知的“active”實例。具體而言,passive實例本身不會響應對元數據對象的任何查詢。但是,所有實例(active和passive)都將響應返回有關該實例的信息的管理請求。

在高可用性模式下配置時,用戶可以獲得以下操作收益:

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

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

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中的元數據,直到它們重新聯機。

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