前言
前面介紹了ES的插件安裝嵌言,ELK的準(zhǔn)備工作就已經(jīng)做完了,現(xiàn)在開始學(xué)習(xí)搭建ES集群及穗〈蒈睿看了網(wǎng)上的大神總結(jié)出來(lái)的經(jīng)驗(yàn),自己也開始照葫蘆畫瓢埂陆,咿咿呀呀學(xué)起來(lái)苛白。不多說(shuō)往下看。
簡(jiǎn)介
elasticsearch用于構(gòu)建高可用和可擴(kuò)展的系統(tǒng)焚虱。擴(kuò)展的方式可以是購(gòu)買更好的服務(wù)器(縱向擴(kuò)展)或者購(gòu)買更多的服務(wù)器(橫向擴(kuò)展),Elasticsearch能從更強(qiáng)大的硬件中獲得更好的性能购裙,但是縱向擴(kuò)展也有一定的局限性。真正的擴(kuò)展應(yīng)該是橫向的鹃栽,它通過增加節(jié)點(diǎn)來(lái)傳播負(fù)載和增加可靠性躏率。對(duì)于大多數(shù)數(shù)據(jù)庫(kù)而言,橫向擴(kuò)展意味著你的程序?qū)⒆龇浅4蟮母膭?dòng)來(lái)利用這些新添加的設(shè)備民鼓。對(duì)比來(lái)說(shuō)禾锤,Elasticsearch天生是分布式的:它知道如何管理節(jié)點(diǎn)來(lái)提供高擴(kuò)展和高可用。這意味著你的程序不需要關(guān)心這些摹察。對(duì)于大多數(shù)數(shù)據(jù)庫(kù)而言,橫向擴(kuò)展意味著你的程序?qū)⒆龇浅4蟮母膭?dòng)來(lái)利用這些新添加的設(shè)備倡鲸。對(duì)比來(lái)說(shuō)供嚎,Elasticsearch天生是分布式的:它知道如何管理節(jié)點(diǎn)來(lái)提供高擴(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),它用來(lái)管理集群中的一些變更着帽,例如新建或刪除索引、增加或移除節(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ā)請(qǐng)求到我們需要數(shù)據(jù)所在的節(jié)點(diǎn)上予借。我們通信的節(jié)點(diǎn)負(fù)責(zé)收集各節(jié)點(diǎn)返回的數(shù)據(jù),最后一起返回給客戶端。這一切都由Elasticsearch透明的管理灵迫。
分片與副本分片
分片用于Elasticsearch在你的集群中分配數(shù)據(jù)秦叛。想象把分片當(dāng)作數(shù)據(jù)的容器。文檔存儲(chǔ)在分片中瀑粥,然后分片分配給你集群中的節(jié)點(diǎn)上挣跋。
當(dāng)你的集群擴(kuò)容或縮小,Elasticsearch將會(huì)自動(dòng)在你的節(jié)點(diǎn)間遷移分片利凑,以使集群保持平衡浆劲。
一個(gè)分片(shard)是一個(gè)最小級(jí)別的“工作單元(worker unit)”,它只是保存索引中所有數(shù)據(jù)的一小片.我們的文檔存儲(chǔ)和被索引在分片中,但是我們的程序不知道如何直接與它們通信哀澈。取而代之的是牌借,他們直接與索引通信.Elasticsearch中的分片分為主分片和副本分片,復(fù)制分片只是主分片的一個(gè)副本,它用于提供數(shù)據(jù)的冗余副本割按,在硬件故障之后提供數(shù)據(jù)保護(hù)膨报,同時(shí)服務(wù)于像搜索和檢索等只讀請(qǐng)求,主分片的數(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ù)量在未來(lái)改變了,所有先前的路由值就失效了万俗,文檔也就永遠(yuǎn)找不到了湾笛。
所有的文檔API(get、index闰歪、delete嚎研、bulk、update库倘、mget)都接收一個(gè)routing參數(shù)临扮,它用來(lái)自定義文檔到分片的映射。自定義路由值可以確保所有相關(guān)文檔.比如用戶的文章,按照用戶賬號(hào)路由,就可以實(shí)現(xiàn)屬于同一用戶的文檔被保存在同一分片上教翩。
2)分片和副本交互:
新建公条、索引和刪除請(qǐng)求都是寫(write)操作,它們必須在主分片上成功完成才能復(fù)制到相關(guān)的復(fù)制分片上,下面我們羅列在主分片和復(fù)制分片上成功新建迂曲、索引或刪除一個(gè)文檔必要的順序步驟:
1靶橱、客戶端給Node 1發(fā)送新建、索引或刪除請(qǐng)求。
2关霸、節(jié)點(diǎn)使用文檔的_id確定文檔屬于分片0传黄。它轉(zhuǎn)發(fā)請(qǐng)求到Node 3,分片0位于這個(gè)節(jié)點(diǎn)上队寇。
3膘掰、Node 3在主分片上執(zhí)行請(qǐng)求,如果成功佳遣,它轉(zhuǎn)發(fā)請(qǐng)求到相應(yīng)的位于Node 1和Node 2的復(fù)制節(jié)點(diǎn)上识埋。當(dāng)所有的復(fù)制節(jié)點(diǎn)報(bào)告成功,Node 3報(bào)告成功到請(qǐng)求的節(jié)點(diǎn)零渐,請(qǐng)求的節(jié)點(diǎn)再報(bào)告給客戶端窒舟。
客戶端接收到成功響應(yīng)的時(shí)候,文檔的修改已經(jīng)被應(yīng)用于主分片和所有的復(fù)制分片诵盼。你的修改生效了惠豺。
3)副本分片復(fù)制時(shí)的相關(guān)的參數(shù)說(shuō)明:
replication:
復(fù)制默認(rèn)的值是sync。這將導(dǎo)致主分片得到復(fù)制分片的成功響應(yīng)后才返回风宁,如果你設(shè)置replication為async洁墙,請(qǐng)求在主分片上被執(zhí)行后就會(huì)返回給客戶端。它依舊會(huì)轉(zhuǎn)發(fā)請(qǐng)求給復(fù)制節(jié)點(diǎn)戒财,但你將不知道復(fù)制節(jié)點(diǎn)成功與否热监。
默認(rèn)的sync復(fù)制允許Elasticsearch強(qiáng)制反饋傳輸。async復(fù)制可能會(huì)因?yàn)樵诓坏却渌制途w的情況下發(fā)送過多的請(qǐng)求而使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è)置冈欢,用來(lái)定義復(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è)置將阻止我們?cè)趩我还?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ī)集群配置
這里主要針對(duì)基于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
附:elasticsearch.yml基本配置說(shuō)明
主機(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)存儲(chǔ)數(shù)據(jù)(默認(rèn)允許)
network.host: 0.0.0.0? ? #允許其他機(jī)子訪問
path.data: /home/parallels/Desktop/data/elk/data? #存儲(chǔ)數(shù)據(jù)路徑
path.logs: /home/parallels/Desktop/data/elk/logs? #存放數(shù)據(jù)日志
http.port: 9200 #端口號(hào)
discovery.zen.ping.unicast.hosts: ["es-node1", "es-node2"]? #設(shè)置集群中master節(jié)點(diǎn)的初始列表,可以通過這些節(jié)點(diǎn)來(lái)自動(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)存儲(chǔ)數(shù)據(jù)(默認(rèn)允許)
network.host: 0.0.0.0? ? #允許其他機(jī)子訪問
path.data: /home/parallels/Desktop/data/elk/data? #存儲(chǔ)數(shù)據(jù)路徑
path.logs: /home/parallels/Desktop/data/elk/logs? #存放數(shù)據(jù)日志
http.port: 9200 #端口號(hào)
discovery.zen.ping.unicast.hosts: [“本機(jī)ip地址”, “主機(jī)ip地址”]? #設(shè)置集群中master節(jié)點(diǎn)的初始列表胎挎,可以通過這些節(jié)點(diǎn)來(lái)自動(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ù)來(lái)創(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文件悬而,對(duì)output到es的數(shù)據(jù)格式進(jìn)行自定義。通過新建json配置文件來(lái)對(duì)索引格式自定義锭汛。
"number_of_replicas":"4",? 對(duì)應(yīng)副本分片數(shù)(可更改)
"number_of_shards":"4" 對(duì)應(yīng)主分片數(shù)(索引創(chuàng)建就無(wú)法更改)
分布式多集群進(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)的資格左电,又存儲(chǔ)數(shù)據(jù),這個(gè)時(shí)候如果某個(gè)節(jié)點(diǎn)被選舉成為了真正的主節(jié)點(diǎn)页响,那么他還要存儲(chǔ)數(shù)據(jù)篓足,這樣對(duì)于這個(gè)節(jié)點(diǎn)的壓力就比較大了。elasticsearch默認(rèn)每個(gè)節(jié)點(diǎn)都是這樣的配置闰蚕,在測(cè)試環(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)出處