前言
前面介紹了ES的插件安裝,ELK的準(zhǔn)備工作就已經(jīng)做完了,現(xiàn)在開始學(xué)習(xí)搭建ES集群。看了網(wǎng)上的大神總結(jié)出來的經(jīng)驗(yàn),自己也開始照葫蘆畫瓢,咿咿呀呀學(xué)起來。不多說往下看。
簡介
elasticsearch用于構(gòu)建高可用和可擴(kuò)展的系統(tǒng)。擴(kuò)展的方式可以是購買更好的服務(wù)器(縱向擴(kuò)展)或者購買更多的服務(wù)器(橫向擴(kuò)展),Elasticsearch能從更強(qiáng)大的硬件中獲得更好的性能,但是縱向擴(kuò)展也有一定的局限性。真正的擴(kuò)展應(yīng)該是橫向的,它通過增加節(jié)點(diǎn)來傳播負(fù)載和增加可靠性。對于大多數(shù)數(shù)據(jù)庫而言,橫向擴(kuò)展意味著你的程序?qū)⒆龇浅4蟮母膭?dòng)來利用這些新添加的設(shè)備。對比來說,Elasticsearch天生是分布式的:它知道如何管理節(jié)點(diǎn)來提供高擴(kuò)展和高可用。這意味著你的程序不需要關(guān)心這些。對于大多數(shù)數(shù)據(jù)庫而言,橫向擴(kuò)展意味著你的程序?qū)⒆龇浅4蟮母膭?dòng)來利用這些新添加的設(shè)備。對比來說,Elasticsearch天生是分布式的:它知道如何管理節(jié)點(diǎn)來提供高擴(kuò)展和高可用。這意味著你的程序不需要關(guān)心這些。
集群和節(jié)點(diǎn)
節(jié)點(diǎn)(node)是你運(yùn)行的Elasticsearch實(shí)例。一個(gè)集群(cluster)是一組具有相同cluster.name的節(jié)點(diǎn)集合,他們協(xié)同工作,共享數(shù)據(jù)并提供故障轉(zhuǎn)移和擴(kuò)展功能,當(dāng)有新的節(jié)點(diǎn)加入或者刪除節(jié)點(diǎn),集群就會(huì)感知到并平衡數(shù)據(jù)。集群中一個(gè)節(jié)點(diǎn)會(huì)被選舉為主節(jié)點(diǎn)(master),它用來管理集群中的一些變更,例如新建或刪除索引、增加或移除節(jié)點(diǎn)等;當(dāng)然一個(gè)節(jié)點(diǎn)也可以組成一個(gè)集群。
節(jié)點(diǎn)通信
我們能夠與集群中的任何節(jié)點(diǎn)通信,包括主節(jié)點(diǎn)。任何一個(gè)節(jié)點(diǎn)互相知道文檔存在于哪個(gè)節(jié)點(diǎn)上,它們可以轉(zhuǎn)發(fā)請求到我們需要數(shù)據(jù)所在的節(jié)點(diǎn)上。我們通信的節(jié)點(diǎn)負(fù)責(zé)收集各節(jié)點(diǎn)返回的數(shù)據(jù),最后一起返回給客戶端。這一切都由Elasticsearch透明的管理。
分片與副本分片
分片用于Elasticsearch在你的集群中分配數(shù)據(jù)。想象把分片當(dāng)作數(shù)據(jù)的容器。文檔存儲在分片中,然后分片分配給你集群中的節(jié)點(diǎn)上。
當(dāng)你的集群擴(kuò)容或縮小,Elasticsearch將會(huì)自動(dòng)在你的節(jié)點(diǎn)間遷移分片,以使集群保持平衡。
一個(gè)分片(shard)是一個(gè)最小級別的“工作單元(worker unit)”,它只是保存索引中所有數(shù)據(jù)的一小片.我們的文檔存儲和被索引在分片中,但是我們的程序不知道如何直接與它們通信。取而代之的是,他們直接與索引通信.Elasticsearch中的分片分為主分片和副本分片,復(fù)制分片只是主分片的一個(gè)副本,它用于提供數(shù)據(jù)的冗余副本,在硬件故障之后提供數(shù)據(jù)保護(hù),同時(shí)服務(wù)于像搜索和檢索等只讀請求,主分片的數(shù)量和復(fù)制分片的數(shù)量都可以通過配置文件配置。但是主切片的數(shù)量只能在創(chuàng)建索引時(shí)定義且不能修改.相同的分片不會(huì)放在同一個(gè)節(jié)點(diǎn)上。
1)分片算法:
shard = hash(routing) % number_of_primary_shards
routing值是一個(gè)任意字符串,它默認(rèn)是_id但也可以自定義,這個(gè)routing字符串通過哈希函數(shù)生成一個(gè)數(shù)字,然后除以主切片的數(shù)量得到一個(gè)余數(shù)(remainder),余數(shù)的范圍永遠(yuǎn)是0到number_of_primary_shards - 1,這個(gè)數(shù)字就是特定文檔所在的分片。
這也解釋了為什么主切片的數(shù)量只能在創(chuàng)建索引時(shí)定義且不能修改:如果主切片的數(shù)量在未來改變了,所有先前的路由值就失效了,文檔也就永遠(yuǎn)找不到了。
所有的文檔API(get、index、delete、bulk、update、mget)都接收一個(gè)routing參數(shù),它用來自定義文檔到分片的映射。自定義路由值可以確保所有相關(guān)文檔.比如用戶的文章,按照用戶賬號路由,就可以實(shí)現(xiàn)屬于同一用戶的文檔被保存在同一分片上。
2)分片和副本交互:
新建、索引和刪除請求都是寫(write)操作,它們必須在主分片上成功完成才能復(fù)制到相關(guān)的復(fù)制分片上,下面我們羅列在主分片和復(fù)制分片上成功新建、索引或刪除一個(gè)文檔必要的順序步驟:
1、客戶端給Node 1發(fā)送新建、索引或刪除請求。
2、節(jié)點(diǎn)使用文檔的_id確定文檔屬于分片0。它轉(zhuǎn)發(fā)請求到Node 3,分片0位于這個(gè)節(jié)點(diǎn)上。
3、Node 3在主分片上執(zhí)行請求,如果成功,它轉(zhuǎn)發(fā)請求到相應(yīng)的位于Node 1和Node 2的復(fù)制節(jié)點(diǎn)上。當(dāng)所有的復(fù)制節(jié)點(diǎn)報(bào)告成功,Node 3報(bào)告成功到請求的節(jié)點(diǎn),請求的節(jié)點(diǎn)再報(bào)告給客戶端。
客戶端接收到成功響應(yīng)的時(shí)候,文檔的修改已經(jīng)被應(yīng)用于主分片和所有的復(fù)制分片。你的修改生效了。
3)副本分片復(fù)制時(shí)的相關(guān)的參數(shù)說明:
replication:
復(fù)制默認(rèn)的值是sync。這將導(dǎo)致主分片得到復(fù)制分片的成功響應(yīng)后才返回,如果你設(shè)置replication為async,請求在主分片上被執(zhí)行后就會(huì)返回給客戶端。它依舊會(huì)轉(zhuǎn)發(fā)請求給復(fù)制節(jié)點(diǎn),但你將不知道復(fù)制節(jié)點(diǎn)成功與否。
默認(rèn)的sync復(fù)制允許Elasticsearch強(qiáng)制反饋傳輸。async復(fù)制可能會(huì)因?yàn)樵诓坏却渌制途w的情況下發(fā)送過多的請求而使Elasticsearch過載。
consistency:
默認(rèn)主分片在嘗試寫入時(shí)需要**規(guī)定數(shù)量(quorum)**或過半的分片(可以是主節(jié)點(diǎn)或復(fù)制節(jié)點(diǎn))可用。這是防止數(shù)據(jù)被寫入到錯(cuò)的網(wǎng)絡(luò)分區(qū)。規(guī)定的數(shù)量計(jì)算公式如下:
int( (primary + number_of_replicas) / 2 ) + 1
consistency允許的值為one(只有一個(gè)主分片),all(所有主分片和復(fù)制分片)或者默認(rèn)的quorum或過半分片。
注意number_of_replicas是在索引中的的設(shè)置,用來定義復(fù)制分片的數(shù)量,而不是現(xiàn)在活動(dòng)的復(fù)制節(jié)點(diǎn)的數(shù)量。如果你定義了索引有3個(gè)復(fù)制節(jié)點(diǎn),那規(guī)定數(shù)量是:int( (primary + 3 replicas) / 2 ) + 1 = 3
但如果你只有2個(gè)節(jié)點(diǎn),那你的活動(dòng)分片不夠規(guī)定數(shù)量,也就不能索引或刪除任何文檔。
注意: 新索引默認(rèn)有1個(gè)復(fù)制分片,這意味著為了滿足quorum的要求**需要**兩個(gè)活動(dòng)的分片。當(dāng)然,這個(gè)默認(rèn)設(shè)置將阻止我們在單一節(jié)點(diǎn)集群中進(jìn)行操作。為了避開這個(gè)問題,規(guī)定數(shù)量只有在number_of_replicas大于一時(shí)才生效。
timeout:
當(dāng)分片副本不足時(shí)Elasticsearch會(huì)等待更多的分片出現(xiàn)。默認(rèn)等待一分鐘。如果需要,你可以設(shè)置timeout參數(shù)讓它終止的更早:100表示100毫秒,30s表示30秒。
集群生態(tài):
1.同集群中節(jié)點(diǎn)之間可以擴(kuò)容縮容,
2.主分片的數(shù)量會(huì)在其索引創(chuàng)建完成后修正,但是副本分片的數(shù)量會(huì)隨時(shí)變化。
3.相同的分片不會(huì)放在同一個(gè)節(jié)點(diǎn)上.
集群健康:
在Elasticsearch集群中可以監(jiān)控統(tǒng)計(jì)很多信息,但是只有一個(gè)是最重要的時(shí)集群健康(cluster health)。Es中用三種顏色狀態(tài)表示:green,yellow,red.
Green:所有主分片和副本分片都可用
Yellow:所有主分片可用,但不是所有副本分片都可用
Red:不是所有的主分片都可用;
這些我們可以在ES-Head插件中看到。
Elasticsearch5.x的多機(jī)集群配置
這里主要針對基于Elasticsearch5.x的多機(jī)集群配置
ELasticsearch 5.3要求JDK版本最低為1.8,master機(jī)子安裝ELK,data機(jī)子安裝Elasticsearch,安裝詳見【ELK搭建日記一】安裝和配置》。
要求按照配置修改系統(tǒng)參數(shù),確保系統(tǒng)有足夠資源啟動(dòng)ES。
elasticsearch集群配置信息 elasticsearch-5.3.1/config/elasticsearch.yml
主機(jī)master配置:
cluster.name: XXX ?#配置集群名稱
node.name: "es-node1"? ? ? ? ? #配置節(jié)點(diǎn)名稱
node.master: true? ? ? ? ? ? ? #允許這個(gè)節(jié)點(diǎn)被選舉為一個(gè)主節(jié)點(diǎn)(默認(rèn)允許)
node.data: true? ? ? ? ? ? ? ? #允許這個(gè)節(jié)點(diǎn)存儲數(shù)據(jù)(默認(rèn)允許)
network.host: 0.0.0.0? ? #允許其他機(jī)子訪問
path.data: /home/parallels/Desktop/data/elk/data? #存儲數(shù)據(jù)路徑
path.logs: /home/parallels/Desktop/data/elk/logs? #存放數(shù)據(jù)日志
http.port: 9200 #端口號
discovery.zen.ping.unicast.hosts: ["es-node1", "es-node2"]? #設(shè)置集群中master節(jié)點(diǎn)的初始列表,可以通過這些節(jié)點(diǎn)來自動(dòng)發(fā)現(xiàn)新加入集群的節(jié)點(diǎn)
http.cors.enabled: true
http.cors.allow-origin: "*"? #允許插件訪問集群
節(jié)點(diǎn)data配置:
cluster.name: XXX ?#配置集群名稱
node.name: "es-node2”? ? ? ? ? #配置節(jié)點(diǎn)名稱
node.master: false? ? ? ? ? ? ? #允許這個(gè)節(jié)點(diǎn)被選舉為一個(gè)主節(jié)點(diǎn)(默認(rèn)允許)
node.data: true? ? ? ? ? ? ? ? #允許這個(gè)節(jié)點(diǎn)存儲數(shù)據(jù)(默認(rèn)允許)
network.host: 0.0.0.0? ? #允許其他機(jī)子訪問
path.data: /home/parallels/Desktop/data/elk/data? #存儲數(shù)據(jù)路徑
path.logs: /home/parallels/Desktop/data/elk/logs? #存放數(shù)據(jù)日志
http.port: 9200 #端口號
discovery.zen.ping.unicast.hosts: [“本機(jī)ip地址”, “主機(jī)ip地址”]? #設(shè)置集群中master節(jié)點(diǎn)的初始列表,可以通過這些節(jié)點(diǎn)來自動(dòng)發(fā)現(xiàn)新加入集群的節(jié)點(diǎn)
http.cors.enabled: true
http.cors.allow-origin: "*"? #允許插件訪問集群
完成配置后確保所有節(jié)點(diǎn)在同一網(wǎng)段下
啟動(dòng)主節(jié)點(diǎn)./elasticsearch
啟動(dòng)elasticsearch head 插件 http://192.168.23.230:9100

