ElasticSearch6.3.2 集羣作節點冷(warm) 熱(hot) 分離

拿一個小規模的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

主要是爲了防止集羣中已有的索引 rebalance 到 新添加的2臺warm節點上去,咱們只想手動把那些歷史索引 遷移到warm節點上。架構

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.cluster_concurrent_rebalance":0
  }
}

第二步:給節點加標識:node.attr.box_type

關於 node.attr.box_type 屬性介紹,可參考:enabling-awarenesselasticsearch

修改hot節點的elasticsearch.yml配置文件,添加一行:ide

node.attr.box_type: hot優化

修改warm節點的elasticsearch.yml配置文件,添加一行:ui

node.attr.box_type: warm3d

第三步:定義通用的索引模板保證新建立索引的分片不會分配到warm節點上

當每個月生成一個索引時,新建的索引,確定是熱索引,熱索引的分片須要分配到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.requireindex.routing.allocation.exclude可參考:shard-allocation-filteringhtm

第四步 把系統上已有索引的配置所有修改爲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節點上。

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

原文:http://www.javashuo.com/article/p-envwwcdm-bw.html

相關文章
相關標籤/搜索