1、問題拋出
1.1 新增節點問題
我的群集具有黃色運行狀況,因為它只有一個節點,因此副本保持未分配狀態,我想要添加一個節點,該怎么弄?
1.2 刪除節點問題
假設集群中有5個節點,我必須在運行時刪除2個節點。 那么如何在不影響指數的情況下完成?
我有接近10 Gb/hour的連續數據流,這些數據正在連續寫入並索引化。 重新平衡會對此有所影響嗎?
本文就從上面兩個問題說起,將相關知識點串起來,內容較長,閱讀時間5分鍾+。
2、知識點
2.1 Master節點的職責
主節點的主要作用之一是確定將哪些分片分配給哪些節點,以及何時在節點之間移動分片以重新平衡集群。
2.2 分片分配發生的時機
分片分配是將分片分配給節點的過程。 這可能發生在集群初始恢復,副本分配,重新平衡或添加或刪除節點期間。
2.3 控制分配/重新平衡分片操作的常見設置
2.3.1 分配分片設置
cluster.routing.allocation.enable
目的:啟用或禁用特定種類的分片的分配。
all - (默認值)允許為所有類型的分片分配分片。
primaries - 僅允許分配主分片的分片。
new_primaries -僅允許為新索引的主分片分配分片。
none - 任何索引都不允許任何類型的分配分片。
重新啟動節點時,此設置不會影響本地主分片的恢復。
假設重新啟動的節點的分配ID與群集狀態中的某個活動分配ID匹配,若該節點具有未分配的主分片的副本,則會立即恢復該主分片,
2.3.2 平衡分片設置
cluster.routing.rebalance.enable
目的:為特定類型的分片啟用或禁用重新平衡。
允許控制群集范圍內允許的並發分片重新平衡數。默認為2.請注意,此設置僅控制由於群集中的不平衡而導致的並發分片重定位數。此設置不會因分配過濾或強制感知而限制分片重定位。
2.3.3 權重因子設置
cluster.routing.allocation.balance.shard
目的:定義節點(float)上分配的分片總數的權重因子。默認為0.45f。提高這一點會增加均衡群集中所有節點的分片數量的趨勢。
cluster.routing.allocation.balance.index
目的:定義在特定節點(float)上分配的每個索引的分片數量的權重因子。默認為0.55f。提高這一點會增加在集群中所有節點上均衡每個索引的分片數的趨勢。
cluster.routing.allocation.balance.threshold
目的:應執行的操作的最小優化值(非負浮點數)。默認為1.0f。提高此選項將導致群集在優化分片平衡方面不那么積極。
2.4 基於磁盤的分片分配
在確定是將新分片分配給該節點還是主動從該節點拷貝分片到其他節點之前,Elasticsearch會考慮節點上的可用磁盤空間。
2.5 磁盤的三個默認警戒水位線
cluster.routing.allocation.disk.watermark.low
低警戒水位線——默認為磁盤容量的85%。
Elasticsearch不會將分片分配給使用磁盤超過85%的節點。它也可以設置為絕對字節值(如500mb),以防止Elasticsearch在小於指定的可用空間量時分配分片。此設置不會影響新創建的索引的主分片,或者特別是之前任何從未分配過的分片。
cluster.routing.allocation.disk.watermark.high
高警戒水位線——默認為磁盤容量的90%。
Elasticsearch將嘗試從磁盤使用率超過90%的節點重新分配分片。它也可以設置為絕對字節值,以便在節點小於指定的可用空間量時將其從節點重新分配。此設置會影響所有分片的分配,無論先前是否分配。
cluster.routing.allocation.disk.watermark.flood_stage
洪水警戒水位線——默認為磁盤容量的95%。
Elasticsearch對每個索引強制執行只讀索引塊(index.blocks.read_only_allow_delete)。這是防止節點耗盡磁盤空間的最后手段。一旦有足夠的可用磁盤空間允許索引操作繼續,就必須手動釋放索引塊。
cluster.info.update.interval
Elasticsearch應該多久檢查一次群集中每個節點的磁盤使用情況。 默認為30秒。
磁盤的分片分配綜合樣例配置如下:
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.disk.watermark.low": "100gb",
"cluster.routing.allocation.disk.watermark.high": "50gb",
"cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
"cluster.info.update.interval": "1m"
}
}
2.6 索引/節點層面的分片分配
可用的動態集群設置如下,其中{attribute}指的是任意節點屬性:
cluster.routing.allocation.include.{attribute}——至少包含
cluster.routing.allocation.require.{attribute}——全部包含
cluster.routing.allocation.exclude.{attribute}——非、排除操作
3、添加節點
添加注意事項:
ES必須版本號一致,舉例:Elasticsearch V6.4.1。
和新配置過Elasticsearch節點一致,以下僅介紹最快的方法。
步驟1:拷貝原有節點的ES相關文件到新機器。
步驟2:修改核心配置文件jvm.options和elasticsearch.yml。
注意1:jvm注意結合實際機器的內存進行合理化配置。取值:Min(32GB,機器內存一半)。
注意2:根據分配的角色(Master/data/client)配置。
注意3:集群名稱必須和預先的機器一致。
注意4:避免腦裂,合理化如下配置
curl -XPUT 'localhost:9200/_cluster/settings' -d'
{
"transient": {
"discovery.zen.minimum_master_nodes": 3
}
}
注意5:啟動報錯,根據出錯做相關修改。
步驟3:訪問9200端口驗證成功與否。
4、刪除節點
注意事項:
1、節點數目少的時候,一定要注意腦裂問題。
2、腦裂問題必要的時候需要更新:elasticsearch.yml 中的 minimum_master_nodes。
4.1 方案一——停啟集群分片自動分配
步驟1:暫停數據寫入程序
步驟2:關閉集群shard allocation
#關閉集群分片自動分配
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}
步驟3:手動執行POST /_flush/synced
#打開集群分片自動分配
POST /_flush/synced
步驟4:重啟結點
步驟5:重新開啟集群shard allocation
#打開集群分片自動分配
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}
步驟6:等待recovery完成,集群health status變成green
步驟7:重新開啟數據寫入程序
以上7步驟系參考Wood大叔總結。
4.2 方案二——排除停用節點
步驟1 排除停用節點
您可以通過告知群集將其從分配中排除來停用節點。
PUT _cluster/settings
{
"transient" : {
"cluster.routing.allocation.exclude._ip" : "10.0.0.1"
}
}
這將導致Elasticsearch將該節點上的分片分配給其余節點,而不會將群集狀態更改為黃色或紅色(即使您的副本數設置為0)。
重新分配所有分片后,您可以關閉節點並執行您需要執行的任何操作。 完成后,Elasticsearch將再剩余節點上再次重新平衡分片。
步驟2 檢查集群健康狀態
curl -XGET 'http://ES_SERVER:9200/_cluster/health?pretty'
如果沒有節點relocating,則排除節點已經被安全剔除,可以考慮關閉節點。
步驟3 判定數據是否還存在
查看節點上是否還有文檔存在。
curl -XGET 'http://ES_SERVER:9200/_nodes/NODE_NAME/stats/indices?pretty'
上述三步,能保證節點穩妥刪除。