ITBear旗下自媒體矩陣:

云智慧透視寶如何控制Elasticsearch分片和副本分配

   時間:2015-09-25 16:16:03 來源:互聯(lián)網(wǎng)編輯:星輝 發(fā)表評論無障礙通道

分享人陳榮華(Lucky),網(wǎng)名采菊籬下,云智慧高級運維工程師,典型90后屌絲,技術(shù)觀風(fēng)者。2012年開始接觸Linux,并且從此踏上了Linux運維之路,有著三年的從三線到一線的運維經(jīng)驗?,F(xiàn)在比較關(guān)注Devops,云計算以及大數(shù)據(jù),在云智慧主要負(fù)責(zé)后端中間件和大數(shù)據(jù)的運維工作,個人博客www.devopsh.com,喜歡交朋友,希望可以結(jié)識更多Ops Companion。

云智慧是一家應(yīng)用性能管理服務(wù)商,在大數(shù)據(jù)方面采用了Hadoop及Elasticsearch作為最終的存儲系統(tǒng)。Elasticsearch是基于Lucene的搜索服務(wù)器,提供分布式多用戶能力的全文搜索引擎。Elasticsearch的開發(fā)語言是Java,并作為Apache許可條款下的開放源碼發(fā)布,是第二流行的企業(yè)搜索引擎,常用于需要進(jìn)行實時搜索的云計算平臺,具有穩(wěn)定,可靠,快速,安裝使用方便等特點。

下面就是Lucky關(guān)于如何控制Elasticsearch分片和副本分配的技術(shù)分享:

因為云智慧的兩款產(chǎn)品監(jiān)控寶和透視寶,在大數(shù)據(jù)分析用到了Elasticsearch,所以我根據(jù)實際工作,分享一下關(guān)于控制Elasticsearch(以下簡稱ES)分片和副本的分配的內(nèi)容。

ES集群中索引可能由多個分片構(gòu)成,并且每個分片可以擁有多個副本。通過將一個單獨的索引分為多個分片,我們可以處理不能在一個單一的服務(wù)器上面運行的大型索引,簡單的說就是索引的大小過大,導(dǎo)致效率問題。不能運行的原因可能是內(nèi)存也可能是存儲。

由于每個分片可以有多個副本,通過將副本分配到多個服務(wù)器,可以提高查詢的負(fù)載能力。為了進(jìn)行分片和副本的操作,ES需要確定將這些分片和副本放到集群節(jié)點的哪個位置,就是需要確定把每個分片和副本分配到哪臺服務(wù)器/節(jié)點上。

下面我們就來,具體看看怎么控制,怎么按照我們想要的結(jié)果分配!

一、顯式控制分配

生產(chǎn)情景如圖

我這里列舉了三個索引的名稱:man、woman、katoey。因為我們線上業(yè)務(wù),根據(jù)不同的code lang和業(yè)務(wù),分別設(shè)為 javatopic、pythontopic、phptopic、dotnettopi、angettopic等。這里man 和woman 就是我們常見公司應(yīng)用使用的語言環(huán)境,而 katoey就是使用環(huán)境比較少的語言環(huán)境,所以katoey索引大小也相對比較小。

下面我們看看這張圖:

下面就圍繞這張圖,給大家講解控制方法。需求,邏輯都有了,開始干活!

1、指定節(jié)點的參數(shù)

如上圖所示,我們將ES集群劃分為兩個"空間"。當(dāng)然你也可以叫做區(qū)域,隨便命名。

我們將左邊的三臺ES節(jié)點服務(wù)器放置到zone_one的空間上面,將右邊的三臺ES節(jié)點服務(wù)器放到zone_two的空間上。劃分了空間,我們就要對服務(wù)器修改相對配置,這個其實最好是在上線之前就配置規(guī)劃好!

為了做到我們需要的效果,我們需要將如下屬性配置到左邊三臺ES集群節(jié)點服務(wù)器的elasticsearch.yml配置文件中: node.zone: zone_one

將如下屬性配置到右邊的三臺ES集群節(jié)點服務(wù)器elasticsearch.yml配置文件中:node.zone: zone_two

