ElasticSearch6.3.2 集群做節點冷(warm) 熱(hot) 分離


拿一個小規模的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.requireindex.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(將原來的 hot 屬性置為null)。(box_type就是用來標識節點屬性的)

PUT  loginmac-201905/_settings
{
  "index": {
    "routing": {
      "allocation": {
        "require": {
          "box_type": "warm"
        },
        "exclude":{
          "box_type": null
        }
      }
    }
  }
}

第七步 執行reroute命令,將 box_type為warm的索引遷移到 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進程。

做完冷熱分離后,還可以再做一些其他的優化:

  1. 段合並

    查看索引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

  2. 關閉索引

    POST /loginmac-201905/_close

原文:https://www.cnblogs.com/hapjin/p/11314492.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM