簡介
在我們的實際部署中,我們的各個 node(節點)的能力是不一樣的。比如有的節點的計算能力比較強,而且配有高性能的存儲,速度也比較快,同時我們可能有一些 node 的能力稍微差一點,比如計算能力及存儲器的速度都比較差一點。針對這兩種情況,我們其實可以把這兩種節點用來做不同的用途:運算能力較強的節點可以用來做 indexing(建立索引表格)的工作,而那些能力較差一點的節點,我們可以用來做搜尋用途。我們可以把這兩種節點分别叫做:
• hot node:用于支援索引并寫入新文檔
• warm node:用于處理不太頻繁查詢的隻讀索引
這種架構在 Elasticsearch 中,我們稱之為 hot/warm 架構。
Hot node
我們可以使用 hot node 來做 indexing:
• indexing 是 CPU 和 IO 的密集操作,是以熱節點應該是功能強大的伺服器
• 比 warm node 更快的存儲
Warm node
對較舊的隻讀索引使用熱節點:
• 傾向于利用大型附加磁盤(通常是旋轉磁盤)
• 大量資料可能需要其他節點才能滿足性能要求
Shard filtering
Shard filtering 在 Elasticsearch 中,我們可以利用這個能力來把我們想要的 index 放入到我們想要的 node 裡。我們可以使用在 elasticsearch.yml 配置檔案中的:
node.attr 來指定我們 node 屬性:hot 或是 warm。
在 index 的 settings 裡通過 index.routing.allocation 來指定索引(index)到一個滿足要求的 node
為節點配置設定索引有三種規則:

就像上面的表格說明的一樣:include 指的是至少包含其中的一個值;exclude 指的是不包含任何值;require 指的是必須包含裡面索引的值。這些值實際上我們用來辨別 node 的 tag。針對自己的配置這些 tag 可以由廠商自己辨別。
辨別 node
在上面的圖中,我們辨別 my_temp 屬性為 hot 或是 warm,表明我們的 cluster 中分為兩類:hot 或是 warm。在這裡特别指出:這裡的 my_temp,hot 及 warm 都是我們任意取的可以讓我們記住的屬性及名稱。隻要在使用時和 index.routing.allocation.include index.routing.allocation.exclude 及 index.routing.allocation.require 中的值相對應即可。
配置 index 的 settings
我們可以通過配置在 Index 中的 settings 來配置設定我們的index 到相應的具有哪些屬性的 node 裡,比如:
PUT logs-2019-03
{
"settings": {
"index.routing.allocation.require.my_temp": "hot"
}
}
在上面我們通過 logs-2019-03 的這個 index 的 settings 來控制這個 index 必須配置設定到具有 hot 屬性的 node裡。
假如我們上面的 index logs-2019-03 由于一些原因不再是目前的用來做 indexing 的 index,比如我們可以通過rollover API 接口來自動滾動我們的 index 名字。我們可以通過如下的指令把該 index 移動到 warm node 裡:
PUT logs-2019-03
{
"settings": {
"index.routing.allocation.require.my_temp": "warm"
}
}
這樣 Elasticsearch 會自動幫我們把 logs-2019-03 索引移動到 warm node 中,以便直供搜尋之用。
例子
首先,我們我們按照如下的方式來做一個實驗,雖然不能應用于實際的生産環境中:
1、按照“
如何在 Linux,MacOS 及 Windows 上進行安裝 Elasticsearch”安裝好自己的 Elasticsearh,但是不要運作 Elasticsearch
2、按照“
如何在 Linux 及 MacOS 上安裝 Elastic 棧中的 Kibana”安裝好自己的 Kibana
3、或者免安裝,一鍵配置
“阿裡雲 Elasticsearch”,并直接進入
Kibana在我們完成上面的兩個安裝後,我們分别打開兩個 terminal,然後分别在兩個 terminal 中運作如下的指令:
./bin/elasticsearch -E node.name=node1 -E node.attr.data=hot -Enode.max_local_storage_nodes=2
上面的指令運作一個名字叫做 node1 的,data 屬性為 hot 的 node。
./bin/elasticsearch -E node.name=node2 -E node.attr.data=warm -Enode.max_local_storage_nodes=2
上面的指令運作一個名字叫做 node2 的,data 屬性為 hot 的 warm。
我們可以在 Kibana 裡檢視我們的 nodes:
我們可以看出來有兩個 node 正在運作:node1 及 node2。如果我們想了解這兩個 node 的更多屬性,我們可以打入如下的指令:
GET _cat/nodeattrs?v&s=name
顯示的結果為:
我們可以看到 node 被辨別為 hot node,而 node2 被辨別為 warm node。
接下來,我們運用我們上面指令來把我們的 logs-2019-03 置于我們的 hot node 裡。我們可以通過如下的指令:
PUT logs-2019-03
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.routing.allocation.require.data": "hot"
}
}
運作上面的結果後,可以通過如下的指令來檢視:
GET _cat/shards/logs-*?v&h=index,shard,prirep,state,node&s=index,shard,prirep
從上面我們可以看出來我們的 logs-2019-03 是配置設定到 node1 上面的。
假如我們由于某種原因,想把 logs-2019-03 配置設定到 node2 上面,那麼該怎麼做呢?我們可以通過如下的指令來實作:
PUT logs-2019-03/_settings
{
"index.routing.allocation.require.data": "warm"
}
運作上面的指令顯示的結果是:
顯然我們 logs-2019-03 已經成功地移到 node2 了。
針對硬體的 shard filtering
上面我們說了,對于 node.attr 來說,我們可以添加任意的屬性。在上面的我們已經使用 hot / warm 來辨別我們的 my_temp 屬性。其實我們也可以同時定義一些能辨別硬體的屬性 my_server,這個屬性值可以為 small,medium及 large。有多個屬性組成的叢集就像是如下的結構:
那麼這樣的叢集裡的每個 node 可能具有不同的屬性。我們可以通過如下的方法來配置設定 index 到同時具有兩個或以上屬性的 node 裡:
PUT my_index1
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1,
"index.routing.allocation.include.my_server": "medium",
"index.routing.allocation.require.my_temp": "hot"
}
}
如上所示,我們把我們的 my_index1 配置設定到這麼一個 node:這個 node 必須具有 hot 屬性,同時也具有 medium 的屬性。針對我們上面顯示的圖檔,隻有 node1 滿足我們的要求。
總結
在今天的這篇文章中,我們介紹了如何使用 shard filtering 來控制我們的 index 的配置設定。在實際的操作中,可能大家會覺得麻煩一點,因為這個需要我們自己來管理這個。這個技術可以和我之前的文章“ Elasticsearch: rollover API ”一起配合使用。Elasticsearch 實際已經幫我做好了。在接下來的文章裡,我會來介紹如何使用 Index life cycle policy 來自動管理我們的 Index。
聲明:本文由原文作者“ Elastic 中國社群布道師——劉曉國”授權轉載,對未經許可擅自使用者,保留追究其法律責任的權利。
出處連結:
https://elasticstack.blog.csdn.net/.
【
阿裡雲Elastic Stack】100%相容開源ES,獨有9大能力,提供免費 X-pack服務(單節點價值$6000)
相關活動
更多折扣活動,請
通路阿裡雲 Elasticsearch 官網 阿裡雲 Elasticsearch 商業通用版,1核2G ,SSD 20G首月免費 阿裡雲 Logstash 2核4G首月免費