Elasticsearch 的安裝非常簡單,筆者在前文《單機部署 ELK》中已經介紹過了,本文主要介紹集群的配置,並解釋常見配置參數的含義。
要配置集群,最簡單的情況下,設置下面幾個參數就可以了:
cluster.name: es-cluster node.name: es-node-1 discovery.zen.ping.unicast.hosts: ["192.168.1.101","192.168.1.102"] discovery.zen.minimum_master_nodes: 1
本文的演示環境為 Ubuntu Server 18.04,Elasticsearch 的版本為 6.2.4。
配置文件
在 Ubuntu 中使用 deb 包安裝的 Elasticsearch 的默認安裝目錄為:
/usr/share/elasticsearch

但是 Elasticsearch 的配置文件確不在這里,配置文件的目錄為:
/etc/elasticsearch

注意,這個目錄及其所有內容的所有者都是 root,屬於 elasticsearch 用戶組。本文我們主要關注的配置文件為 /etc/elasticsearch/elasticsearch.yml。
配置集群的名稱
一個節點只有與集群中的所有其他節點擁有相同的 master.name 時才能加入集群。默認的集群名稱是 elasticsearch,最好是設置為合適的名字,否則可能和現有的集群同名。下面的配置把集群命名為 es-cluster:
cluster.name: es-cluster
注意:確保不要在不同的環境中重用相同的集群名稱,否則可能會導致節點加入錯誤的集群。
配置節點的名稱
如果不設置節點的名稱 node.name,默認情況下,Elasticsearch 將使用隨機生成的 UUID 的前七個字符作為節點的 ID,並且這個隨機的字符串會被持久化下來,即使重啟系統也不會丟失。但是為了提高系統的可讀性,我們最好是為每個節點設置一個合適的名字:
node.name: es-node-1
或者是干脆設置為主機的名稱:
node.name: ${HOSTNAME}
列出集群中的所有節點
Elasticsearch 自己實現了一個名稱為 "Zen Discovery" 的發現節點並從集群的節點間選取主節點的功能。在集群的配置中一定要配置兩個與 "Zen Discovery" 相關的配置項,其中的一個為 discovery.zen.ping.unicast.hosts。
在不進行任何網絡配置的情況下,Elasticsearch 將綁定到可用的環回地址,並掃描端口 9300 到 9305,以嘗試連接到同一服務器上運行的其他節點。這提供了一種無需進行任何配置的自動集群體驗。當需要在其他服務器上使用節點組成集群時,必須通過 discovery.zen.ping.unicast.hosts 提供集群中其他節點的列表:
discovery.zen.ping.unicast.hosts: ["192.168.1.101","192.168.1.102"]
除了 IP 地址,這里也可以使用主機名(hostname)。
配置最小 master 節點數
另一個必須要設置的 "Zen Discovery" 相關的配置項為 discovery.zen.minimum_master_nodes。它的默認值是1,該屬性定義的是為了組成一個集群,相互連接的候選主結點的最小數目,強烈推薦該屬性的設置使用多數原則:(master_eligible_nodes / 2) + 1,既能避免出現腦裂(split-brain),又能在故障發生后,快速選舉出新的主結點。例如:有 5 個候選主結點,推薦把該屬性設置為 3。由於本文演示的 demo 中只有兩個節點,因此把該值設置為 1:
discovery.zen.minimum_master_nodes: 1
腦裂(split-brain):
為了解釋,假設您有一個由兩個候選節點組成的集群。網絡故障中斷了這兩個節點之間的通信。每個節點都看到一個符合主節點資格的節點,此時如果 minimum_master_nodes 設置為默認值 1,這就足以形成一個集群。每個節點都選擇自己作為新的主節點(認為另一個候選節點已經死亡),結果是兩個集群,或一個分裂的大腦。在重新啟動一個節點之前,這兩個節點永遠不會重新連接。如果重新啟動其中的一個節點,那么已寫入該節點的任何數據都將丟失。
假設您有一個集群,其中有三個候選節點,minimum_master_nodes 被設置為 2。如果網絡分裂將一個節點與其他兩個節點分開,則擁有一個節點的一方無法看到足夠的符合主控資格的節點,並將意識到它無法選擇自己作為主控節點。擁有兩個節點的端將選擇一個新的主節點(如果需要)並繼續正常工作。一旦網絡分裂得到解決,單個節點將重新加入集群並再次開始服務請求。
至此一個非常簡單的雙節點集群就配置完成了,重啟節點上的 Elasticsearch 服務,就可在 Kibana 上看到集群中節點的信息了:

