天天看點

阿裡巴巴雲原生 etcd 服務叢集管控優化實踐背景etcd 叢集運作成本優化、使用率提升管控運維效率提升etcd 核心架構更新更新總結

阿裡巴巴雲原生 etcd 服務叢集管控優化實踐背景etcd 叢集運作成本優化、使用率提升管控運維效率提升etcd 核心架構更新更新總結

作者 | 陳星宇(宇慕)

來源 | 阿裡巴巴雲原生公衆号

背景

Kubernetes 采用 etcd 存儲其内部核心中繼資料資訊。經過這些年的發展,尤其是伴随着這兩年雲原生的快速發展,Kubernetes被人們廣泛認同并大規模被使用。伴随阿裡内部容器平台 ASI 及公有雲 ACK 叢集數飛速增長,底層存儲 etcd 叢集獲得井噴式地增長,etcd 叢集數從原來的十幾個發展到了目前達到幾千個,它們分布在世界各地,為上層 Kubernetes 叢集以及其他産品服務,服務使用者超萬個。

這些年,阿裡雲原生 etcd 服務發生了翻天覆地的變化,這篇文章主要分享一下 etcd 服務在面對業務量大規模增長下遇到的問題以及我們是如何解決的,希望對讀者了解 etcd 的使用和管控運維提供經驗分享。

具體将分三個部分進行介紹:

  • etcd 叢集成本優化,使用率提升
  • etcd 管控運維效率提升
  • etcd 核心架構更新

etcd 叢集運作成本優化、使用率提升

近些年,etcd 叢集數井噴式增長。它的運作形态經曆了從 1.0 到 2.0 到 3.0 的變化,具體如下圖:

阿裡巴巴雲原生 etcd 服務叢集管控優化實踐背景etcd 叢集運作成本優化、使用率提升管控運維效率提升etcd 核心架構更新更新總結

1.0 實體機時代

在一開始,我們管控的 etcd 叢集數比較少,我們在主控端上使用 docker 直接運作 etcd 容器。即圖中的 1.0 模式。

2.0 雲上時代

1.0 模式運作 etcd 非常簡單,但也存在使用實體機運作軟體低效等常見問題,随着阿裡巴巴全面上雲的步伐,etcd 也全面将運作環境切到了雲上 ecs,存儲也換成了雲盤 ssd 或 essd。

全面上雲優勢明顯,利用阿裡雲底層 Iaas 的 ecs 彈性和存儲雲盤,etcd 叢集可快速完成垂直水準伸縮,故障遷移也比 1.0 時容易的多。以叢集升配操作為例,整個更新時間從最初的半小時降低到現在的 10 分鐘,可以兼顧業務使用峰值和日常普通壓力,穩定承載阿裡内部雙十一業務高峰以及外部多個公有雲客戶春節大促活動。

阿裡巴巴雲原生 etcd 服務叢集管控優化實踐背景etcd 叢集運作成本優化、使用率提升管控運維效率提升etcd 核心架構更新更新總結

3.0 大規模雲上時代

随着 etcd 叢集數大量增長,運作這些叢集需要的 ecs 與雲盤成本越來越高,etcd 已成為容器服務花費資金最多的部分之一,etcd 運作的成本成為我們必須面對并解決優化的問題。

2.0 模式下使用獨占 ecs 和雲盤我們發現 etcd 資源使用率比較低,存在較多的資源浪費,我們将 2.0 模式進行了進一步更新:将叢集進行混部,降級運作成本。但混部之後我們遇到計算資源争搶和叢集穩定性等風險,時常發生 etcd 叢集切主,導緻上層依賴 etcd 軟體功能異常,例如 Kubernetes controller 切主影響使用者服務。

針對這些問題,我們首先将不同的 etcd 叢集根據不同的服務品質和 SLO 拆分成多種類型,類似 Kubernetes 中 Best effort、Burstable 和 Guaranteed 3 種類型,把不同類型的叢集放在不同的資源池中運作管理。混合部署由于采用了高度打散, 随機的模式, 再加上我們的叢集使用者很多,對 etcd 的熱點請求被分割的很散,沒有聚集,穩定性問題例如叢集切主次數大量降低。在保證穩定性的前提下提升了資源使用率的目的,成本下降明顯。

管控運維效率提升

早期我們運維管理 etcd 叢集的方式比較簡單,采用 shell 腳本基本可以涵蓋 etcd 叢集生命周期全過程,例如叢集建立、删除,遷移都利用腳本完成。以前的這種小作坊模式随着叢集數的井噴式增長越來越不适用,我們遇到 etcd 叢集生産速度慢,适配底層 IaaS 變化難度大等問題,運作時叢集管理效率也很低。

針對這些運維管控效率低的問題,我們擁抱雲原生生态,用 Kubernetes 作為運作 etcd 的底座,并基于開源的 etcd-operator,經過幾年的研發,适配阿裡雲底層 IaaS,修改了很多開源的 bug, 将 etcd 管控運維動作标準化,功能覆寫 etcd 管控全生命周期,推出了新的 etcd 運維管控背景 alpha, 我們利用 alpha 統一了阿裡巴巴内部的 etcd 叢集及公有雲 ACK 上的 etcd 叢集管控,極大地提高了我們管控運維 etcd 叢集的效率。目前我們投入 0.5 人力就可以管理近萬叢集,人效比顯著。下圖展示了他的控制界面。