es新建索引 默認(rèn)把數(shù)據(jù)分為5個(gè)分片和1副本分片

我們通過logstash導(dǎo)入數(shù)據(jù)(啟動(dòng)方法在ELK安裝和配置中),如果不做配置的情況下也將是按照es中默認(rèn)分片數(shù)來創(chuàng)建索引
./logstash -f ../config/logstash-simple.conf

可以看到集群健康值是yellow,因?yàn)橥ㄟ^logstash默認(rèn)生成的索引是有一份副本文件的,而這個(gè)副本文件沒有被節(jié)點(diǎn)分配。我們按照前面的數(shù)據(jù)節(jié)點(diǎn)配置啟動(dòng)一個(gè)data節(jié)點(diǎn)即可完成分配,即變?yōu)榫G色。
但是當(dāng)節(jié)點(diǎn)數(shù)超過副本數(shù)+1的時(shí)候,就有可能出現(xiàn)數(shù)據(jù)丟失的風(fēng)險(xiǎn)如下圖

這種情況雖然健康值為綠色,但是當(dāng)中兩個(gè)節(jié)點(diǎn)宕機(jī)的極端情況下,會(huì)出現(xiàn)數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
可以通過elasticsearch-kopf插件進(jìn)行修改副本分片數(shù)達(dá)到所有節(jié)點(diǎn)分片數(shù)一致。

