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
本文的演示環(huán)境為 Ubuntu Server 18.04,Elasticsearch 的版本為 6.2.4。
配置文件
在 Ubuntu 中使用 deb 包安裝的 Elasticsearch 的默認安裝目錄為:
/usr/share/elasticsearch

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

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

其它重要的配置
只配置上面的四個屬性就可以把集群搭建起來了。但是理解并配置另外一些重要的信息能讓 Elasticsearch 節(jié)點及整個集群更加高效,下面是個人認為一些比較重要的配置。
候選節(jié)點(Master Eligible Node)
主節(jié)點負責在集群范圍內執(zhí)行輕量級操作,比如創(chuàng)建或刪除索引、跟蹤哪些節(jié)點是集群的一部分,以及決定將哪些分片分配給哪些節(jié)點。對于集群健康來說,擁有一個穩(wěn)定的主節(jié)點非常重要。
任何候選節(jié)點(默認情況下所有節(jié)點都是候選節(jié)點)都可以被選舉為主節(jié)點。也就是說節(jié)點默認的 node.master 值為 true:
node.master: true
node.data: false
node.ingest: false
search.remote.connect: false
索引和搜索數據是 CPU、內存和 I/O 密集型操作,這會對節(jié)點的資源造成壓力。為了確保主節(jié)點是穩(wěn)定的,并且沒有壓力,在規(guī)模比較大的集群中,最好把節(jié)點劃分為不同的角色,比如專用的候選節(jié)點和專用的數據節(jié)點。因此精細一點的配置會讓主節(jié)點只負責輕量級的操作:
node.master: false
node.data: true
node.ingest: false
search.remote.connect: false
雖然主節(jié)點也可以作為協調節(jié)點,將客戶機的搜索和索引請求路由到數據節(jié)點,但是最好不要讓主節(jié)點做這樣的事情。對于集群的穩(wěn)定性來說,主節(jié)點所做的工作越少越好。因此可以設置專門的協調節(jié)點做這些工作,后面會有介紹。
數據節(jié)點(Data Node)
數據節(jié)點持有包含已索引文檔的切片。數據節(jié)點處理與數據相關的操作,如 CRUD、搜索和聚合。這些操作是 CPU、內存和 I/O 密集型操作。因此需要監(jiān)視這些資源,并在它們過載時添加更多的數據節(jié)點。下面的配置把節(jié)點設置為專用的 Data Node:
node.master: false
node.data: true
node.ingest: false
search.remote.connect: false
攝取節(jié)點(Ingest Node)
攝取節(jié)點可以執(zhí)行由一個或多個攝取處理器組成的預處理管道。根據攝取處理器執(zhí)行的操作類型和所需的資源,使用專用的攝取節(jié)點可能是有意義的,這些節(jié)點只執(zhí)行這個特定的任務。下面的配置把節(jié)點設置為專用的 Ingest Node:
node.master: false
node.data: false
node.ingest: true
search.remote.connect: false
協調節(jié)點(Cordinating only node)
搜索請求或批量索引請求等請求可能涉及不同數據節(jié)點上的數據。例如,搜索請求分兩個階段執(zhí)行,這兩個階段由接收客戶機請求的節(jié)點(協調節(jié)點)協調。
在分散階段,協調節(jié)點將請求轉發(fā)給持有數據的數據節(jié)點。每個數據節(jié)點在本地執(zhí)行請求并將結果返回給協調節(jié)點。在收集階段,協調節(jié)點將每個數據節(jié)點的結果簡化為單個全局結果集。
每個節(jié)點都是隱式的協調節(jié)點。如果取消了節(jié)點的候選資格、保存數據的能力和預處理文檔的能力,那么它就只剩下一個協調節(jié)點的功能,它只能路由請求、處理 search reduce 階段和分發(fā)批量索引。
只有協調節(jié)點才能從數據節(jié)點和候選節(jié)點中卸載協調節(jié)點角色,從而使大型集群受益。它們加入集群后,像其他節(jié)點一樣接收完整的集群狀態(tài),并使用集群狀態(tài)將請求直接路由到適當的位置。下面的配置把節(jié)點設置為專用的協調節(jié)點:
node.master: false
node.data: false
node.ingest: false
search.remote.connect: false
配置節(jié)點的 IP 地址
默認情況下,Elasticsearch 只綁定到回環(huán)地址,例如:127.0.0.1 (::1)。這樣只能從該服務器上訪問 Elasticsearch。事實上,可以從單個節(jié)點上相同的 $ES_HOME 位置啟動多個節(jié)點。這對于測試 Elasticsearch 形成集群的能力很有用,但不推薦用于生產環(huán)境。
為了與其他服務器上的節(jié)點通信并形成集群,需要把節(jié)點綁定到一個非回環(huán)地址。雖然有許多網絡配置項,但通常只需要配置:
network.host: 192.168.1.101
注意,一旦為 network.host 提供了自定義設置。Elasticsearch 就假設您正在從開發(fā)模式轉移到生產模式,并將許多系統(tǒng)啟動檢查從警告升級到異常。
一個簡要的示例
下面是一個簡要的 3 節(jié)點機器的配置示例:
# 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
作者:sparkdev
出處:http://www.cnblogs.com/sparkdev/
好消息!51reboot python運維自動化課程10.13日,51reboot k8s課程10月份 。關注公眾號;51reboot運維開發(fā)