阿裡巴巴雲原生 etcd 服務叢集管控優化實踐背景etcd 叢集運作成本優化、使用率提升管控運維效率提升etcd 核心架構更新更新總結

下面我們詳細介紹一下 alpha 的具體功能,首先我們看一下下面這幅圖,它描繪了一個 etcd 叢集從建立-》運作-》故障-》再運作-》停止-》銷毀的典型生命周期大圖。

阿裡巴巴雲原生 etcd 服務叢集管控優化實踐背景etcd 叢集運作成本優化、使用率提升管控運維效率提升etcd 核心架構更新更新總結

alpha 做的事情就是覆寫圖上的方方面面,具體分為以下兩部分:

1. etcd 叢集生命周期管理

  • etcd 叢集建立,銷毀,停止,更新,故障恢複等。
  • etcd 叢集狀态監控,包括叢集健康狀态、member 健康狀态,通路量,存儲資料量等。
  • etcd 異常診斷、預案、黑盒探測,配置巡檢等。

2. etcd 資料管理

etcd 資料管理包括資料遷移、備份管理以及恢複,髒資料清理,熱點資料識别等。這塊是 alpha 的特色,我們發現開源或其他産品這方面做得工作很少。我們做的功能具體如下。

1)etcd 資料備份及恢複

兩種方式如下:

  • 傳統模式冷備:支援從 etcdserver 将 snapshot 資料備份至阿裡雲 OSS 或本地,故障時可以根據這個 snapshot 備份檔案恢複。
  • raft learner 熱備:對于新版本的使用了 raft learner 特性的 etcd 叢集,我們可以使用 learner 作為熱備節點,當故障發生時,我們強制将 learner 轉換為正常節點,并将用戶端通路切到這個新節點上,相比于傳統方式故障恢複時間更快,并且 learner 可以部署在不同的地域,實作異地多活的能力。

    2)髒資料清理

    我們可以根據指定 etcd key 字首删除垃圾 kv 的能力,降低 etcd server 存儲壓力。

3)熱點資料識别

我們開發了按照 etcd key 字首進行聚合分析熱點 key 的能力,另外還可以分析不同 key 字首的 db 存儲使用量。利用這個能力,我們多次幫助客戶排查分析 etcd 熱點 key,解決 etcd 濫用問題,這個在大規模 etcd 叢集上是一個必備的能力。

4)資料遷移能力,兩種方式

  • snapshot 方式:通過 etcdsnapshot 備份,再恢複進行遷移方式。
  • raft learner 模式:我們使用 raft learner 特性可以快速從原叢集分裂衍生出新的叢集實作叢集遷移。

5)資料水準拆分

當叢集資料存儲資料量超大時,我們支援使用水準拆分将不同客戶資料拆分存儲到不同的 etcd 叢集中。我們在阿裡内部 ASI 叢集就用了這個功能,使其支援超萬規模節點。

總結一下,我們采用 Kubernetes 作為 etcd 叢集的運作底座,基于開源 operator 改良适配研發了新的 etcd 管控軟體 alpha,覆寫 etcd 全生命周期管控工作,一套軟體管理所有 etcd 叢集,顯著提升了 etcd 管控效率。

etcd 核心架構更新更新

etcd 是雲原生社群中非常重要的一款軟體,幾年的演進發展,解決了很多 bug, 提升了核心的性能和存儲容量。但開源軟體就像是一個毛坯房,真正在生産環境使用問題還是有的,阿裡内部有更大資料存儲規模和性能方面的要求,另外 etcd 自身多租戶共享使用 QoS 控制能力很弱,不适用于我們的使用場景。

我們早期使用開源的 etcd 3.2/3.3 版本, 針對一些我們的使用場景需求,後續我們加入了一些穩定性和安全增強,形成了現在我們使用阿裡内部版本,如下展示了重要的幾個不同:

1. 自适應曆史資料清理 compact 技術

etcd 會存儲使用者資料的曆史值,但是它不能長久的存儲所有曆史值,否則存儲空間會不足。是以 etcd 内部會利用 Compact 機制周期性地清理曆史值資料。當我們的叢集超大,資料量超大時,每次清理對運作時性能影響很大,可以類比一次 full gc。本技術可以根據業務請求量調整 Compact 時機,避開業務使用高峰期, 減少幹擾。

2. 基于 raft learner 的隻讀節點水準擴充能力

raft learner 是 raft 協定中的一種特殊的角色,他不參與 leader 選舉, 但是可以從 leader 處獲得叢集中最新的資料,是以他可以作為叢集的隻讀節點進行水準擴充,提升叢集處理讀請求的能力。

3. 基于 raft learner 的熱備節點

除了上面說的 raft learner 可以作為隻讀節點,我們也可以将其使能用于作為叢集的熱備節點,目前我們廣泛使用熱備節點做異地雙活,保證叢集高可用。

4. etcd 叢集 QoS 能力

總結