在線修改配置,叫平滑修改配置,我們可以參考這篇文章:http://zhaoyanblog.com/archives/555.html

配置修改完成,使用curl -XGET "http://ESnode:9200/_cluster/health" 查看集群健康狀態(tài)為green即可!配置修改好,之后就是按照我們的需求控制了。具體操作如下:

第一條命令是創(chuàng)建man索引;第二條命令是發(fā)送到_settings REST端點,用來指定這個索引的其他配置信息。我們將index.routing.allocation.include.zone屬性設(shè)置為zone_one值,就是我們所希望的把man索引放置到node.zone屬性值為zone_one的ES集群節(jié)點服務(wù)器上。

同樣對woman索引我們做類似操作:

不同的是,這次指定woman索引放置在node.zone屬性值為zone_two的ES集群節(jié)點服務(wù)器上。最后我們需要將katoey索引放置到上面所有的ES集群節(jié)點上面,配置設(shè)置命令如下:

這是一種方法,已經(jīng)達(dá)到了我們的需求,男人、女人、人妖都被我們控制了!

2、分配時排除節(jié)點

下面我再給大家介紹第二種方法,跟我們上面操作為索引指定放置節(jié)點位置一樣,我們也可以在索引分配的時候排除某些節(jié)點。參照之前的例子,我們新建一個people索引,但是不希望people索引放置到zone_one的ES集群節(jié)點服務(wù)器上,我們可以運行如下命令操作:

請注意,在這里我們使用的是index.routing.allocation.exclude.zone屬性而不是index.routing.allocation.include.zone屬性。

使用IP地址進(jìn)行分配配置

除了在節(jié)點的配置中添加一些特殊的屬性參數(shù)外,我們還可以使用IP地址來指定你將分片和副本分配或者不分配到哪些節(jié)點上面。為了做到這點,我們應(yīng)該使用_ip屬性,把zone換成_ip就好了。例如我們希望lucky索引分配到IP地址為10.0.1.110和10.0.1.119的節(jié)點上,我們可以運行如下命令設(shè)置:

第二種方法和第一種方法的區(qū)別就是include和exclude的區(qū)別,還有就是IP地址分配的方法,可以達(dá)到動態(tài)預(yù)分配的效果,這下你就是土地的主人,當(dāng)家做主了!

后面,我會把針對使用IP地址進(jìn)行分配配置 的shell scripts和python scripts分享給大家!

二、集群范圍內(nèi)分配

上面已經(jīng)介紹了 顯式控制分配 方法,它是居于在索引下操作的settings設(shè)置。下面我介紹居于整個集群下的設(shè)置,集群范圍內(nèi)分配。

除了索引層面指定分配活著排除分配之外(上面我們所做的都是這兩種情況),我們還可以指定集群中所有索引的分配。例如,我們希望將所有的新索引分配到IP地址為10.0.1.112和10.0.1.114的節(jié)點上,我們可以運行如下命令設(shè)置:

當(dāng)然這個集群級別的分配參數(shù)在集群重啟后是會失效的,而寫到配置文件中就是永久的!

三、每個節(jié)點上分片和副本數(shù)量的控制

接下來我們分享節(jié)點級別的分片和副本數(shù)量控制。除了指定分片和副本的分配,我們還可以對一個索引指定每個節(jié)點上的最大分片數(shù)量。例如我們希望ops索引在每個節(jié)點上只有一個分片,我們可以運行如下命令:

這個屬性也可以直接配置到elasticsearch.ym配置文件中,或者使用上面命令在活動索引上更新。如果配置不當(dāng),導(dǎo)致主分片無法分配的話,集群就會處于red狀態(tài)。

四、手動移動分片和副本

最后跟大家說說手動移動分片和副本。

移動分片

假設(shè)我們有兩個節(jié)點:es_node_one和es_node_two,ElasticSearch在es_node_one節(jié)點上分配了ops索引的兩個分片,我們現(xiàn)在希望將第二個分片移動到es_node_two節(jié)點上,可以如下操作實現(xiàn):

