【ELK搭建日記三】Elasticsearch分布式多機集群配置

前言

前面介紹了ES的插件安裝,ELK的準備工作就已經做完了,現在開始學習搭建ES集群??戳司W上的大神總結出來的經驗,自己也開始照葫蘆畫瓢,咿咿呀呀學起來。不多說往下看。

簡介

elasticsearch用于構建高可用和可擴展的系統。擴展的方式可以是購買更好的服務器(縱向擴展)或者購買更多的服務器(橫向擴展),Elasticsearch能從更強大的硬件中獲得更好的性能,但是縱向擴展也有一定的局限性。真正的擴展應該是橫向的,它通過增加節點來傳播負載和增加可靠性。對于大多數數據庫而言,橫向擴展意味著你的程序將做非常大的改動來利用這些新添加的設備。對比來說,Elasticsearch天生是分布式的:它知道如何管理節點來提供高擴展和高可用。這意味著你的程序不需要關心這些。對于大多數數據庫而言,橫向擴展意味著你的程序將做非常大的改動來利用這些新添加的設備。對比來說,Elasticsearch天生是分布式的:它知道如何管理節點來提供高擴展和高可用。這意味著你的程序不需要關心這些。

集群和節點

節點(node)是你運行的Elasticsearch實例。一個集群(cluster)是一組具有相同cluster.name的節點集合,他們協同工作,共享數據并提供故障轉移和擴展功能,當有新的節點加入或者刪除節點,集群就會感知到并平衡數據。集群中一個節點會被選舉為主節點(master),它用來管理集群中的一些變更,例如新建或刪除索引、增加或移除節點等;當然一個節點也可以組成一個集群。

節點通信

我們能夠與集群中的任何節點通信,包括主節點。任何一個節點互相知道文檔存在于哪個節點上,它們可以轉發請求到我們需要數據所在的節點上。我們通信的節點負責收集各節點返回的數據,最后一起返回給客戶端。這一切都由Elasticsearch透明的管理。

分片與副本分片

分片用于Elasticsearch在你的集群中分配數據。想象把分片當作數據的容器。文檔存儲在分片中,然后分片分配給你集群中的節點上。

當你的集群擴容或縮小,Elasticsearch將會自動在你的節點間遷移分片,以使集群保持平衡。

一個分片(shard)是一個最小級別的“工作單元(worker unit)”,它只是保存索引中所有數據的一小片.我們的文檔存儲和被索引在分片中,但是我們的程序不知道如何直接與它們通信。取而代之的是,他們直接與索引通信.Elasticsearch中的分片分為主分片和副本分片,復制分片只是主分片的一個副本,它用于提供數據的冗余副本,在硬件故障之后提供數據保護,同時服務于像搜索和檢索等只讀請求,主分片的數量和復制分片的數量都可以通過配置文件配置。但是主切片的數量只能在創建索引時定義且不能修改.相同的分片不會放在同一個節點上。

1)分片算法:

shard = hash(routing) % number_of_primary_shards

routing值是一個任意字符串,它默認是_id但也可以自定義,這個routing字符串通過哈希函數生成一個數字,然后除以主切片的數量得到一個余數(remainder),余數的范圍永遠是0到number_of_primary_shards - 1,這個數字就是特定文檔所在的分片。

這也解釋了為什么主切片的數量只能在創建索引時定義且不能修改:如果主切片的數量在未來改變了,所有先前的路由值就失效了,文檔也就永遠找不到了。

所有的文檔API(get、index、delete、bulk、update、mget)都接收一個routing參數,它用來自定義文檔到分片的映射。自定義路由值可以確保所有相關文檔.比如用戶的文章,按照用戶賬號路由,就可以實現屬于同一用戶的文檔被保存在同一分片上。

2)分片和副本交互:

新建、索引和刪除請求都是寫(write)操作,它們必須在主分片上成功完成才能復制到相關的復制分片上,下面我們羅列在主分片和復制分片上成功新建、索引或刪除一個文檔必要的順序步驟:

1、客戶端給Node 1發送新建、索引或刪除請求。

2、節點使用文檔的_id確定文檔屬于分片0。它轉發請求到Node 3,分片0位于這個節點上。

3、Node 3在主分片上執行請求,如果成功,它轉發請求到相應的位于Node 1和Node 2的復制節點上。當所有的復制節點報告成功,Node 3報告成功到請求的節點,請求的節點再報告給客戶端。

客戶端接收到成功響應的時候,文檔的修改已經被應用于主分片和所有的復制分片。你的修改生效了。

3)副本分片復制時的相關的參數說明:

replication:

復制默認的值是sync。這將導致主分片得到復制分片的成功響應后才返回,如果你設置replication為async,請求在主分片上被執行后就會返回給客戶端。它依舊會轉發請求給復制節點,但你將不知道復制節點成功與否。

默認的sync復制允許Elasticsearch強制反饋傳輸。async復制可能會因為在不等待其它分片就緒的情況下發送過多的請求而使Elasticsearch過載。

consistency:

默認主分片在嘗試寫入時需要**規定數量(quorum)**或過半的分片(可以是主節點或復制節點)可用。這是防止數據被寫入到錯的網絡分區。規定的數量計算公式如下:

int( (primary + number_of_replicas) / 2 ) + 1

consistency允許的值為one(只有一個主分片),all(所有主分片和復制分片)或者默認的quorum或過半分片。

注意number_of_replicas是在索引中的的設置,用來定義復制分片的數量,而不是現在活動的復制節點的數量。如果你定義了索引有3個復制節點,那規定數量是:int( (primary + 3 replicas) / 2 ) + 1 = 3