修改number_of_replicas

修改后

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


"number_of_replicas":"4",? 對應(yīng)副本分片數(shù)(可更改)
"number_of_shards":"4" 對應(yīng)主分片數(shù)(索引創(chuàng)建就無法更改)
分布式多集群進(jìn)階
在上文es的配置中,所有節(jié)點(diǎn)均為數(shù)據(jù)節(jié)點(diǎn),也可以是主節(jié)點(diǎn),當(dāng)主節(jié)點(diǎn)宕機(jī)時(shí),其余的節(jié)點(diǎn)會(huì)自動(dòng)選舉出新的主節(jié)點(diǎn),但在實(shí)際的項(xiàng)目中,這種方式并不推薦使用,這表示這個(gè)節(jié)點(diǎn)即有成為主節(jié)點(diǎn)的資格,又存儲數(shù)據(jù),這個(gè)時(shí)候如果某個(gè)節(jié)點(diǎn)被選舉成為了真正的主節(jié)點(diǎn),那么他還要存儲數(shù)據(jù),這樣對于這個(gè)節(jié)點(diǎn)的壓力就比較大了。elasticsearch默認(rèn)每個(gè)節(jié)點(diǎn)都是這樣的配置,在測試環(huán)境下這樣做沒問題。實(shí)際工作中建議不要這樣設(shè)置,這樣相當(dāng)于主節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)的角色混合到一塊了。
如何配置多集群中的節(jié)點(diǎn),實(shí)現(xiàn)負(fù)載均衡,可以參考elasticsearch負(fù)載均衡節(jié)點(diǎn)。
部分文獻(xiàn)出處