在之前的文章中,我們介紹瞭如何使用索引生命週期策略來管理索引。如果要求索引根據其生命週期階段自動在不同的節點之間遷移,還需要用到冷熱架構。我們來看看具體如何實現。
冷熱架構
冷熱架構其實就是在 Easyearch 集羣中定義不同屬性的節點,這些節點共同組成冷熱架構。比如給所有熱節點一個 hot 屬性,給所有冷節點一個 cold 屬性。在 Easyearch 中分配節點屬性是通過配置文件(easysearch.yml)來實現的,比如我要定義一個熱節點和一個冷節點,我可以在對應節點的配置文件中添加如下行:
# 熱節點添加下面的行
node.attr.temp: hot
# 冷節點添加下面的行
node.attr.temp: cold
有了這些屬性,我們就可以指定索引分片在分配時,是落在 hot 節點還是 cold 節點。
查看節點屬性
測試環境是個 2 節點的 Easysearch 集羣。

比如我創建新索引 test-index,希望它被分配到 hot 節點上。
PUT test-index
{
"settings": {
"number_of_replicas": 0,
"index.routing.allocation.require.temp": "hot"
}
}

可以看到 test-index 索引的分片分配到 hot 節點 node-1 上。我們修改索引分配節點的屬性,讓其移動到 cold 節點 node-2 上。
PUT test-index/_settings
{
"settings": {
"index.routing.allocation.require.temp": "cold"
}
}

生命週期與冷熱架構
在上面的例子中,我們通過索引分配節點屬性對索引“坐落”的節點進行了控制。在索引生命週期策略中也支持對該屬性進行修改,實現索引根據生命週期階段自動在不同的節點之間移動的目的。
比如我們定義一個簡單的索引策略:
- 索引創建後進入 hot 階段,此階段的索引被分配到 hot 節點
- 創建索引 3 分鐘後,索引進入 cold 階段,此階段索引分片移動到 cold 節點
創建策略
PUT _ilm/policy/ilm_test
{
"policy": {
"phases": {
"hot": {
"min_age": "0m",
},
"cold": {
"min_age": "3m",
"actions": {
"allocate" : {
"require" : {
"temp": "cold"
}
}
}
}
}
}
}
生命週期策略後台是定期觸發的任務,為了更快的觀測到效果,可以修改任務觸發週期為每分鐘 1 次。
PUT _cluster/settings
{
"transient": {
"index_lifecycle_management.job_interval":"1"
}
}
創建索引模板
創建完索引生命週期策略,還需要索引模板把索引和生命週期策略關聯起來。我們創建一個模板把所有 ilm_test 開頭的索引與 ilm_test 生命週期策略關聯,為了便於觀察,指定索引沒有副本分片。
PUT _template/ilm_test
{
"order" : 100000,
"index_patterns" : [
"ilm_test*"
],
"settings" : {
"index" : {
"lifecycle" : {
"name" : "ilm_test"
},
"number_of_replicas" : "0",
"routing.allocation.require.temp": "hot"
}
}
}
創建索引
創建一個 ilm_test 開頭的索引,應用上一步創建的索引模板。
POST ilm_test_1/_doc
{
"test":"test"
}
查看索引分片分配情況。

目前索引存儲在 node-1 節點,按計劃 3 分鐘後將會移動到 node-2 上。


至此我們已通過索引生命週期策略實現了索引分片的移動,其實支持的操作還有很多,比如: rollover、close、snapshot 等,詳情請參閲官方文檔。
關於 Easysearch

INFINI Easysearch 是一個分佈式的搜索型數據庫,實現非結構化數據檢索、全文檢索、向量檢索、地理位置信息查詢、組合索引查詢、多語種支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同時添加和完善多項企業級功能。Easysearch 助您擁有簡潔、高效、易用的搜索體驗。
官網文檔:https://docs.infinilabs.com/easysearch