天天看點

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

導語 | 為了進一步滿足騰訊雲 Elasticsearch 客戶對服務穩定性、叢集高可用性等容災能力的要求。騰訊雲 ES 産品提供了跨可用區部署的解決方案,本文将為大家介紹實作原理與實踐案例。文章作者:吳容,騰訊雲 Elasticsearch 研發工程師。

引言

目前騰訊雲 ES 叢集可以支援雙可用區及三可用區的叢集部署,且支援單可用區平滑更新到多可用區叢集。當一個可用區出現故障時,剩餘可用區依然能夠保障叢集的穩定性、服務的可用性和資料的完整性。

一、資料節點

當客戶選擇了跨多可用區的叢集架構部署時,叢集的資料節點必須是多可用區的倍數,如客戶選擇的是三可用區部署,則資料節點個數應為 3,6,9,12 等,以此類推。

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

圖1 騰訊雲ES控制台購買三可用區叢集

如上圖 1 所示,我們在上海地域選擇了三可用區叢集的部署,資料節點數量選擇 6 個。ES 會自動将 6 個資料節點均衡得分布在三個可用區中,并對每個節點标記上可用區屬性,進而可以通過可用區感覺功能将索引的分片自動分布在多可用區中,叢集中節點的具體分布情況如圖 2 所示。

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

圖2 三可用區叢集架構

從圖 2 中我們可以看到,騰訊雲 ES 提供了 VPC 内的負載均衡功能,客戶可以直接通過 VIP 連接配接叢集,由于 VIP 下綁定了叢集内部的所有資料節點,是以客戶所有的讀寫請求會均衡的分布到各個資料節點上。

另外該 VIP 還自帶健康檢查功能,如一個周期内多次檢測到某節點未響應,健康檢查功能則會暫時從該 VIP 的路由清單中摘除該異常節點,直到節點恢複正常。這樣就保障了當一個節點當機或者某一個可用區不可用的情況下,用戶端依然能夠無感覺的請求叢集。

二、專用主節點

為了保障叢集的穩定性和高可用性,當選擇多可用區叢集架構部署時,需強制設定三個專用主節點。其中專用主節點的分布機制如下:

  • 當選擇三可用區部署時,會在每個可用區部署一個專用主節點,進而保障任何一個可用區不可用時,依然能夠選出 Master 節點;
  • 當選擇雙可用區部署時,為了避免出現一個可用區上分布兩個專用主節點且出現“該可用區不可用”導緻選不出 Master 節點的情況,騰訊雲 ES 會選擇一個隐藏可用區用來專門部署專用主節點,如下圖 3 所示。
騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

圖3 雙可用區叢集專用主節點分布原理

三、索引副本分片

為了保障在一個可用區不可用的情況下,依然能夠保證資料的完整性和服務的可用性,索引分片至少設定 1 副本。如果選擇三可用區部署,當兩個可用區不可用時,希望剩下的可用區依然能夠完整提供服務,則索引的副本個數至少為 2 個。

四、ES多可用區架構部署實作機制

騰訊雲 ES 多可用區叢集部署依賴于 ES 提供的節點屬性感覺 awareness [1] 功能。通過對每個節點進行屬性标記,即對節點進行可用區的屬性标記:"node.attr.zone_id:shanghai-3"。

該屬性配置在 elasticsearch.yml 檔案中(也可以選擇在啟動節點時進行參數指定:"./bin/elasticsearch -Enode.attr.zone_id=shanghai-3"),設定完節點屬性後,騰訊雲 ES 叢集通過設定如下參數:"cluster.routing.allocation.awareness.attributes=zone_id" 來讓叢集在分片配置設定中使用節點屬性執行配置設定政策。

這樣 ES 就可以通過可用區 zone_id 屬性将節點進行分類。且将索引的主副本分片分布到屬性 zone_id 不同的節點上。

例如,我們建立了一個具有 4 個資料節點的雙可用區的叢集,分别部署在上海 3 區和上海 4 區。那麼上海 3 區的節點屬性為: "node.attr.zone_id:shanghai-3",上海 4 區的節點屬性為: "node.attr.zone_id:shanghai-4"。

當我們建立一個索引,該索引有 5 個主分片和 1 個副本分片,那麼所有的主分片和對應的副本分片都會均衡的分布在上海 3 區和 4 區上,而不會出現主分片和副本分片同時分布在上海 3 區或者上海 4 區的情況。

需要注意的是:這時候如果有一個可用區挂掉,如上海 3 區整體不可用,ES 會将上海 3 區的主副本分片在上海 4 區進行重建。即這時候會出現主副本分片同時配置設定在同一個可用區的情況。

為了防止某一個可用區不可用,導緻另一個可用區磁盤容量被重建的分片大量耗盡的情況,騰訊雲 ES 啟用了分片強制感覺 (force awareness) 的功能。

騰訊雲 ES 通知設定如下參數:cluster.routing.allocation.awareness.force.zone_id.values=shanghai-3,shanghai-4,進而保證了在一個可用區不可用時,不會使得剩餘的可用區磁盤資源不足的情況。

五、單可用區平滑更新多可用區

