作者介紹 李猛(ynuosoft),Elastic-stack產(chǎn)品深度用戶,ES認(rèn)證工程師,2012年接觸Elasticsearch,對(duì)Elastic-Stack開發(fā)、架構(gòu)、運(yùn)維等方面有深入體驗(yàn),實(shí)踐過多種Elasticsearch項(xiàng)目,最暴力的大數(shù)據(jù)分析應(yīng)用,最復(fù)雜的業(yè)務(wù)系統(tǒng)應(yīng)用;業(yè)余為企業(yè)提供Elastic-stack咨詢培訓(xùn)以及調(diào)優(yōu)實(shí)施。 Elastic自身設(shè)計(jì)了集群分片的負(fù)載平衡機(jī)制,當(dāng)有新數(shù)據(jù)節(jié)點(diǎn)加入集群或者離開集群,集群會(huì)自動(dòng)平衡分片的負(fù)載分布。 公司原有大數(shù)據(jù)平臺(tái)基于公有云構(gòu)建,由于種種原因,現(xiàn)在需要遷移到自建機(jī)房,Elasticsearch集群承擔(dān)了大數(shù)據(jù)平臺(tái)主要的對(duì)外查詢需求,也有部分實(shí)時(shí)計(jì)算需求基于Elasticsearch實(shí)現(xiàn),所以需要在不影響應(yīng)用系統(tǒng)體驗(yàn)的情況下做到平滑的遷移。本次分享講述我們?nèi)绾芜M(jìn)行平滑遷移以及如何避坑。 需要遷移的主要有兩部分:
圖示:公有云集群+自建機(jī)房集群示意圖,業(yè)務(wù)系統(tǒng)查詢圖 大數(shù)據(jù)平臺(tái)的Elastic集群直接對(duì)外提供實(shí)時(shí)查詢服務(wù),任何影響Elastic集群平穩(wěn)的操作都應(yīng)該避免,那我們的集群遷移策略也側(cè)重平穩(wěn),時(shí)間上可以寬松一些,遷移主要的工作有以下幾個(gè):
遷移過程中有很多步驟操作,是有嚴(yán)格先后順序的,如果出錯(cuò)則會(huì)造成集群動(dòng)蕩,影響應(yīng)用體驗(yàn)。此時(shí)Elastic的版本是6.5.X,當(dāng)時(shí)最新的版本,遷移完成之后也全部升級(jí)到6.8.X。 圖示:原有集群架構(gòu),數(shù)據(jù)節(jié)點(diǎn)與管理節(jié)點(diǎn)分離 1)Elasticsearch節(jié)點(diǎn)有很多角色(管理節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn),協(xié)調(diào)節(jié)點(diǎn)),默認(rèn)單節(jié)點(diǎn)常用角色全部開啟。所以在早期搭建Elastic集群時(shí),就按照角色分離的職責(zé)將管理節(jié)點(diǎn)與數(shù)據(jù)節(jié)點(diǎn)分離部署,這也是后面集群遷移能夠順利進(jìn)行的重要前提。多數(shù)初學(xué)者在剛剛接觸Elastic投入生產(chǎn)環(huán)境時(shí)會(huì)犯一個(gè)錯(cuò)誤,節(jié)點(diǎn)角色不分離,當(dāng)數(shù)據(jù)節(jié)點(diǎn)的資源消耗過度會(huì)導(dǎo)致集群管理節(jié)點(diǎn)響應(yīng)變慢,從而影響整體集群響應(yīng)。 #管理節(jié)點(diǎn)角色設(shè)置 node.master: true node.data: false #數(shù)據(jù)節(jié)點(diǎn)角色設(shè)置 node.master: false node.data: true 2)Elastic對(duì)外提供服務(wù)時(shí)中間會(huì)增加一層負(fù)載代理,如定制服務(wù)API與實(shí)時(shí)計(jì)算應(yīng)用訪問Elastic集群都需要走代理。 3)Hadoop集群與Elastic集群互相訪問是基于官方提供的ES-Hadoop驅(qū)動(dòng)包,由于實(shí)現(xiàn)原理的限制,不能做代理,所以是直接訪問,都是離線任務(wù)交互。 1)因?yàn)槭沁w移到新集群節(jié)點(diǎn),原有節(jié)點(diǎn)最后都需要關(guān)閉,新集群節(jié)點(diǎn)同樣也需要管理節(jié)點(diǎn)與數(shù)據(jù)節(jié)點(diǎn)分離,新舊節(jié)點(diǎn)需要平滑遷移,所以新舊節(jié)點(diǎn)在啟動(dòng)之后就需要在同一集群中,新節(jié)點(diǎn)Hosts同時(shí)指向新管理節(jié)點(diǎn)與舊管理節(jié)點(diǎn) ,關(guān)鍵設(shè)置如下: #配置管理節(jié)點(diǎn)IP+PORT discovery.zen.ping.unicast.hosts: ['多個(gè)舊管理節(jié)點(diǎn) IP:PORT','多個(gè)新管理節(jié)點(diǎn) IP:PORT'] 2)新集群服務(wù)器采用的全部是物理機(jī),CPU核數(shù)很多,內(nèi)存充足,掛載了多個(gè)硬盤,為了充分利用物理機(jī)性能,所以單服務(wù)器會(huì)部署多實(shí)例,主要是部署多個(gè)數(shù)據(jù)節(jié)點(diǎn)。在同一機(jī)器啟動(dòng)多個(gè)Elastic實(shí)例,需要做資源隔離,尤其是CPU核數(shù)隔離,CPU的核數(shù)決定了Elastic默認(rèn)線程池的線程數(shù),如果不做設(shè)置,默認(rèn)啟動(dòng)多個(gè)數(shù)據(jù)實(shí)例,會(huì)出現(xiàn)資源競爭問題,設(shè)置如下: #配置處理器數(shù)量 processors: 數(shù)值<=(CPU核數(shù)/實(shí)例數(shù)) 3)公有云與自建機(jī)房直接通過專線連接,新舊集群節(jié)點(diǎn)在啟動(dòng)之后依然是一個(gè)集群。 圖示:新舊集群示意圖與多實(shí)例示意圖 Elasticsearch集群有自動(dòng)的數(shù)據(jù)分片平衡分配機(jī)制,默認(rèn)是按照分片的數(shù)量平均分布,集群每個(gè)數(shù)據(jù)節(jié)點(diǎn)上的索引分片數(shù)量默認(rèn)是相同的,最多有奇偶不一致。 當(dāng)有新的帶有數(shù)據(jù)角色節(jié)點(diǎn)加入集群或者離開集群,集群會(huì)默認(rèn)啟動(dòng)自動(dòng)平衡機(jī)制,索引分片會(huì)在數(shù)據(jù)節(jié)點(diǎn)之間平衡漂移,達(dá)到平均分布之后停止,頻繁的集群節(jié)點(diǎn)加入或者下線會(huì)嚴(yán)重影響集群的IO,影響集群響應(yīng)速度,所以要盡量避免次情況發(fā)生。說到這里,在我的從業(yè)中,發(fā)現(xiàn)很多初級(jí)運(yùn)維人員在部署Elastic集群時(shí),會(huì)很喜歡設(shè)置系統(tǒng)級(jí)別Elastic實(shí)例進(jìn)程自動(dòng)啟動(dòng),這個(gè)其實(shí)是個(gè)很糟糕的機(jī)制,當(dāng)發(fā)現(xiàn)服務(wù)器Elastic實(shí)例關(guān)閉,不是馬上重啟,而是需要人工介入分析具體原因,如果頻繁關(guān)閉重啟,這樣很容易造成集群問題。 1)第一個(gè)是禁用集群自動(dòng)平衡,首先要禁止集群新創(chuàng)建索引,新索引之間分配到新的數(shù)據(jù)節(jié)點(diǎn),其次防止新的數(shù)據(jù)節(jié)點(diǎn)啟動(dòng)之后,集群分片開始平衡遷移,影響集群IO,設(shè)置如下: #禁用集群新創(chuàng)建索引分配 cluster.routing.allocation.enable: false #禁用集群自動(dòng)平衡 cluster.routing.rebalance.enable: false 2)第二個(gè)是限制已有索引數(shù)據(jù)的分布范圍,暫時(shí)只容許分布在舊的數(shù)據(jù)節(jié)點(diǎn)上,舊集群數(shù)據(jù)節(jié)點(diǎn)在早期部署時(shí)并未設(shè)置自定義標(biāo)簽,所以只能通過設(shè)置IP范圍限制,還有就是后面在遷移數(shù)據(jù)時(shí)需要按找索引維度逐步遷移,控制集群遷移的并行度。設(shè)置如下: #限制索引的分布范圍 'index.routing.allocation.include._ip': '多個(gè)舊集群IP' 在禁用舊集群的數(shù)據(jù)自動(dòng)平衡之后,啟動(dòng)新集群數(shù)據(jù)節(jié)點(diǎn),這一步是安全的,可以全部啟動(dòng),此時(shí)集群數(shù)據(jù)節(jié)點(diǎn)有很多,舊數(shù)據(jù)節(jié)點(diǎn)有數(shù)據(jù),新數(shù)據(jù)節(jié)點(diǎn)無數(shù)據(jù),新的數(shù)據(jù)節(jié)點(diǎn)無任何查詢與寫入。 由于新數(shù)據(jù)節(jié)點(diǎn)是全新搭建,可以提前設(shè)置節(jié)點(diǎn)自定義屬性,方便之后運(yùn)維設(shè)置。設(shè)置如下: #集群機(jī)架屬性 node.attr.rack: rack1 #集群數(shù)據(jù)中心 node.attr.zone: zone1 #實(shí)例節(jié)點(diǎn)硬盤 node.attr.disk: ssd1 #更多屬性...... node.attr.xxxx: yyy1 ... 圖示:僅優(yōu)先啟動(dòng)數(shù)據(jù)節(jié)點(diǎn) Elasticsearch集群主要有幾個(gè)使用方: 1)Hadoop平臺(tái)離線數(shù)據(jù)寫入ES,從ES抽取數(shù)據(jù)。Elastic提供了Hadoop直連訪問驅(qū)動(dòng)。如Hive是通過創(chuàng)建映射表與Elasticsearch索引關(guān)聯(lián)的,新的數(shù)據(jù)節(jié)點(diǎn)啟動(dòng)之后,原有所有Hive-Es映射表需要全部重新創(chuàng)建,更換其中的IP+PORT指向;由于Hive有很多與Elastic關(guān)聯(lián)的表,所以短時(shí)間內(nèi)沒有那么快替換完成,新舊數(shù)據(jù)節(jié)點(diǎn)需要共存一段時(shí)間,不能在數(shù)據(jù)遷移完成之后馬上關(guān)閉。 #Hive指定連接 es.nodes=多個(gè)數(shù)據(jù)節(jié)點(diǎn)IP+PORT 2)業(yè)務(wù)系統(tǒng)應(yīng)用實(shí)時(shí)查詢。這種切換比較簡單,Elastic集群對(duì)外提供了代理訪問,業(yè)務(wù)系統(tǒng)應(yīng)用訪問首先要調(diào)用大數(shù)據(jù)提供的API,這些定制化的API內(nèi)部也是通過代理訪問Elastic集群。 3)大數(shù)據(jù)中心應(yīng)用實(shí)時(shí)計(jì)算數(shù)據(jù)寫入。實(shí)時(shí)計(jì)算程序上游有kafka隊(duì)列,基于kafka自帶的offset機(jī)制,在新集群啟動(dòng)實(shí)時(shí)計(jì)算應(yīng)用,然后關(guān)閉舊集群實(shí)時(shí)計(jì)算應(yīng)用,就可以完成切換。 為什么要手動(dòng)遷移數(shù)據(jù) ?
遷移數(shù)據(jù)的原則如下:
遷移數(shù)據(jù)也是通過限制索引分布IP范圍,設(shè)置如下: #限制索引的分布范圍 'index.routing.allocation.include._ip': '多個(gè)新集群IP' 關(guān)閉舊集群數(shù)據(jù)節(jié)點(diǎn)是一個(gè)逐步的過程,一個(gè)一個(gè)關(guān)閉,在一段時(shí)間內(nèi)新舊集群數(shù)據(jù)節(jié)點(diǎn)需要共存,應(yīng)用訪問切換并沒有那么快進(jìn)行,且要支持隨時(shí)回滾操作。關(guān)閉舊集群據(jù)節(jié)點(diǎn)有2個(gè)前提條件,如下:
圖示:關(guān)閉舊集群數(shù)據(jù)節(jié)點(diǎn) 為什么要在最后啟動(dòng)新集群管理節(jié)點(diǎn)?并且同步關(guān)閉舊集群管理節(jié)點(diǎn)?
切換新舊管理節(jié)點(diǎn)的策略如下:
圖示:啟動(dòng)新集群管理節(jié)點(diǎn) 在集群遷移之前,已經(jīng)禁用了集群的自動(dòng)平衡機(jī)制,集群遷移結(jié)束之后,需要恢復(fù)這種機(jī)制。 #禁用集群新創(chuàng)建索引分配 cluster.routing.allocation.enable: true #禁用集群自動(dòng)平衡 cluster.routing.rebalance.enable: true 在我們能如此平滑的完成Elasticsearch從公有云遷移到自有機(jī)房,得益于與共用集群這個(gè)概念。
Elasticsearch支持多種節(jié)點(diǎn)角色,一個(gè)節(jié)點(diǎn)可以支持多個(gè)角色,也可以支持一種角色。 圖示:集群節(jié)點(diǎn)角色 節(jié)點(diǎn)角色說明:
Elasticsearch集群中有多個(gè)節(jié)點(diǎn),其中任一節(jié)點(diǎn)都可以查詢數(shù)據(jù)或者寫入數(shù)據(jù),集群內(nèi)部節(jié)點(diǎn)會(huì)有路由機(jī)制協(xié)調(diào),轉(zhuǎn)發(fā)請(qǐng)求到索引分片所在的節(jié)點(diǎn)。我們?cè)谶w移集群時(shí)采用應(yīng)用代理切換,外部訪問從舊集群數(shù)據(jù)節(jié)點(diǎn)切換到新集群數(shù)據(jù)節(jié)點(diǎn),就是基于此特點(diǎn)。 圖示:集群路由示意圖,查詢過程/更新過程 分片與副本是Elasticsearch集群實(shí)現(xiàn)分布式最重要前提。
#副本設(shè)置 index.number_of_replicas: 數(shù)值,默認(rèn)1 #分片遷移API POST /_cluster/reroute { 'commands' : [ { 'move' : { 'index' : 'test_index', 'shard' : 0, 'from_node' : 'node1', 'to_node' : 'node2' } } ]} Elasticsearch本身提供了多種索引分片分布過濾操作,特別是在集群規(guī)模比較大時(shí),需要按照業(yè)務(wù)領(lǐng)域隔離集群資源。如有的業(yè)務(wù)索引是歷史數(shù)據(jù),數(shù)據(jù)量很大,僅偶爾低頻率查詢,可以做一些冷熱分離設(shè)置。 # 分布過濾設(shè)置 index.routing.allocation.include.{attribute} index.routing.allocation.require.{attribute} index.routing.allocation.exclude.{attribute}
在跨越速運(yùn)大數(shù)據(jù)部門任職時(shí),基于公司實(shí)際需求,得出的一些經(jīng)驗(yàn)與思考,提供后來者借鑒參考。 想輕松完成遷移,不妨來Gdevops全球敏捷運(yùn)維峰會(huì)北京站了解更多的業(yè)內(nèi)流行架構(gòu)吧:
9月11日,讓我們一起用更多元的視角觀察問題本質(zhì),尋找架構(gòu)發(fā)展的軌跡和趨勢(shì)。 |
|