Elasticsearch 是一個極其強大的搜尋和分析引擎,其強大的部分在於能夠對其進行擴充套件以獲得更好的效能和穩定性。
本教程將提供有關如何設定 Elasticsearch 叢集的一些資訊,並將新增一些操作技巧和最佳實踐來幫助您入門。但應該強調的是,每個 Elasticsearch 設定可能會因多種因素而異,包括伺服器上的工作負載、索引資料量、硬體規格,甚至操作員的經驗。
什麼是 Elasticsearch 叢集?
顧名思義,Elasticsearch 叢集是一組連線在一起的一個或多個 Elasticsearch 節點例項。Elasticsearch 叢集的強大之處在於在叢集中的所有節點之間分配任務、搜尋和索引。
Elasticsearch 叢集中的節點可以分配不同的工作或職責:
- Data nodes — 儲存資料並執行與資料相關的操作,例如搜尋和聚合
- Master nodes — 負責叢集範圍的管理和配置操作,例如新增和刪除節點
- Client nodes — 將叢集請求轉發給主節點,將資料相關的請求轉發給資料節點
- Ingest nodes — 用於在索引之前預處理文件
預設情況下,每個節點都會自動分配一個唯一識別符號或名稱,用於管理目的,並且在多節點或叢集環境中變得更加重要。
安裝後,單個 Elasticsearch 節點將形成一個名為“elasticsearch”的新單節點叢集,但正如我們將在本文後面看到的,它也可以配置為使用叢集名稱加入現有叢集。不用說,這些節點需要能夠相互識別才能連線。
安裝 Elasticsearch 叢集
下面我將向您展示如何手動設定由一個主節點和兩個資料節點組成的叢集。
安裝java
Elasticsearch 基於 Java 構建,至少需要 Java 8(1.8.0_131 或更高版本)才能執行。因此,我們的第一步是在叢集中的所有節點上安裝 Java 8。請注意,叢集中的所有 Elasticsearch 節點都應安裝相同的版本。
安裝 Elasticsearch 節點
首先,從官網下載Elasticsearch程式包,並解壓為三份
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.14.0-windows-x86_64.zip
本教程使用的Elasticsearch 版本問7.14.0
配置 Elasticsearch 叢集
我們的下一步是設定叢集,以便節點可以相互連線和通訊。
對於每個節點,開啟 Elasticsearch 配置檔案:
vim elasticsearch-7.14.0-2\config\elasticsearch.yml
這個檔案很長,包含不同部分的多個設定。瀏覽檔案,然後輸入以下配置:
節點1:
#叢集名稱
cluster.name: my-cluster
#節點名稱
node.name: "es-node-1"
#定義1為主節點
node.master: true
#定義節點2節點3為資料節點
node.data: true
#訪問的IP地址,0.0.0.0表示不限制
network.host: 0.0.0.0
#訪問埠號
http.port: 9200
#叢集通訊埠號
transport.tcp.port: 9300
#所有節點的ip地址
discovery.zen.ping.unicast.hosts: ["192.168.73.66:9300", "192.168.73.66:9301", "192.168.73.66:9302"]
節點2:
#叢集名稱
cluster.name: my-cluster
#節點名稱
node.name: "es-node-2"
#定義1為主節點
node.master: false
#定義節點2節點3為資料節點
node.data: true
#訪問的IP地址,0.0.0.0表示不限制
network.host: 0.0.0.0
#訪問埠號
http.port: 9201
#叢集通訊埠號
transport.tcp.port: 9301
#所有節點的ip地址
discovery.zen.ping.unicast.hosts: ["192.168.73.66:9300", "192.168.73.66:9301", "192.168.73.66:9302"]
節點3:
#叢集名稱
cluster.name: my-cluster
#節點名稱
node.name: "es-node-3"
#定義1為主節點
node.master: false
#定義節點2節點3為資料節點
node.data: true
#訪問的IP地址,0.0.0.0表示不限制
network.host: 0.0.0.0
#訪問埠號
http.port: 9202
#叢集通訊埠號
transport.tcp.port: 9302
#所有節點的ip地址
discovery.zen.ping.unicast.hosts: ["192.168.73.66:9300", "192.168.73.66:9301", "192.168.73.66:9302"]
執行 Elasticsearch 叢集
您現在已準備好啟動 Elasticsearch 節點並驗證它們作為叢集相互通訊。
對於每個例項,執行以下命令:
#linux
elasticsearch-7.14.0-2\bin\elasticsearch
#windows
elasticsearch-7.14.0-2\bin\elasticsearch.bat
如果一切配置正確,您的 Elasticsearch 叢集應該已啟動並正在執行。要驗證一切是否按預期工作,請從任何叢集節點查詢 Elasticsearch:
curl -XGET 'http://localhost:9200/_cluster/state?pretty'
響應應詳細說明叢集及其節點:
{
"cluster_name": "my-cluster",
"cluster_uuid": "QU6x1C3iRk-gps6PgQsE5g",
"version": 478,
"state_uuid": "DZyMU0KKQlmUZ9h_WyM8aQ",
"master_node": "OjKnMr1tTZ2cJyA5BZm1fg",
"blocks": {},
"nodes": {
"__bdouL_Q7anCPj1-3Tmxw": {
"name": "es-node-2",
"ephemeral_id": "7GjSuyqBQya8yWdWvXGKjQ",
"transport_address": "192.168.73.66:9301",
"attributes": {},
"roles": [
"data",
"data_cold",
"data_content",
"data_frozen",
"data_hot",
"data_warm",
"ingest",
"ml",
"remote_cluster_client",
"transform"
]
},
"OjKnMr1tTZ2cJyA5BZm1fg": {
"name": "es-node-1",
"ephemeral_id": "OhJ0gZu6RBWsA2ZX6lmx5g",
"transport_address": "192.168.73.66:9300",
"attributes": {},
"roles": [
"data",
"data_cold",
"data_content",
"data_frozen",
"data_hot",
"data_warm",
"ingest",
"master",
"ml",
"remote_cluster_client",
"transform"
]
}
},
"metadata": {},
"routing_table": {},
"routing_nodes": {}
}
生產環境Elasticsearch 叢集配置
我們已經為叢集中的節點定義了不同的角色,但是對於在生產環境中執行的叢集還有一些額外的推薦設定。
避免“裂腦”
“裂腦”情況是叢集中節點之間的通訊由於網路故障或其中一個節點的內部故障而失敗。在這種情況下,可能會有多個節點認為自己是主節點,從而導致資料不一致的狀態。
為了避免這種情況,我們可以對 Elasticsearch 配置檔案中的discovery.zen.minimum_master_nodes指令進行更改,該指令確定需要通訊(投票)多少節點來選舉主節點。
確定此數量的最佳做法是使用以下公式來確定此數量:N/2 + 1。N 是叢集中符合條件的主節點的數量。然後將結果四捨五入到最接近的整數。
對於具有三個節點的叢集,則:
discovery.zen.minimum_master_nodes: 2
調整JVM堆大小
為了確保 Elasticsearch 有足夠的操作餘地,應該調整預設的 JVM 堆大小(最小/最大 1 GB)。
根據經驗,最大堆大小應設定為 RAM 的 50%,但不超過 32GB(由於 Java 指標在較大堆中效率低下)。Elastic 還建議最大和最小堆大小的值相同。
這些值可以使用jvm.options檔案中的 Xmx 和 Xms 設定進行配置。
vim elasticsearch-7.14.0-2\config\jvm.options
-Xms2g
-Xmx2g
禁用交換
換出未使用的記憶體是一種通用行為,但在 Elasticsearch 的上下文中可能會導致斷開連線、效能不佳以及一般情況下 — 不穩定的叢集。
為了避免交換,您可以禁用所有交換(如果 Elasticsearch 是伺服器上執行的唯一服務,則建議使用),或者您可以使用mlockall將 Elasticsearch 程式鎖定到 RAM。
為此,請開啟叢集中所有節點上的 Elasticsearch 配置檔案:
vim elasticsearch-7.14.0-2\config\elasticsearch.yml
新增以下內容:
bootstrap.mlockall: true
完成後重新啟動 Elasticsearch。
調整虛擬記憶體
為避免耗盡虛擬記憶體,請增加對 mmap 計數的限制:
sudo vim /etc/sysctl.conf
修改為以下配置
vm.max_map_count=262144
增加開啟的檔案描述符限制
另一個重要的配置是開啟檔案描述符的限制。由於 Elasticsearch 使用了大量的檔案描述符,您必須確保定義的限制足夠,否則最終可能會丟失資料。
此設定的常見建議是 65,536 或更高
vim /etc/security/limits.conf
設定限制:
- nofile 65536
Elasticsearch 叢集 API(參考)
Elasticsearch 支援大量特定於叢集的 API 操作,讓您可以管理和監控您的 Elasticsearch 叢集。大多數 API 允許您使用內部節點 ID、名稱或地址來定義要呼叫的 Elasticsearch 節點。
下面列出了一些您可以使用的更基本的 API 操作。
叢集健康
此 API 可用於檢視叢集的一般資訊並衡量其健康狀況:
curl -XGET 'localhost:9200/_cluster/health?pretty'
叢集狀態
可以使用此 API 檢視整個叢集的詳細狀態報告。您可以通過在呼叫 URL 中指定引數來過濾結果。
curl -XGET 'localhost:9200/_cluster/state?pretty'
叢集統計
對於監控整個叢集的效能指標非常有用:
curl -XGET 'localhost:9200/_cluster/stats?human&pretty'
節點統計
如果要檢查叢集中特定節點的指標,請使用此 API。您可以檢視所有節點、特定節點的資訊,或者要求僅檢視索引或作業系統/程式特定的統計資訊。
所有節點:
curl -XGET 'localhost:9200/_nodes/stats?pretty'
複製
特定節點:
curl -XGET 'localhost:9200/_nodes/node-1/stats?pretty'
複製
僅索引統計:
curl -XGET 'localhost:9200/_nodes/stats/indices?pretty'
複製
您可以獲得具有以下結構的任何單個節點的任何特定指標:
curl -XGET 'localhost:9200/_nodes/stats/ingest?pretty'
複製
或具有以下結構的多個節點:
curl -XGET 'localhost:9200/_nodes/stats/ingest,fs?pretty'
複製
或具有以下兩種格式之一的所有指標:
curl -XGET 'localhost:9200/_nodes/stats/_all?pretty'
curl -XGET 'localhost:9200/_nodes/stats?metric=_all?pretty'
節點資訊
如果要收集有關任何或所有叢集節點的資訊,請使用此 API。
檢索單個節點:
curl -XGET 'localhost:9200/_nodes/?pretty'
複製
或多個節點:
curl -XGET 'localhost:9200/_nodes/node1,node2?pretty'
複製
檢索有關外掛或攝取的資料:
curl -XGET 'localhost:9200/_nodes/plugins
複製
curl -XGET 'localhost:9200/_nodes/ingest
待處理的叢集任務
此 API 跟蹤叢集級別的更改,包括但不限於更新的對映、失敗的分片和索引建立。
以下 GET 應返回任務列表:
curl -XGET 'localhost:9200/_cluster/pending_tasks?pretty'
任務管理
與 Pending Cluster Tasks API 類似,Task Management API 將獲取有關各個節點上當前正在執行的任務的資料。
要獲取所有當前正在執行的任務的資訊,請輸入:
curl -XGET "localhost:9200/_tasks
要按特定節點獲取當前任務,以及其他與叢集相關的任務,請輸入節點名稱,然後將 &actions 附加到 GET:
curl -XGET 'localhost:9200/_tasks?nodes=node1,node2&actions=cluster:*&pretty'
通過輸入 _tasks/ 然後輸入任務的個人 ID 來檢索有關特定任務(或其子任務)的資訊:
curl -XGET '本地主機:9200/_tasks/43r315an3xamp13'
對於子任務:
curl -XGET 'localhost:9200/_tasks?parent_task_id=43r315an3xamp13'
該 API 還支援重新索引、搜尋、任務分組和任務取消。
遠端叢集資訊
獲取遠端叢集資訊:
curl -XGET 'localhost:9200/_remote/info?pretty'
投票配置排除
這將刪除符合 master 資格的節點。
通過以下方式刪除所有排除項:
curl -X DELETE 'localhost:9200/_cluster/voting_config_exclusions?pretty'
或者在排除列表中新增一個節點:
curl -X POST 'localhost:9200/_cluster/voting_config_exclusions/node1?pretty'