前文圖 1 示範了在騰訊雲 ES 控制台購買多可用區叢集的操作步驟。對于存量的單可用區叢集,騰訊雲 ES 同樣支援平滑更新到多可用區的部署架構。具體操作如下圖 4 所示:

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

圖4 騰訊雲ES控制台更新多可用區

這裡需要注意以下幾點:

  • 當選擇了更新到多可用區時,隻能設定新的可用區資訊,不可更改節點配置和磁盤容量;
  • 當更新到雙可用區時,資料節點數量自動翻倍;當更新到三可用區時,資料節點數量自動乘三倍;當從雙可用區更新到三可用區時,資料節點數量自動乘 1.5 倍;
  • 如果原叢集未設定專用主節點,則會強制選擇設定 3 個專用主節點;如果原叢集設定了專用主節點,則節點數量不變,騰訊雲 ES 會自動完成專用主節點在各可用區之間的排程和分布。

單可用區更新到多可用區的變配流程最大的難點和挑戰在于專用主節點的協調上。下面重點介紹騰訊雲 ES 在處理可用區更新方案中專用主節點的實作機制:

為了下圖說明友善,我們先對各類型節點使用不同顔色進行标記:

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

普通節點

普通節點:包含 master、data、ingest 等所有屬性,節點上存儲索引資料,使用藍色标記。

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

專用主節點

專用主節點:隻包含 master 屬性,在叢集中屬于專用主節點,不存儲索引資料,隻負責管理叢集和存儲叢集的中繼資料資訊,使用粉紅色标記。

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

資料節點

資料節點:隻包含 data、ingest 屬性,一般用于具有專用主節點的場景,該節點上存儲索引資料,通常也被稱為專有資料節點,使用綠色标記。

單可用區更新到多可用區場景分析:

(1)原單可用區叢集沒有專用主節點:

如果原單可用區叢集沒有設定專用主節點,這種情況下無論是更新到雙可用區還是三可用區都是比較簡單的。

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

圖5 原單可⽤區⽆專⽤主節點更新到多可⽤區流程示意圖

更新變配流程如上圖 5 所示:

  • 在新增的可用區中申請建立并加入普通節點以及在每個可用區中各加入一個專用主節點(如果是更新到雙可用區,則會在隐藏可用區加入一個專用主節點);
  • 修改各可用區中普通節點的屬性為專有資料節點,即上圖中将藍色變更為綠色。

在流程的第 2 步修改節點屬性時,每重新開機一個節點,min_master_node 都會重新計算并設定,避免在中間狀态發生腦裂。

(2)原單可用區叢集已設定專用主節點:

如果原單可用區叢集中已經設定了 3 個專用主節點,那麼按照最終的狀态來看,應該是每個可用區都會均衡分布一個專用主節點。

自然想到的流程是先在新增的可用區中各加入一個專用主節點,然後再将原可用區中的多餘兩個專用主節點下線即可。如下圖 6 所示:

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

圖6 原單可用區由專用主節點更新到多可用區流程示意圖

具體流程步驟如下:

  • 在新增的可用區中加入資料節點及一個專用主節點(如果是更新到雙可用區,則隻需要在隐藏可用區申請加入一個專用主節點即可);
  • 将原單可用區中多出的兩個專用主節點下線。

但是這種更新變配流程存在一個隐藏的叢集不可用風險。如圖 7 所示:

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

圖7 原單可用區整體不可用示意圖

從圖 6 的第一個流程上我們再結合圖 7 可以看到,如果在中間狀态原單可用區突然發生不可用,那便會出現剩餘的可用區中隻剩下 2 個專用主節點,這時候從 5 個專主變成了 2 個專用主節點,便會出現選不出 Master 節點的情況,進而使得叢集整體不可用,違背了跨可用區的容災初衷。

為了規避上面分析的這種異常風險,我們對圖 6 的第 1 個流程的中間狀态做了優化,如下圖 8 所示:

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐

具體流程如下:

  • 在新增的可用區中加入資料節點及兩個專用主節點(如果是更新到雙可用區,則隻需要在隐藏可用區申請加入兩個專用主節點即可);
  • 将原單可用區中多出的兩個專用主節點和新增的可用區中多出的一個專用主節點下線。

這樣便可保證即使在流程一的中間狀态下任何一個可用區不可用,依然不影響剩餘專用主節點選出 Master 節點。進而保障了叢集的高可用性。

六、結語

本篇文章我們詳細介紹和分析了騰訊雲 ES 叢集多可用區容災的實作原理和操作實踐。并重點介紹了單可用區叢集更新到多可用區的幾種場景及具體流程細節,希望能夠幫助到騰訊雲 ES 的客戶朋友們。

參考資料:

[1] 節點屬性感覺awareness功能:

https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-cluster.html#shard-allocation-awareness

大會預告

12月20日15:30-17:20,由騰訊主辦的 2020 Techo Park 大會大資料分論壇《開源開放,下一代雲端資料倉庫》相約 751D·PARK 北京時尚設計廣場。

與您深入探索資料倉庫的起源、演進與未來,期待與您共同探讨資料倉庫的多中繼資料本質,點選 “閱讀原文” 或掃描下方海報二維碼即可預約報名~

騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐
騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐
騰訊雲Elasticsearch叢集多可用區容災實作原理及最佳實踐