其它重要的配置
只配置上面的四個屬性就可以把集群搭建起來了。但是理解並配置另外一些重要的信息能讓 Elasticsearch 節點及整個集群更加高效,下面是個人認為一些比較重要的配置。
候選節點(Master Eligible Node)
主節點負責在集群范圍內執行輕量級操作,比如創建或刪除索引、跟蹤哪些節點是集群的一部分,以及決定將哪些分片分配給哪些節點。對於集群健康來說,擁有一個穩定的主節點非常重要。
任何候選節點(默認情況下所有節點都是候選節點)都可以被選舉為主節點。也就是說節點默認的 node.master 值為 true:
node.master: true
索引和搜索數據是 CPU、內存和 I/O 密集型操作,這會對節點的資源造成壓力。為了確保主節點是穩定的,並且沒有壓力,在規模比較大的集群中,最好把節點划分為不同的角色,比如專用的候選節點和專用的數據節點。因此精細一點的配置會讓主節點只負責輕量級的操作:
node.master: true node.data: false node.ingest: false search.remote.connect: false
雖然主節點也可以作為協調節點,將客戶機的搜索和索引請求路由到數據節點,但是最好不要讓主節點做這樣的事情。對於集群的穩定性來說,主節點所做的工作越少越好。因此可以設置專門的協調節點做這些工作,后面會有介紹。
數據節點(Data Node)
數據節點持有包含已索引文檔的切片。數據節點處理與數據相關的操作,如 CRUD、搜索和聚合。這些操作是 CPU、內存和 I/O 密集型操作。因此需要監視這些資源,並在它們過載時添加更多的數據節點。下面的配置把節點設置為專用的 Data Node:
node.master: false node.data: true node.ingest: false search.remote.connect: false
攝取節點(Ingest Node)
攝取節點可以執行由一個或多個攝取處理器組成的預處理管道。根據攝取處理器執行的操作類型和所需的資源,使用專用的攝取節點可能是有意義的,這些節點只執行這個特定的任務。下面的配置把節點設置為專用的 Ingest Node:
node.master: false node.data: false node.ingest: true search.remote.connect: false
協調節點(Cordinating only node)
搜索請求或批量索引請求等請求可能涉及不同數據節點上的數據。例如,搜索請求分兩個階段執行,這兩個階段由接收客戶機請求的節點(協調節點)協調。
在分散階段,協調節點將請求轉發給持有數據的數據節點。每個數據節點在本地執行請求並將結果返回給協調節點。在收集階段,協調節點將每個數據節點的結果簡化為單個全局結果集。
每個節點都是隱式的協調節點。如果取消了節點的候選資格、保存數據的能力和預處理文檔的能力,那么它就只剩下一個協調節點的功能,它只能路由請求、處理 search reduce 階段和分發批量索引。
只有協調節點才能從數據節點和候選節點中卸載協調節點角色,從而使大型集群受益。它們加入集群后,像其他節點一樣接收完整的集群狀態,並使用集群狀態將請求直接路由到適當的位置。下面的配置把節點設置為專用的協調節點:
node.master: false node.data: false node.ingest: false search.remote.connect: false
配置節點的 IP 地址
默認情況下,Elasticsearch 只綁定到回環地址,例如:127.0.0.1 (::1)。這樣只能從該服務器上訪問 Elasticsearch。事實上,可以從單個節點上相同的 $ES_HOME 位置啟動多個節點。這對於測試 Elasticsearch 形成集群的能力很有用,但不推薦用於生產環境。
為了與其他服務器上的節點通信並形成集群,需要把節點綁定到一個非回環地址。雖然有許多網絡配置項,但通常只需要配置:
network.host: 192.168.1.101
注意,一旦為 network.host 提供了自定義設置。Elasticsearch 就假設您正在從開發模式轉移到生產模式,並將許多系統啟動檢查從警告升級到異常。
一個簡要的示例
下面是一個簡要的 3 節點機器的配置示例:
# node 1 cluster.name: es-cluster node.name: es-node-1 node.master: true path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 10.32.2.100 discovery.zen.ping.unicast.hosts: ["10.32.2.101", "10.32.2.102"] discovery.zen.minimum_master_nodes: 2 # node 2 cluster.name: es-cluster node.name: es-node-2 node.master: true path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 10.32.2.101 discovery.zen.ping.unicast.hosts: ["10.32.2.100", "10.32.2.102"] discovery.zen.minimum_master_nodes: 2 # node 3 cluster.name: es-cluster node.name: es-node-3 node.master: true path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 10.32.2.102 discovery.zen.ping.unicast.hosts: ["10.32.2.100", "10.32.2.101"] discovery.zen.minimum_master_nodes: 2
參考:
Important Elasticsearch configuration
elasticsearch 集群搭建及參數詳解
ElasticSearch入門 第二篇:集群配置
Elasticsearch Node