但如果你只有2個節點,那你的活動分片不夠規定數量,也就不能索引或刪除任何文檔。

注意: 新索引默認有1個復制分片,這意味著為了滿足quorum的要求**需要**兩個活動的分片。當然,這個默認設置將阻止我們在單一節點集群中進行操作。為了避開這個問題,規定數量只有在number_of_replicas大于一時才生效。

timeout:

當分片副本不足時Elasticsearch會等待更多的分片出現。默認等待一分鐘。如果需要,你可以設置timeout參數讓它終止的更早:100表示100毫秒,30s表示30秒。

集群生態:

1.同集群中節點之間可以擴容縮容,

2.主分片的數量會在其索引創建完成后修正,但是副本分片的數量會隨時變化。

3.相同的分片不會放在同一個節點上.

集群健康:

在Elasticsearch集群中可以監控統計很多信息,但是只有一個是最重要的時集群健康(cluster health)。Es中用三種顏色狀態表示:green,yellow,red.

Green:所有主分片和副本分片都可用

Yellow:所有主分片可用,但不是所有副本分片都可用

Red:不是所有的主分片都可用;

這些我們可以在ES-Head插件中看到。

Elasticsearch5.x的多機集群配置

這里主要針對基于Elasticsearch5.x的多機集群配置

ELasticsearch 5.3要求JDK版本最低為1.8,master機子安裝ELK,data機子安裝Elasticsearch,安裝詳見【ELK搭建日記一】安裝和配置》。

要求按照配置修改系統參數,確保系統有足夠資源啟動ES。

elasticsearch集群配置信息 elasticsearch-5.3.1/config/elasticsearch.yml

附:elasticsearch.yml基本配置說明

主機master配置:

cluster.name: XXX ?#配置集群名稱

node.name: "es-node1"? ? ? ? ? #配置節點名稱

node.master: true? ? ? ? ? ? ? #允許這個節點被選舉為一個主節點(默認允許)

node.data: true? ? ? ? ? ? ? ? #允許這個節點存儲數據(默認允許)

network.host: 0.0.0.0? ? #允許其他機子訪問

path.data: /home/parallels/Desktop/data/elk/data? #存儲數據路徑

path.logs: /home/parallels/Desktop/data/elk/logs? #存放數據日志

http.port: 9200 #端口號

discovery.zen.ping.unicast.hosts: ["es-node1", "es-node2"]? #設置集群中master節點的初始列表,可以通過這些節點來自動發現新加入集群的節點

http.cors.enabled: true

http.cors.allow-origin: "*"? #允許插件訪問集群

節點data配置:

cluster.name: XXX ?#配置集群名稱

node.name: "es-node2”? ? ? ? ? #配置節點名稱

node.master: false? ? ? ? ? ? ? #允許這個節點被選舉為一個主節點(默認允許)

node.data: true? ? ? ? ? ? ? ? #允許這個節點存儲數據(默認允許)

network.host: 0.0.0.0? ? #允許其他機子訪問

path.data: /home/parallels/Desktop/data/elk/data? #存儲數據路徑

path.logs: /home/parallels/Desktop/data/elk/logs? #存放數據日志

http.port: 9200 #端口號

discovery.zen.ping.unicast.hosts: [“本機ip地址”, “主機ip地址”]? #設置集群中master節點的初始列表,可以通過這些節點來自動發現新加入集群的節點

http.cors.enabled: true

http.cors.allow-origin: "*"? #允許插件訪問集群

完成配置后確保所有節點在同一網段下

啟動主節點./elasticsearch

啟動elasticsearch head 插件 http://192.168.23.230:9100

es新建索引 默認把數據分為5個分片和1副本分片

我們通過logstash導入數據(啟動方法在ELK安裝和配置中),如果不做配置的情況下也將是按照es中默認分片數來創建索引

./logstash -f ../config/logstash-simple.conf


可以看到集群健康值是yellow,因為通過logstash默認生成的索引是有一份副本文件的,而這個副本文件沒有被節點分配。我們按照前面的數據節點配置啟動一個data節點即可完成分配,即變為綠色。

但是當節點數超過副本數+1的時候,就有可能出現數據丟失的風險如下圖

這種情況雖然健康值為綠色,但是當中兩個節點宕機的極端情況下,會出現數據丟失的風險。

可以通過elasticsearch-kopf插件進行修改副本分片數達到所有節點分片數一致。

修改number_of_replicas

修改后

如果想自定義導入數據時的分片數量,可以在logstash目錄下新建/config/logstash-simple.conf文件,對output到es的數據格式進行自定義。通過新建json配置文件來對索引格式自定義。

"number_of_replicas":"4",? 對應副本分片數(可更改)

"number_of_shards":"4" 對應主分片數(索引創建就無法更改)

分布式多集群進階

在上文es的配置中,所有節點均為數據節點,也可以是主節點,當主節點宕機時,其余的節點會自動選舉出新的主節點,但在實際的項目中,這種方式并不推薦使用,這表示這個節點即有成為主節點的資格,又存儲數據,這個時候如果某個節點被選舉成為了真正的主節點,那么他還要存儲數據,這樣對于這個節點的壓力就比較大了。elasticsearch默認每個節點都是這樣的配置,在測試環境下這樣做沒問題。實際工作中建議不要這樣設置,這樣相當于主節點和數據節點的角色混合到一塊了。

如何配置多集群中的節點,實現負載均衡,可以參考elasticsearch負載均衡節點。


部分文獻出處

實例展示elasticsearch集群生態,分片以及水平擴展.

如何為logstash+elasticsearch配置索引模板?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容