記一次ES節點擴容、資料遷移實踐
阿新 • • 發佈:2018-11-22
記一次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":""}'