記一次ES節點擴容、資料遷移實踐
記一次ES節點擴容、資料遷移實踐
背景
之前ES叢集裡的資料越來越大,日增500G日誌資料,需要做一波擴容。
節點資訊
目前叢集中的節點資訊如下:
節點 | CPU、MEM | DISK | 磁碟使用率 | 節點角色 |
---|---|---|---|---|
es01 | 16C 32G | 2*1T | 71% | mdi |
es02 | 16C 32G | 2*1T | 69% | mdi |
es03 | 16C 32G | 2*1T | 68% | mdi |
es04 | 16C 32G | 2*1T | 66% | mdi |
es05 | 16C 32G | 2*1T | 67% | mdi |
es06 | 16C 32G | 2*1T | 69% | mdi |
新增資料節點規格:
節點 | CPU、MEM | DISK | 角色 |
---|---|---|---|
es11 | 16C 32G | 3*2T | di |
es12 | 16C 32G | 3*2T | di |
es13 | 16C 32G | 3*2T | di |
es14 | 16C 32G | 3*2T | di |
es15 | 16C 32G | 3*2T | di |
es16 | 16C 32G | 3*2T | di |
新增master節點規格:
節點 | jvm heap記憶體配置 | 角色 |
---|---|---|
es010 | 2G | mi |
es011 | 2G | mi |
es012 | 2G | mi |
擴容思路
大致的擴容遷移思路如下:
1、將master從叢集中分離出來
2、重啟節點時給叢集中老節點標記一個tag:old
3、將所有索引設定只分配到帶有old標籤的節點
4、將不怎麼使用的索引close
5、將新增的data節點加入到叢集中,並設定新的tag:new
6、修改索引template,新建的索引設定新建到tag為new的節點上。
7、在業務低峰期分批將之前在old節點上的索引遷移到new節點上。
實踐步驟
1、分離master節點
檢視當前master節點:
檢視叢集中的所有索引,暫時關閉一批歷史不需要搜尋使用的索引
ps:主要是需要重啟節點,open的索引越少,叢集恢復的越快
curl -s localhost:9200/_cat/indices curl -XPOST localhost:9200/xxx_indices/_close ps:xxx_indices為需要關閉的索引名稱 過濾基於時間的索引: curl -s localhost:9200/_cat/indices?h=i | grep 2018.11.11 > /tmp/111 確認下索引: cat /tmp/111 批量關閉索引: for i in `cat /tmp/111`;do curl -XPOST localhost:9200/$i/_close;done
關閉叢集reroute:
curl -H "Content-Type: application/json" -XPUT http://localhost:9200/_cluster/settings -d ' {"transient":{"cluster.routing.allocation.enable":"none"}}'
分別修改叢集中node001~node006的配置檔案,滾動重啟:
1、修改配置檔案: 1)加入tag: node.attr.tag: old 2)增加data節點,去除master配置: node.master: false node.data: true 3)修改discovery.zen.ping.unicast.hosts 增加master ip到該配置中。 2、依次重啟node001~node004,每次重啟等叢集恢復到green狀態。 curl localhost:9200/_cat/health?v ps:此處先不要重啟當前叢集的master節點,並且留一個給master節點互備。 此時的叢集狀態如下: node001~node004已經增加了新的master節點資訊,且已經重啟 node005、node006還未增加,且未重啟 當前叢集的master是node006 3、修改node005的配置,此時暫時先不要將該節點的master、data角色分離(只修改1和3步驟的配置); 修改後重啟,等待叢集恢復green; 此時該叢集只有的master只可能在node005和node006,當前是在node006 4、修改node006的配置,然後重啟; 重啟後master將轉移到node005
配置好新的master節點es010、es011、es012
1、修改配置檔案 1)增加master、去除data配置: node.master: true node.data: false 2)修改discovery.zen.ping.unicast.hosts 在該配置中需要將所有節點IP都加進去,包括即將新增的ES節點的IP。 2、啟動這3個節點,等待加入叢集。 可以tailf檢視node005上的es日誌。 通過以下api也能看到節點加入。 curl localhost:9200/_cat/nodes
節點狀態:
檢視個節點tag:
重啟node005,將叢集master轉移到專屬節點。
1、修改配置檔案 1)增加data節點,去除master配置: node.master: false node.data: true 2、重啟node005,並等待叢集恢復green。 curl localhost:9200/_cat/health?v
至此,master節點已經從原有叢集中分離,並且叢集節點也都已做了標記tag。
2、修改索引的配置
確保當前叢集中的索引只分配到當前標記為old的資料節點,不會分配到新增的資料節點。
curl -H "Content-Type: application/json" -XPUT http://localhost:9200/_settings -d ' {"index.routing.allocation.require.tag":"old"}'
3、配置新資料節點
1、修改配置好配置: 1)加入tag: node.attr.tag: new 2)增加data節點,去除master配置: node.master: false node.data: true 3)修改discovery.zen.ping.unicast.hosts 在該配置中僅需寫master ip。 2、啟動節點,等待加入。 curl localhost:9200/_cat/nodes?v
4、開啟叢集分配,並分批將資料遷移
#開啟叢集分配 curl -H "Content-Type: application/json" -XPUT http://localhost:9200/_cluster/settings -d ' {"transient":{"cluster.routing.allocation.enable":"all"}}' #如果僅需遷移可以將require.tag改成new curl -H "Content-Type: application/json" -XPUT http://localhost:9200/xxx_indices/_settings -d ' {"index.routing.allocation.require.tag":"new"}' ps:可以寫個for迴圈簡單過濾出索引,然後在低峰期批量遷移。 #去除require,索引可以在叢集所有節點間自由分配: curl -H "Content-Type: application/json" -XPUT http://localhost:9200/xxx_indices/_settings -d ' {"index.routing.allocation.require.tag":""}'