1. 程式人生 > >記一次ES節點擴容、資料遷移實踐

記一次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節點:

image.png | left | 747x118

檢視叢集中的所有索引,暫時關閉一批歷史不需要搜尋使用的索引
   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

節點狀態:

image.png | left | 747x190

檢視個節點tag:

image.png | left | 525x138

重啟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":""}'