1. 程式人生 > >使用Atlas進行元資料管理之容錯和高可用

使用Atlas進行元資料管理之容錯和高可用

1. 介紹

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