Elasticsearch集羣部署(從入門到進階)

目錄

1 概念

1.1 Cluster 集羣

1.2 Node 節點

1.3 Shard 分片

2 集羣搭建

2.1 準備環境

2.2 集羣配置

2.3 啓動集羣和測試

3 集羣管理


1 概念

此處以 Elasticsearch 7 爲示例說明,以下說到的各種配置參數和名字都是以 Elasticsearch 7 的爲準。

Elasticsearch 是一個實時的分佈式搜索分析引擎,它能讓你以前所未有的速度和規模,去探索和檢索你的數據。只要你發現你的ES集羣已經快達到所能承受的極限(內存不夠/磁盤空間不夠等),你都可以橫向地實時擴展你地ES集羣,通過增加ES服務數量來增加內存和磁盤空間。

1.1 Cluster 集羣

由一組關聯的節點組成的,稱爲一個集羣。

一個集羣由一個唯一的名字標識,默認爲“elasticsearch”。集羣名稱非常重要,只有相同集羣名的節點纔會組成一個集羣,集羣名稱可以在配置文件中指定(cluster.name)。集羣中有多個節點,各個節點通過集羣名在網絡中發現同伴組成集羣,其中有一個爲主節點,這個主節點是可以通過選舉產生的,在具有成爲主節點的候選節點(node.master: true,discovery.seed_hosts)中選舉產生的,除了主節點外的其他節點都可以稱爲從節點,但是主從節點是對於集羣內部來說的。ElasticSearch的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集羣外部來說,因爲從外部來看ElasticSearch集羣,在邏輯上是個整體,你與任何一個節點的通信和與整個ElasticSearch集羣通信是等價的,即每一個節點都知道文檔存在於哪個節點上,可以轉發請求到相應的節點上。

 

1.2 Node 節點

節點存儲集羣的數據,參與集羣的索引和搜索功能。像集羣有名字,節點也有自己的名稱,默認在啓動時會以一個隨機的UUID的前七個字符作爲節點的名字,你可以爲其指定任意的名字(node.name)。一個節點也可以是集羣,即單節點集羣。每一個運行實例稱爲一個節點,即是一個ES服務,或稱一個服務進程,每一個運行實例既可以在同一個機器上,也可以在不同的機器上。在測試環境中可以在一臺服務器上運行多個ES服務,但是在生產環境中建議每臺服務器運行一個ES服務。

節點分有五種,候選主節點(Master-eligible)、數據節點(Data)、Ingest節點、機器學習節點(Machine learning)和協調節點。其中,我們這裏只要知道Master-eligible和Data即可,Ingest和協調節點做簡要說明,Machine learning暫不說明。

候選主節點(Master-eligible)

有資格被選舉爲集羣主節點的節點,通過在這些節點中選舉產生集羣的主節點。主節點負責集羣範圍內的輕量級操作,如創建或刪除索引,跟蹤哪些節點是集羣的一部分以及確定將哪些分片分配給哪些節點,即主節點相當於一個集羣的指揮官。擁有穩定的主節點對於羣集健康非常重要。

在索引和搜索數據的時候都會佔用比較大的CPU、內存和IO來工作,這可能會對節點的資源帶來壓力。因此,爲了確保主節點的穩定,若是在較大的集羣中,我們可以將主節點和其他節點,如數據節點等分開。

僅做候選主節點的配置:

node.master: true
node.data: false 
node.ingest: false 
node.ml: false

 

數據節點(Data)

數據節點是存儲數據的,包含建立了索引的文檔的分片。同時也是處理與數據相關的操作,如CRUD、聚合和搜索等,這些操作都需要佔用較大的CPU、內存和IO,故監視這些資源並在過載時新增更多的數據節點非常重要。

僅做數據節點的配置:

node.master: false
node.data: true 
node.ingest: false 
node.ml: false

 

Ingest節點

Ingest 節點可以看作是數據前置處理轉換的節點,支持 pipeline管道設置,可以對數據進行過濾、轉換等操作,類似於 logstash 中 filter 的作用,功能相當強大。

基本原理:節點接收到數據之後,根據請求參數中指定的管道流 id,找到對應的已註冊管道流,對數據進行處理,然後將處理過後的數據,按照 Elasticsearch 標準的 indexing 流程繼續運行。

僅做Ingest節點的配置:

node.master: false
node.data: false 
node.ingest: true
node.ml: false

 

