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'