拿一個小規模的5節點ES集羣作冷熱分離嘗試,它上面已經有60多個索引,有些索引按月、每個月生成一個索引,隨着數據的不斷寫入,歷史數據(只需保留三個月數據,三個月以前的數據視爲歷史數據)愈來愈佔磁盤空間和內存資源,影響搜索響應時間。所以想把集羣中節點分紅2種類型,一種是hot節點,配置大內存和SSD,用來扛日常的用戶請求;一種是warm節點,機械硬盤小內存,用來存儲歷史不經常使用的數據,和偶爾的後臺任務查詢。html
把現有的5臺節點全作hot節點,另外新增2臺節點作warm節點。參考官方bloghot-warm-architecture-in-elasticsearch-5-x架構實現。須要注意的地方主要是:不要讓已有的索引分片被ES自動Rebalance到warm節點上去了,而且新建立的索引,只應該分配在hot節點上。下面來看具體的實現步驟:node
主要是爲了防止集羣中已有的索引 rebalance 到 新添加的2臺warm節點上去,咱們只想手動把那些歷史索引 遷移到warm節點上。架構
PUT _cluster/settings { "transient": { "cluster.routing.allocation.cluster_concurrent_rebalance":0 } }
關於 node.attr.box_type 屬性介紹,可參考:enabling-awarenesselasticsearch
修改hot節點的elasticsearch.yml配置文件,添加一行:ide
node.attr.box_type: hot優化
修改warm節點的elasticsearch.yml配置文件,添加一行:ui
node.attr.box_type: warm3d
當每個月生成一個索引時,新建的索引,確定是熱索引,熱索引的分片須要分配到hot節點上,不能分配到warm節點上。好比,loginmac-201908是新建的索引,其分配應該在hot節點上,假設只保留三個月的數據,那麼 loginmac-201905就屬於歷史數據了,須要遷移到warm節點上去。code
PUT /_template/hot_template { "template": "*", "order": 0, "version": 0, "settings": { "index": { "routing": { "allocation": { "require": { "box_type": "hot" }, "exclude":{ "box_type": "warm" } } }, "number_of_shards": 3, "number_of_replicas": 1, "refresh_interval": "50s" }, "index.unassigned.node_left.delayed_timeout": "3d" } }
關於index.routing.allocation.require
和index.routing.allocation.exclude
可參考:shard-allocation-filteringhtm
PUT _all/_settings { "index": { "routing": { "allocation": { "require": { "box_type": "hot" } } } } }
這是爲了,保證當warm節點加入集羣時,不要讓熱索引遷移到到warm節點上。
好比 將loginmac-201905索引的配置 改爲 box_type 屬性改爲 warm。(box_type就是用來標識節點屬性的)
PUT loginmac-201905/_settings { "index": { "routing": { "allocation": { "require": { "box_type": "warm" } } } } }
loginmac-201905 索引box_type設置成warm後,應該會自動 relocating 到 node.attr.box_type爲 warm 的標點上。若是沒有自動 relocating,那麼執行下面的 reroute 命令便可。另外,爲了提升 執行 reroute 的效率,能夠暫時將 refresh_interval 設置成 -1
其中,node-248是hot節點,node-12是warm節點。
POST /_cluster/reroute { "commands": [ { "move": { "index": "loginmac-201905", "shard": 2, "from_node": "node-248", "to_node": "node-12" } } ] }
最後,來一張集羣冷熱節點的示意圖:
調整後碰到的一些問題:
在修改 node-02 節點的ES 配置文件時:node.attr.box_type: hot
重啓後節點並未生效,致使這臺節點上的分片所有被遷移到其餘節點上去了。所以,修改了配置參數後,可用下面命令先檢查一下配置是否生效:
GET /_nodes/node-02
再查看節點信息,可看到節點帶有 box_type 爲 hot 的屬性了。
"attributes": { "box_type": "hot", "xpack.installed": "true" }
因此,在修改了elasticsearch.yml配置文件並重啓節點後,最好先GET /_nodes/node-02
看一下配置是否生效,不然可能形成大量分片reroute,浪費資源。
另外:還碰到一個重啓node-02節點時老是失敗的問題:Ubuntu16.04 使用命令:sudo -u user_00 ./bin/elasticsearch -d
一直提示memory not lock 錯誤(已按官網修改了文件描述符、內存限制等參數)。後來發現使用此種方式 user_00沒有足夠權限,先用 su user_00 切換到user_00用戶,而後再執行 ./bin/elasticsearch -d 啓動ES進程。
作完冷熱分離後,還能夠再作一些其餘的優化:
段合併
查看索引loginmac-201905各個段的狀況,並force merge
GET /_cat/segments/loginmac-201905?v&h=shard,segment,size,size.memory
POST /loginmac-201905/_forcemerge?max_num_segments=10&flush=true
關閉索引
POST /loginmac-201905/_close