1、線上問題線上問題描述: 
- 癥狀:新增節(jié)點后,shard 沒有分配到新節(jié)點上。如下圖所示:

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

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