Curve 文件存儲(chǔ)在 Elasticsearch 冷熱數(shù)據(jù)存儲(chǔ)中的應(yīng)用實(shí)踐
??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??
Elasticsearch在生產(chǎn)環(huán)境中有廣泛的應(yīng)用,本文介紹一種方法,基于網(wǎng)易數(shù)帆開源的Curve文件存儲(chǔ),實(shí)現(xiàn)Elasticsearch存儲(chǔ)成本、性能、容量和運(yùn)維方面的顯著提升。
ES 使用 CurveFS 的四大收益
1、CurveFS提供的成本優(yōu)勢(shì)
為了高可靠,ES如果使用本地盤的話一般會(huì)使用兩副本,也就是說存儲(chǔ)1PB數(shù)據(jù)需要2PB的物理空間。但是如果使用CurveFS,由于CurveFS的后端可以對(duì)接S3,所以可以利用對(duì)象存儲(chǔ)提供的EC能力,既保證了可靠性,又可以減少副本數(shù)量,從而達(dá)到了降低成本的目的。
以網(wǎng)易對(duì)象存儲(chǔ)這邊當(dāng)前主流的EC 20+4使用為例,該使用方式就相當(dāng)于是1.2副本。所以如果以ES需要1PB使用空間為例,那么使用CurveFS+1.2副本對(duì)象存儲(chǔ)只需要1.2PB空間,相比本地盤2副本可以節(jié)省800TB左右的容量,成本優(yōu)化效果非常顯著。
2、CurveFS提供的性能優(yōu)勢(shì)
以下文將要介紹的使用場(chǎng)景為例,對(duì)比ES原來使用S3插件做snapshot轉(zhuǎn)存儲(chǔ)的方式,由于每次操作的時(shí)候索引需要進(jìn)行restore操作,以100G的日志索引為例,另外會(huì)有傳輸時(shí)間,如果restore的恢復(fù)速度為100M,那么也要300多秒。實(shí)際情況是在一個(gè)大量寫入的集群,這樣的操作可能要幾個(gè)小時(shí)。
而使用CurveFS后的新模式下基本上只要對(duì)freeze的索引進(jìn)行unfreeze,讓對(duì)應(yīng)節(jié)點(diǎn)的ES將對(duì)應(yīng)的meta數(shù)據(jù)載入內(nèi)存就可以執(zhí)行索引,大概耗時(shí)僅需30S左右,相比直接用S3存儲(chǔ)冷數(shù)據(jù)有數(shù)量級(jí)的下降。
3、CurveFS提供的容量?jī)?yōu)勢(shì)
本地盤的容量是有限的,而CurveFS的空間容量可以在線無限擴(kuò)展。同時(shí)減少了本地存儲(chǔ)的維護(hù)代價(jià)。
4、CurveFS提供的易運(yùn)維優(yōu)勢(shì)
ES使用本地盤以及使用S3插件方式,當(dāng)需要擴(kuò)容或者節(jié)點(diǎn)異常恢復(fù)時(shí),需要增加人力運(yùn)維成本。CurveFS實(shí)現(xiàn)之初的一個(gè)目標(biāo)就是易運(yùn)維,所以CurveFS可以實(shí)現(xiàn)數(shù)條命令的快速部署以及故障自愈能力。
另外如果ES使用CurveFS,就實(shí)現(xiàn)了存算分離,進(jìn)一步釋放了ES使用者的運(yùn)維負(fù)擔(dān)。
選用 CurveFS 的原因
背景: 在生產(chǎn)環(huán)境有大量的場(chǎng)景會(huì)用到ES做文檔、日志存儲(chǔ)后端,因?yàn)镋S優(yōu)秀的全文檢索能力在很多時(shí)候可以大大的簡(jiǎn)化相關(guān)系統(tǒng)設(shè)計(jì)的復(fù)雜度。比較常見的為日志存儲(chǔ),鏈路追蹤,甚至是監(jiān)控指標(biāo)等場(chǎng)景都可以用ES來做。
本地盤到 MinIO
為了符合國(guó)內(nèi)的法律約束,線上系統(tǒng)需要按照要求存儲(chǔ)6個(gè)月到1年不等的系統(tǒng)日志,主要是國(guó)內(nèi)等保、金融合規(guī)等場(chǎng)景。按照內(nèi)部管理的服務(wù)器數(shù)量,單純syslog的日志存儲(chǔ)空間每天就需要1T,按照當(dāng)前手頭有的5臺(tái)12盤位4T硬盤的服務(wù)器,最多只能存儲(chǔ)200多天的日子,無法滿足日志存儲(chǔ)1年的需求。
針對(duì)ES使用本地盤無法滿足存儲(chǔ)容量需求這一情況,網(wǎng)易ES底層存儲(chǔ)之前單獨(dú)引入過基于S3的存儲(chǔ)方案來降低存儲(chǔ)空間的消耗。如下圖,ES配合minio做數(shù)據(jù)存儲(chǔ)空間的壓縮。舉例來說100G的日志,到了ES里面因?yàn)榭煽啃孕枨?,需要雙副本,會(huì)使用200G的空間。ES針對(duì)索引分片時(shí)間,定期性轉(zhuǎn)存儲(chǔ)到minio倉庫。
MinIO 到 CurveFS
這個(gè)方案從一定程度上緩解了存儲(chǔ)空間的資源問題,但是實(shí)際使用的時(shí)候還會(huì)感覺非常不便利。
- 運(yùn)維成本。ES節(jié)點(diǎn)升級(jí)的時(shí)候需要額外卸載安裝S3插件,有一定的運(yùn)維成本。
- 性能瓶頸。自己私有化搭建的Minio隨著bucket里面數(shù)據(jù)量的增長(zhǎng),數(shù)據(jù)存儲(chǔ)和抽取都會(huì)成為一個(gè)很大的問題
- 穩(wěn)定性問題。在內(nèi)部搭建的Minio集群在做數(shù)據(jù)restore的時(shí)候,因?yàn)槲募幚硇阅艿纫蛩?,?jīng)常遇到訪問超時(shí)等場(chǎng)景,所以一直在關(guān)注是否有相關(guān)的系統(tǒng)可以提供更好的讀寫穩(wěn)定性。
由于S3協(xié)議經(jīng)過多年的演化,已經(jīng)成了對(duì)象存儲(chǔ)的工業(yè)標(biāo)準(zhǔn)。很多人都有想過用fuse的方式使用S3的存儲(chǔ)能力。事實(shí)上基于S3的文件系統(tǒng)有很多款,例如開源的s3fs-fuse、ossfs、RioFS、CurveFS等。
在通過實(shí)際調(diào)研以及大量的測(cè)試后,基于Curve的性能(尤其是元數(shù)據(jù)方面,CurveFS是基于RAFT一致性協(xié)議自研的元數(shù)據(jù)引擎,與其他沒有元數(shù)據(jù)引擎的S3文件系統(tǒng)(比如s3fs,ossfs)相比具備巨大的性能優(yōu)勢(shì)),易運(yùn)維,穩(wěn)定性,Curve可以同時(shí)提供塊存儲(chǔ)以及文件存儲(chǔ)能力等能力以及Curve活躍的開源氛圍,最終選用了CurveFS。
CurveFS 結(jié)合 ES 的實(shí)踐
CurveFS簡(jiǎn)介
CurveFS是一個(gè)基于 Fuse實(shí)現(xiàn)的兼容POSIX 接口的分布式文件系統(tǒng),架構(gòu)如下圖所示:
CurveFS由三個(gè)部分組成:
- 客戶端curve-fuse,和元數(shù)據(jù)集群交互處理文件元數(shù)據(jù)增刪改查請(qǐng)求,和數(shù)據(jù)集群交互處理文件數(shù)據(jù)的增刪改查請(qǐng)求。
- 元數(shù)據(jù)集群metaserver cluster,用于接收和處理元數(shù)據(jù)(inode和dentry)的增刪改查請(qǐng)求。metaserver cluster的架構(gòu)和CurveBS類似,具有高可靠、高可用、高可擴(kuò)的特點(diǎn):MDS用于管理集群拓?fù)浣Y(jié)構(gòu),資源調(diào)度。metaserver是數(shù)據(jù)節(jié)點(diǎn),一個(gè)metaserver對(duì)應(yīng)管理一個(gè)物理磁盤。CurveFS使用Raft保證元數(shù)據(jù)的可靠性和可用性,Raft復(fù)制組的基本單元是copyset。一個(gè)metaserver上包含多個(gè)copyset復(fù)制組。
- 數(shù)據(jù)集群data cluster,用于接收和處理文件數(shù)據(jù)的增刪改查。data cluster目前支持兩存儲(chǔ)類型:支持S3接口的對(duì)象存儲(chǔ)以及CurveBS(開發(fā)中)。
Curve除了既能支持文件存儲(chǔ),也能支持塊存儲(chǔ)之外,從上述架構(gòu)圖我們還能看出Curve的一個(gè)特點(diǎn):就是CurveFS后端既可以支持S3,也可以支持Curve塊存儲(chǔ)。這樣的特點(diǎn)可以使得用戶可以選擇性地把性能要求高的系統(tǒng)的數(shù)據(jù)存儲(chǔ)在Curve塊存儲(chǔ)后端,而對(duì)成本要求較高的系統(tǒng)可以把數(shù)據(jù)存儲(chǔ)在S3后端。
ES使用CurveFS
CurveFS定位于網(wǎng)易運(yùn)維的云原生系統(tǒng),所以其部署是簡(jiǎn)單快速的,通過CurveAdm工具,只需要幾條命令便可以部署起CurveFS的環(huán)境,具體部署見[1][2];部署后效果如下圖:
在日志存儲(chǔ)場(chǎng)景,改造是完全基于歷史的服務(wù)器做的在線改造。下圖是線上日志的一個(gè)存儲(chǔ)架構(gòu)示例,node0到node5可以認(rèn)為是熱存儲(chǔ)節(jié)點(diǎn),機(jī)器為12*4T,128G的存儲(chǔ)機(jī)型,每個(gè)節(jié)點(diǎn)跑3個(gè)ES實(shí)例,每個(gè)實(shí)例32G內(nèi)存,4塊獨(dú)立盤。node6到node8為12*8T的存儲(chǔ)機(jī)型,3臺(tái)服務(wù)器跑一個(gè)Minio集群,每臺(tái)機(jī)器上的ES實(shí)例不做數(shù)據(jù)本地寫。
可以看到主要的改造重點(diǎn)是將node6到node8,3個(gè)節(jié)點(diǎn)進(jìn)行ES的配置改造,其中以node6節(jié)點(diǎn)的配置為例:
如配置所示,主要的改造為調(diào)整ES的數(shù)據(jù)存儲(chǔ)目錄到CurveFS的fuse掛載目錄,然后新增 node.attr.box_type 的設(shè)置。在node6到node8上分別配置為cold,node1到node5配置對(duì)應(yīng)屬性為hot,所有節(jié)點(diǎn)配置完成后進(jìn)行一輪滾動(dòng)重啟。
ES設(shè)置
除了底層配置外,很重要的一點(diǎn)就是調(diào)整index索引的設(shè)置。這塊的設(shè)置難度不高,要點(diǎn)是:
- 對(duì)應(yīng)索引設(shè)置數(shù)據(jù)分配依賴和aliases。
- 設(shè)置對(duì)應(yīng)的index Lifecycle policy。
其實(shí)在新節(jié)點(diǎn)開放數(shù)據(jù)存儲(chǔ)后,如果沒有親和性設(shè)置,集群馬上會(huì)啟動(dòng)relocating操作。因此建議對(duì)存量的索引新增routing.alloction.require的設(shè)置來避免熱數(shù)據(jù)分配到CurveFS存儲(chǔ)節(jié)點(diǎn)。針對(duì)每天新增索引,建議加入以下這樣的index template配置。
這個(gè)index template設(shè)置的核心要點(diǎn):
- routing部分要指定新索引寫到熱數(shù)據(jù)節(jié)點(diǎn)。
- lifecycle中的新增rollover_alias設(shè)置。
index部分的lifecycle是指索引的生命周期策略,需要注意rollover_alias里面的值要和下面的aliases定義對(duì)齊。
冷數(shù)據(jù)的切換,可以在kibana的index_lifecycle_management管理頁面設(shè)置。針對(duì)上面的syslog場(chǎng)景,hot部分設(shè)置如下圖,其余基本默認(rèn)的就可以了。
在索引周期管理配置頁面中,除了設(shè)置hot phase,還可以設(shè)置warm phase,在warm phase可以做一些shrink,force merge等操作,日志存儲(chǔ)場(chǎng)景我們直接做hot到cold的處理邏輯。
從技術(shù)上講,日志存儲(chǔ)類型的業(yè)務(wù),底層索引一旦完成寫后基本不做再次的數(shù)據(jù)更改,設(shè)置索引副本數(shù)量主要是為了應(yīng)對(duì)分布式系統(tǒng)節(jié)點(diǎn)宕機(jī)等異常場(chǎng)景的數(shù)據(jù)恢復(fù)。如果存儲(chǔ)層面有更可靠的方式,那么自然而然可以將es的副本數(shù)量調(diào)整為0。因此杭研云計(jì)算存儲(chǔ)團(tuán)隊(duì)研發(fā)的一款基于S3后端的存儲(chǔ)文件系統(tǒng)CurveFS,自然而然進(jìn)入了冷數(shù)據(jù)選型的視野。從技術(shù)上講內(nèi)部S3存儲(chǔ)基于EC糾刪碼的實(shí)現(xiàn),通過降低ES的副本數(shù)量為0,可以明顯的降低對(duì)存儲(chǔ)空間的使用需求。
后續(xù)規(guī)劃
與 Curve 社區(qū)小伙伴溝通后,社區(qū)在 CurveFS 在存算分離方向的后續(xù)規(guī)劃為:
- Curve文件存儲(chǔ)后端完全支持Curve塊存儲(chǔ),滿足一些場(chǎng)景下對(duì)性能的需求。預(yù)計(jì)2023 Q1發(fā)布。
- Curve文件存儲(chǔ)支持生命周期管理,支持用戶自定義數(shù)據(jù)冷熱,數(shù)據(jù)按需存儲(chǔ)在不同集群中。預(yù)計(jì)2023 Q2發(fā)布。
- Curve完全支持云原生部署。當(dāng)前客戶端已經(jīng)支持CSI,集群的部署支持預(yù)計(jì)2023 Q2發(fā)布。