我們通過move命令的index屬性指定移動哪個索引,通過shard屬性指定移動哪個分片,最終通過from_node屬性指定我們從哪個節(jié)點上移動分片,通過to_node屬性指定我們希望將分片移動到哪個節(jié)點。

2、取消分配

如果希望取消一個正在進(jìn)行的分配過程,我們通過運行cancel命令來指定我們希望取消分配的索引、節(jié)點以及分片,如下所示:

運行上面的命令將會取消es_node_one節(jié)上ops索引的第0個分片的分配。

3、分配分片

除了取消和移動分片和副本之外,我們還可以將一個未分配的分片分配到一個指定的節(jié)點上。假設(shè)ops索引上有一個編號為0的分片尚未分配,并且我們希望ElasticSearch將其分配到es_node_two上,可以運行如下命令操作:

一次HTTP請求包含多個命令 我們可以在一次HTTP請求中包含多個命令,例如:

好了,全部分享就到這結(jié)束了。

問:這個技術(shù)主要用于透視寶和監(jiān)控寶的什么功能上,大數(shù)據(jù)分析么?

答:透視寶現(xiàn)在除掉頁面詳情,大部分?jǐn)?shù)據(jù)存儲在ES中,Web端頁面的數(shù)據(jù)展示、搜索都是用ES實現(xiàn)的。監(jiān)控寶只有現(xiàn)在新上的Docker監(jiān)控中使用了ES

最后給大家講下ES 的誕生記,多年前有一個叫做Shay Banon的剛結(jié)婚不久的失業(yè)開發(fā)者,由于妻子要去倫敦學(xué)習(xí)廚師,他便跟著也去了。在他找工作的過程中,為了給妻子構(gòu)建一個食譜的搜索引擎,他開始構(gòu)建一個早期版本的Lucene。

因為直接基于Lucene工作會比較困難,所以Shay開始抽象Lucene代碼以便Java程序員可以在應(yīng)用中添加搜索功能,為此他發(fā)布了第一個開源項目,叫做“Compass”。

后來Shay找到一份工作,這份工作處在高性能和內(nèi)存數(shù)據(jù)網(wǎng)格的分布式環(huán)境中,因此高性能的、實時的、分布式的搜索引擎也是理所當(dāng)然需要的。然后他決定重寫Compass庫使其成為一個獨立的服務(wù),這個服務(wù)叫做Elasticsearch。

Elasticsearch的第一個公開版本出現(xiàn)在2010年2月,在那之后Elasticsearch成為Github上最受歡迎的項目之一,代碼貢獻(xiàn)者超過300人。一家主營Elasticsearch的公司就此成立,他們一邊提供商業(yè)支持一邊開發(fā)新功能,不過Elasticsearch將永遠(yuǎn)開源且對所有人可用。

Shay的妻子依舊等待著她的食譜搜索……

為了老婆,ES誕生了,所以,女生找過IT男,挺好的。

問:我有個問題,對于ES集群本身的性能監(jiān)控,怎么做?

答:從TSB架構(gòu)來看,我們可以入手的點:

1.前端查詢,查詢語句是否存在性能問題,是否可以優(yōu)化;

2.前端調(diào)度后端ES集群查詢數(shù)據(jù),調(diào)度的方法是否有問題;

3.后端ES集群本身配置設(shè)置問題;

4.ES集群對我們TSB整體架構(gòu)適應(yīng)性,在架構(gòu)級別是否可以更好的適應(yīng);

發(fā)揮ES真正的優(yōu)點和它的特性,考量整體業(yè)務(wù)架構(gòu)邏輯,這是我個人看法和所能看到的。

舉報 0 收藏 0 打賞 0評論 0
 
 
更多>同類資訊
全站最新
熱門內(nèi)容
網(wǎng)站首頁  |  關(guān)于我們  |  聯(lián)系方式  |  版權(quán)聲明  |  RSS訂閱  |  開放轉(zhuǎn)載  |  滾動資訊  |  爭議稿件處理  |  English Version