協調節點

搜索請求在兩個階段中執行(query 和 fetch),這兩個階段由接收客戶端請求的節點 - 協調節點協調。

  • 在請求階段,協調節點將請求轉發到保存數據的數據節點。 每個數據節點在本地執行請求並將其結果返回給協調節點。
  • 在收集fetch階段,協調節點將每個數據節點的結果彙集爲單個全局結果集。

僅做協調節點的配置:

node.master: false
node.data: false 
node.ingest: false 
node.ml: false

 

1.3 Shard 分片

在創建一個索引時可以指定分成多少個分片來存儲。每個分片本身也是一個功能完善且獨立的“索引”,可以被放置在集羣的任意節點上(分片數創建索引時指定,創建後不可改了。備份數可以隨時改)。索引分片,ElasticSearch可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分佈到不同的節點上。構成分佈式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。分片的好處:

  • 允許我們水平切分/擴展容量。
  • 可在多個分片上進行分佈式的、並行的操作,提高系統的性能和吞吐量。

需要注意的是,每個分片本質上就是一個Lucene索引,因此會消耗相應的CPU、內存和IO資源。

分片配置策略

ES推薦的最大JVM堆空間是30~32G,所以把你的分片最大容量限制爲30GB,然後再對分片數量做合理估算。例如,你覺得你的數據能達到200GB, 推薦你最多分配7到8(200/30)個分片。
在開始階段,一個比較好的方案是根據你的數據節點數量按照1.5~3倍的原則來創建分片。例如,如果你有3個節點, 則推薦你創建的分片數最多不超過9(3x3)個。當性能下降時,增加節點,ES會自動平衡分片的放置。
對於基於日期的索引需求,並且對索引數據的搜索場景非常少。也許這些索引量將達到成百上千,但每個索引的數據量只有1GB甚至更小。對於這種類似場景,建議只需要爲索引分配1個分片。如日誌管理就是一個日期的索引需求,日期索引會很多,但每個索引存放的日誌數據量就很少。

 

備份(Replication)

一個分片可以有多個備份(副本),備份數可以隨時改。好處:

  • 高可用擴展搜索的併發能力、吞吐量。
  • 搜索可以在所有的副本上並行運行。

 

主分片(primary shard)

每個文檔都存儲在其中一個分片中,當你存儲一個文檔的時候,系統會首先存儲在主分片中,然後複製到不同的副本中。默認情況下,一個索引有5個主分片。你可以在事先制定分片的數量,當分片一旦建立,分片的數量則不能修改。

 

副本分片(replica shard)

每一個分片有零個或多個副本。副本主要是主分片的複製,其中有兩個目的:

  • 增加高可用性,當主分片故障的時候,可以從副本分片中選擇一個作爲主分片。
  • 提高性能,當查詢的時候可以到主分片或者副本分片中進行查詢。默認情況下,一個主分片配有一個副本,但副本的數量可以在後面動態的配置增加。副本必須部署在不同的節點上,不能部署在和主分片相同的節點上。

 

2 集羣搭建

2.1 準備環境

(1)準備了3臺服務器搭建ES集羣:192.168.17.137、192.168.17.139 和 192.168.17.136 。

(2)分別在這三臺機器上安裝java8或java11,這裏以java8作爲例子,具體安裝步驟網上一搜一大把,這裏就不多說了。

(3)分別在這三臺機器上安裝Elasticsearch7.5.0,具體安裝可查看之前的文檔 https://blog.csdn.net/qq_15092079/article/details/81411334

 

2.2 集羣配置

集羣的配置,其實就config目錄下面的 elasticsearch.yml、jvm.options 和 log4j2.properties 三個文件的配置。

elasticsearch.yml

配置以192.168.17.137的爲例子說明,其他兩個服務器的配置也是類似,這裏就不列出來了。一個簡單的集羣這裏只簡單配置幾個選項,其他都可以直接使用默認的。若需知道具體這些配置項的意義,可繼續看下面的說明。

cluster.name: es-cluster

# 節點名稱,每個節點的都不一樣
node.name: node-1

path.data: /usr/softwares/elasticsearch-7.5.0/data

path.logs: /usr/softwares/elasticsearch-7.5.0/logs

# 節點ip,每個節點的都不一樣
network.host: 192.168.17.137

http.port: 9200
transport.port: 9333

http.cors.enabled: true
http.cors.allow-origin: "*"

