配置 Elasticsearch 集羣

Elasticsearch 的安裝很是簡單,筆者在前文《單機部署 ELK》中已經介紹過了,本文主要介紹集羣的配置,並解釋常見配置參數的含義。html

要配置集羣,最簡單的狀況下,設置下面幾個參數就能夠了:node

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 的配置文件確不在這裏,配置文件的目錄爲:elasticsearch

/etc/elasticsearch

注意,這個目錄及其全部內容的全部者都是 root,屬於 elasticsearch 用戶組。本文咱們主要關注的配置文件爲 /etc/elasticsearch/elasticsearch.yml。ide

配置集羣的名稱

一個節點只有與集羣中的全部其餘節點擁有相同的 master.name 時才能加入集羣。默認的集羣名稱是 elasticsearch,最好是設置爲合適的名字,不然可能和現有的集羣同名。下面的配置把集羣命名爲 es-cluster:測試

cluster.name: es-cluster

注意:確保不要在不一樣的環境中重用相同的集羣名稱,不然可能會致使節點加入錯誤的集羣。ui

配置節點的名稱

若是不設置節點的名稱 node.name,默認狀況下,Elasticsearch 將使用隨機生成的 UUID 的前七個字符做爲節點的 ID,而且這個隨機的字符串會被持久化下來,即便重啓系統也不會丟失。可是爲了提升系統的可讀性,咱們最好是爲每一個節點設置一個合適的名字:spa

node.name: es-node-1

或者是乾脆設置爲主機的名稱:code

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

相關文章
相關標籤/搜索