拿一個小規模的5節點ES集群做冷熱分離嘗試,它上面已經有60多個索引,有些索引按月、每月生成一個索引,隨著數據的不斷寫入,歷史數據(只需保留三個月數據,三個月之前的數據視為歷史數據)越來越占磁碟空間和記憶體資源,影響搜索響應時間。因此想把集群中節點分成2種類型,一種是hot節點,配置大記憶體和SSD,用 ...
拿一個小規模的5節點ES集群做冷熱分離嘗試,它上面已經有60多個索引,有些索引按月、每月生成一個索引,隨著數據的不斷寫入,歷史數據(只需保留三個月數據,三個月之前的數據視為歷史數據)越來越占磁碟空間和記憶體資源,影響搜索響應時間。因此想把集群中節點分成2種類型,一種是hot節點,配置大記憶體和SSD,用來扛平常的用戶請求;一種是warm節點,機械硬碟小記憶體,用來存儲歷史不常用的數據,和偶爾的後臺任務查詢。
把現有的5台節點全做hot節點,另外新增2台節點做warm節點。參考官方bloghot-warm-architecture-in-elasticsearch-5-x架構實現。需要註意的地方主要是:不要讓已有的索引分片被ES自動Rebalance到warm節點上去了,並且新創建的索引,只應該分配在hot節點上。下麵來看具體的實現步驟:
第一步:禁用 rebalance
主要是為了防止集群中已有的索引 rebalance 到 新添加的2台warm節點上去,我們只想手動把那些歷史索引 遷移到warm節點上。
PUT _cluster/settings
{
"transient": {
"cluster.routing.allocation.cluster_concurrent_rebalance":0
}
}
第二步:給節點加標識:node.attr.box_type
關於 node.attr.box_type 屬性介紹,可參考:enabling-awareness
修改hot節點的elasticsearch.yml配置文件,添加一行:
node.attr.box_type: hot
修改warm節點的elasticsearch.yml配置文件,添加一行:
node.attr.box_type: warm
第三步:定義通用的索引模板保證新創建索引的分片不會分配到warm節點上
當每月生成一個索引時,新建的索引,肯定是熱索引,熱索引的分片需要分配到hot節點上,不能分配到warm節點上。比如,loginmac-201908是新建的索引,其分配應該在hot節點上,假設只保留三個月的數據,那麼 loginmac-201905就屬於歷史數據了,需要遷移到warm節點上去。
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-filtering
第四步 把系統上已有索引的配置全部修改成hot配置
PUT _all/_settings
{
"index": {
"routing": {
"allocation": {
"require": {
"box_type": "hot"
}
}
}
}
}
這是為了,保證當warm節點加入集群時,不要讓熱索引遷移到到warm節點上。
第五步 重啟所有的修改了elasticsearch.yml 配置為 hot 的節點。等待所有的索引初始化完畢
第六步 啟動將 elasticsearch.yml 配置為 warm 的節點,並把歷史索引數據配置信息修改成 warm
比如 將loginmac-201905索引的配置 改成 box_type 屬性改成 warm。(box_type就是用來標識節點屬性的)
PUT loginmac-201905/_settings
{
"index": {
"routing": {
"allocation": {
"require": {
"box_type": "warm"
}
}
}
}
}
第七步 執行reroute命令,將 box_type為warm的索引遷移到 warm節點上。
其中,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
重啟node-02(在Ubuntu16上,先用 su user_00 切換到user_00用戶,然後再執行 ./bin/elasticsearch -d 啟動ES進程,我用 sudo -u user_00 ./bin/elasticsearch -d 啟動ES時老是報 memory not lock 錯誤)
再查看節點信息,可看到節點帶有 box_type 為 hot 的屬性了。
"attributes": {
"box_type": "hot",
"xpack.installed": "true"
}
所以,在修改了elasticsearch.yml配置文件並重啟節點後,最好先GET /_nodes/node-02
看一下配置是否生效,否則可能造成大量分片reroute,浪費資源。
做完冷熱分離後,還可以再做一些其他的優化:
段合併
查看索引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
原文:https://www.cnblogs.com/hapjin/p/11314492.html