node.master: true
node.data: true

discovery.seed_hosts: ["192.168.17.137", "192.168.17.136", "192.168.17.139"]

配置參數說明(標紅爲重點需要理解的參數):

參數 說明
cluster.name: es-cluster ES集羣名稱,同一個集羣內的所有節點集羣名稱必須保持一致
node.name: node-1 ES集羣內的節點名稱,同一個集羣內的節點名稱要具備唯一性
node.master: true 是否爲候選主節點,允許節點是否可以成爲一個master節點,ES是默認集羣中的第一臺機器成爲master,如果這臺機器停止就會重新選舉(默認true)
node.data: true 是否爲數據節點,允許該節點存儲索引數據(默認true)
node.ingest: true

是否爲ingest節點,允許該節點對數據進行前置處理轉換,支持管道設置(默認true)

 

node.ml: true 是否爲機器學習節點(Machine learning),允許該節點進行機器學習(默認true)。若在未來你想要集羣能夠進行機器學習,除了這個參數得設爲true外,另外 xpack.ml.enabled 參數也得設爲true,在所有的候選主節點上。這兩個參數的默認值都是true。
path.data:/usr/softwares/elasticsearch-7.5.0/data 數據存儲目錄,ES是搜索引擎,會創建文檔,建立索引,此路徑是索引的存放目錄。可以指定多個存儲位置
path.logs:/usr/softwares/elasticsearch-7.5.0/logs elasticsearch專門的日誌存儲位置
network.host: 192.168.17.137 ES服務所在IP地址,HTTP端口和集羣通信端口就會監聽在此地址上
http.port: 9200 定義ES對外調用的http端口,默認是9200
http.cors.enabled: true 是否開啓跨域訪問
http.cors.allow-origin: "*" 開啓跨域訪問後的地址限制,*表示無限制
transport.port: 9300

集羣節點間的tcp通信端口,默認就是9300。集羣節點間是以netty-transport方式通信的,好處是異步非阻塞,大大提高了併發率。

