1、線上問(wèn)題線上問(wèn)題描述:  原來(lái)是聊天形式,比較冗長(zhǎng),精簡(jiǎn)后的問(wèn)題描述如下:- 癥狀:新增節(jié)點(diǎn)后,shard 沒(méi)有分配到新節(jié)點(diǎn)上。如下圖所示:

2、問(wèn)題排查我的大致排解思路: 如下第一、第二、第三......代表排查問(wèn)題的推進(jìn)步驟。 2.1 第一:確定節(jié)點(diǎn)角色劃分,核實(shí)未被分配的節(jié)點(diǎn)類型。僅主節(jié)點(diǎn)是不參與分片數(shù)據(jù)落地存儲(chǔ)的,這是認(rèn)知大前提。經(jīng)對(duì)方核實(shí),未分配的節(jié)點(diǎn)的確是數(shù)據(jù)節(jié)點(diǎn)。集群有3個(gè)候選主節(jié)點(diǎn),3個(gè)數(shù)據(jù)節(jié)點(diǎn),其中1個(gè)數(shù)據(jù)節(jié)點(diǎn)為新添加的節(jié)點(diǎn)。
2.2 第二:關(guān)閉索引再打開(kāi)試試。close 再 open 之前驗(yàn)證過(guò)會(huì)走重新分配機(jī)制,部分場(chǎng)景適用。經(jīng)對(duì)方核查,沒(méi)有生效。2.3 第三:獨(dú)立創(chuàng)立一個(gè)新索引,設(shè)置3個(gè)副本。分片分配策略是:主、副本會(huì)分配到不同的節(jié)點(diǎn)上。多個(gè)副本,如果數(shù)據(jù)節(jié)點(diǎn)夠多,肯定會(huì)相對(duì)均勻的分片到多個(gè)節(jié)點(diǎn)。經(jīng)核查:仍然無(wú)法分配到新增的數(shù)據(jù)節(jié)點(diǎn)。不過(guò),此時(shí)看截圖,已有了未分配的灰色分片。
2.4 第四:查看分片未分配的原因。GET _cluster/allocation/explain 這時(shí)候,客戶反饋:“我設(shè)置了節(jié)點(diǎn)踢出集群的設(shè)置”。我的第一反應(yīng):“和這個(gè)有關(guān)系,為什么要設(shè)置?!”且 explain 執(zhí)行結(jié)果驗(yàn)證了剛才的推斷:“cannot allocate because allocation is not permitted to any of the nodes”。
2.5 第五:為什么設(shè)置?在哪里設(shè)置的?如何設(shè)置的?客戶反饋:“我看書上寫的只要有節(jié)點(diǎn)離開(kāi)集群就會(huì)觸發(fā) rebalance。所以就設(shè)置了這個(gè)參數(shù)?!?/span>經(jīng)反復(fù)確認(rèn),是集群層面的設(shè)置,非索引層面。起初認(rèn)為是索引層面的設(shè)置,我單獨(dú)驗(yàn)證后不對(duì),才想起來(lái)是集群層面的配置。PUT _cluster/settings { "transient" : { "cluster.routing.allocation.exclude._ip" : "10.0.0.1" } }
2.6 取消這個(gè)設(shè)置就會(huì)恢復(fù)新節(jié)點(diǎn)的分片分配。PUT _cluster/settings { "transient" : { "cluster.routing.allocation.exclude._ip" : "" } }