discovery.seed_hosts: ["192.168.17.137", "192.168.17.136", "192.168.17.139"] Elasticsearch7新增參數,寫入候選主節點的設備地址,來開啓服務時就可以被選爲主節點,由discovery.zen.ping.unicast.hosts(ES7中已廢棄)參數改變而來,並且防止腦裂現象的discovery.zen.minimum_master_nodes參數也在ES7中被遺棄,ES7會自動動態地分配這個參數值以防止腦裂現象。
cluster.initial_master_nodes: ["192.168.17.137", "192.168.17.136", "192.168.17.139"] Elasticsearch7新增參數,參數設置一系列符合主節點條件的節點的主機名或 IP 地址來引導啓動集羣。集羣在第一次選舉中應該使用的一組符合主節點條件的節點作爲選舉配置。這就是所謂的集羣引導,只在首次形成集羣時才需要。已經加入集羣的節點將選舉配置存儲在它們的數據文件夾中,並在重新啓動後重用這些配置,而正在加入現有集羣的新節點可以從集羣的當前主節點接收這些信息,故新加入集羣的節點可以不用配置此參數。
bootstrap.memory_lock: true 在ES運行起來後鎖定ES所能使用的堆內存大小,鎖定內存大小一般爲可用內存的一半左右;鎖定內存後就不會使用交換分區。如果不打開此項,當系統物理內存空間不足,ES將使用交換分區,ES如果使用交換分區,那麼ES的性能將會變得很差。具體的內存大小可在jvm.options中配置。
index.number_of_shards 設置默認索引分片個數,默認爲5片。
index.number_of_replicas 設置默認索引副本個數,默認爲1個副本。
network.tcp.no_delay: true 是否啓用tcp無延遲,true爲啓用tcp不延遲,默認爲false啓用tcp延遲
truenetwork.tcp.keep_alive: true 是否啓用TCP保持活動狀態,默認爲true
network.tcp.reuse_address: true 是否應該重複使用地址。默認true,在Windows機器上默認爲false
network.tcp.send_buffer_size: 128mb tcp發送緩衝區大小,默認不設置
network.tcp.receive_buffer_size: 128mb tcp接收緩衝區大小,默認不設置
transport.tcp.port: 9301 設置集羣節點通信的TCP端口,默認就是9300,與transport.port作用一樣。
transport.tcp.compress: true 設置是否壓縮TCP傳輸時的數據,默認爲false
http.max_content_length: 200mb 設置http請求內容的最大容量,默認是100mb
discovery.zen.minimum_master_nodes: 2 在Elasticsearch7.0版本已被移除,配置無效,爲了避免腦裂,集羣的最少節點數量爲,集羣的總節點數量除以2加一
discovery.zen.fd.ping_timeout: 120s 在Elasticsearch7.0版本已被移除,配置無效。探測超時時間,默認是3秒,我們這裏填120秒是爲了防止網絡不好的時候ES集羣發生腦裂現象
discovery.zen.fd.ping_retries: 6 在Elasticsearch7.0版本已被移除,配置無效。探測次數,如果每次探測90秒,連續探測超過六次,則認爲節點該節點已脫離集羣,默認爲3次
discovery.zen.fd.ping_interval: 15s 在Elasticsearch7.0版本已被移除,配置無效。節點每隔15秒向master發送一次心跳,證明自己和master還存活,默認爲1秒太頻繁
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"] 在Elasticsearch7.0版本已被移除,配置錯誤。寫入候選主節點的設備地址,來開啓服務時就可以被選爲主節點。默認主機列表只有127.0.0.1和IPV6的本機迴環地址。上面是書寫格式,discover意思爲發現,zen是判定集羣成員的協議,unicast是單播的意思,ES5.0版本之後只支持單播的方式來進行集羣間的通信,hosts爲主機
cluster.fault_detection.leader_check.interval: 15s Elasticsearch7新增參數,設置每個節點在選中的主節點的檢查之間等待的時間。默認爲1秒
discovery.cluster_formation_warning_timeout: 30s Elasticsearch7新增參數,啓動後30秒內,如果集羣未形成,那麼將會記錄一條警告信息,警告信息未master not fount開始,默認爲10秒
cluster.join.timeout: 30s Elasticsearch7新增參數,節點發送請求加入集羣后,在認爲請求失敗後,再次發送請求的等待時間,默認爲60秒
cluster.publish.timeout: 90s Elasticsearch7新增參數,設置主節點等待每個集羣狀態完全更新後發佈到所有節點的時間,默認爲30秒
cluster.routing.allocation.cluster_concurrent_rebalance: 32 集羣內同時啓動的數據任務個數,默認是2個
cluster.routing.allocation.node_concurrent_recoveries: 32 添加或刪除節點及負載均衡時併發恢復的線程個數,默認4個
cluster.routing.allocation.node_initial_primaries_recoveries: 32 初始化數據恢復時,併發恢復線程的個數,默認4個

 

jvm.options

可根據各個服務器實際可用的內存,配置ES的使用堆內存,默認最大內存和最小內存均是1g。一般此內存設置爲服務器總可用內存的一半(即50%的策略設置),並且不能超過32GB(由於jvm的特性,內存對象指針壓縮技術)。

設置ES運行的最大和最小堆內存爲500m。

-Xms500m
-Xmx500m

設置ES運行的java版本爲8到9,且最大和最小堆內存爲500m。

8-9:-Xms500m
8-9:-Xmx500m

設置ES運行的java版本爲大於等於8,且最大和最小堆內存爲500m。

8-:-Xms500m
8-:-Xmx500m

 

log4j2.properties

ES服務的日誌記錄配置文件,與log4j的形式配置,這裏不多做說明。

 

2.3 啓動集羣和測試

啓動

啓動集羣,首先得從其中一個候選主節點入手啓動,第一個被啓動的候選主節點將會被優先選舉爲主節點。

我這裏先後啓動順序爲:192.168.17.137、192.168.17.139 和 192.168.17.136。

在elasticsearch的根目錄下,切換對應用戶,後臺運行ES服務。

cd es的根目錄

su es用戶

./bin/elasticsearch -d

 

啓動成功的主節點日誌截圖:

 

測試

分別輸入地址:

http://192.168.17.137:9200/

http://192.168.17.139:9200/

http://192.168.17.136:9200/

頁面返回,此處以node-2節點爲例:

證明Elasticsearch集羣已經成功啓動運行。

 

停止

先停止所有非主節點,最後才停止主節點。

# 查找es的進程號
jps
# 直接停止此進程
kill -9 es進程號

 

3 集羣管理

可以通過安裝相應版本的kibana來進行ES的監控和管理。具體安裝流程可以見之前的文檔 https://blog.csdn.net/qq_15092079/article/details/81411334

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章