3、我的幾點(diǎn)觀察和思考3.1 關(guān)于 head 插件 和 Kibana dev tools 的選型head 插件在集群節(jié)點(diǎn)、分片可視化方面做得的確不錯(cuò)。如果在 1.X版本、2.X版本,由于當(dāng)時(shí) Kibana 功能還不盡完善,甚至還沒(méi)有被 Elastic 官方收購(gòu),選型 head 插件做問(wèn)題排查無(wú)可厚非。但是,5.X、6.X、7.X 后,Kibana 已經(jīng)有了突飛猛進(jìn)的發(fā)展,無(wú)論是 dev tools 的命令行提示功能,還是多維度的可視化監(jiān)控。head 插件做命令行的調(diào)試的確稍顯笨拙,就類似早期的C、C++編譯器 VC6.0一樣。而 Kibana dev tools 類似 VS2020+版本或者開(kāi)源的 Codeblocks,用過(guò)你會(huì)發(fā)現(xiàn)“如絲般順滑”般的效率提升。3.2 關(guān)于優(yōu)化參數(shù)配置我自己在管理集群、維護(hù)集群的階段,也是看到網(wǎng)上有好的優(yōu)化參數(shù)、新版本新特性參數(shù)都會(huì)在集群中試驗(yàn),對(duì)比看看有沒(méi)有功能提升或者性能改善。但,一定得了解參數(shù)的確切含義、函數(shù)的用途、加與不加對(duì)集群或分片等層面的影響;明確相關(guān)參數(shù)的應(yīng)用背景,貼合自己應(yīng)用場(chǎng)景的經(jīng)驗(yàn)證 ok 才可以使用。且,一定得先小范圍測(cè)試環(huán)境沒(méi)有問(wèn)題,甚至連續(xù)3天+沒(méi)有問(wèn)題后,才能有的放矢的應(yīng)用到生成環(huán)境。比如:線程池隊(duì)列的參數(shù)優(yōu)化,和 CPU 核數(shù)相關(guān),不見(jiàn)得是放之四海而皆準(zhǔn)的“萬(wàn)能參數(shù)”。3.3 關(guān)于設(shè)置,在哪個(gè)層面設(shè)置?從全局角度考慮,Elasticsearch 設(shè)置分為:集群層面設(shè)置、索引層面設(shè)置等。
- 在索引創(chuàng)建階段或者關(guān)閉索引階段設(shè)置。
- 通過(guò) update-index-settings 方式隨時(shí)更新設(shè)置。
需要設(shè)置前仔細(xì)核對(duì)各個(gè)參數(shù)的含義以及各個(gè)參數(shù)的設(shè)置方式。3.4 設(shè)置生效容易,使得設(shè)置失效一樣得會(huì)參數(shù)生效、參數(shù)失效是一對(duì)“好兄弟”,兩個(gè)都得靈活掌握。設(shè)置完參數(shù)、參數(shù)生效的同時(shí)要考慮:如何回退?如何恢復(fù)到?jīng)]有加參數(shù)的原始狀態(tài)。比如:前面設(shè)置的 "cluster.routing.allocation.exclude._ip" : "",不加具體的 IP 就是回退、不設(shè)置的含義。官方對(duì)于設(shè)置回退有沒(méi)有說(shuō)明呢?You can reset persistent or transient settings by assigning a null value.
也就是我們上面的命令行操作更嚴(yán)謹(jǐn)?shù)膶懛☉?yīng)該是: PUT _cluster/settings { "transient" : { "cluster.routing.allocation.exclude._ip" : null } }
如果有標(biāo)準(zhǔn)寫法,上面的這個(gè)才是最正宗、最標(biāo)準(zhǔn)的寫法。 4、小結(jié)事后觀察,只通過(guò)后面的第四、五、六步,就能定位問(wèn)題的根本原因。 但,畢竟不在現(xiàn)場(chǎng),多去了解問(wèn)題的來(lái)龍去脈,更有助于輔助解決問(wèn)題。 復(fù)盤總結(jié)一下,希望對(duì)大家也有所幫助。 參考- https://www./guide/en/elasticsearch/reference/7.14//cluster-update-settings.html
- https://www./guide/en/elasticsearch/reference/7.x/index-modules.html
推薦中國(guó)50%+Elastic認(rèn)證工程師出自于此!比同事搶先一步學(xué)習(xí)進(jìn)階干貨!
|