基礎(chǔ)分布式架構(gòu)
- Elasticsearch對復(fù)雜分布式機(jī)制的透明隱藏特性
- Elasticsearch的垂直擴(kuò)容與水平擴(kuò)容
- 增加或減少節(jié)點(diǎn)時的數(shù)據(jù)rebalance
- master節(jié)點(diǎn)
- 節(jié)點(diǎn)對等的分布式架構(gòu)
Elasticsearch對復(fù)雜分布式機(jī)制的透明隱藏特性
- Elasticsearch是一套分布式的系統(tǒng),分布式是為了應(yīng)對大數(shù)據(jù)量
- 隱藏了復(fù)雜的分布式機(jī)制
- cluster discovery(集群發(fā)現(xiàn)機(jī)制)-----比如當(dāng)前我們啟動了一個es進(jìn)程,當(dāng)啟動了第二個es進(jìn)程時,這個進(jìn)程作為一個node自動就發(fā)現(xiàn)了集群,并且加入了進(jìn)去,還接受了部分?jǐn)?shù)據(jù)(作為replica shard)
- 分片機(jī)制----es自動地將我們創(chuàng)建的document插入的集群中,我們是不用關(guān)心數(shù)據(jù)是按照什么機(jī)制分片的、最后放入到那個shard中
- shard負(fù)載均衡-----比如現(xiàn)在又10shard,集群中有3個節(jié)點(diǎn),es會進(jìn)行均衡的進(jìn)行分配,以保持每個節(jié)點(diǎn)均衡的讀寫負(fù)載請求
Elasticsearch的垂直擴(kuò)容與水平擴(kuò)容
- 垂直擴(kuò)容------用性能更強(qiáng)大的機(jī)器來替換當(dāng)前的機(jī)器
- 水平擴(kuò)容------增加性能一般的機(jī)器作為新的節(jié)點(diǎn)
增減或減少節(jié)點(diǎn)時的數(shù)據(jù)rebalance
我的理解就是當(dāng)增減節(jié)點(diǎn)時,數(shù)據(jù)的重新分配
master節(jié)點(diǎn)
master節(jié)點(diǎn)的主要作用就是管理es的元數(shù)據(jù):
- 創(chuàng)建或刪除索引
- 增加或刪除節(jié)點(diǎn)
節(jié)點(diǎn)平等的分布式架構(gòu)
- 節(jié)點(diǎn)對等,每個節(jié)點(diǎn)都能接收所有的請求----shard節(jié)點(diǎn)和replica節(jié)點(diǎn)都能接受請求
- 自動請求路由----如果請求發(fā)到當(dāng)前節(jié)點(diǎn),但是該節(jié)點(diǎn)沒有該請求需要數(shù)據(jù),那么當(dāng)前節(jié)點(diǎn)會去其他節(jié)點(diǎn)獲取數(shù)據(jù),并返回給此請求
- 響應(yīng)收集
shard&replica機(jī)制
- index包含多個shard
- 每個shard都是一個最小工作單元,承載部分?jǐn)?shù)據(jù);每個shard都是一個lucene實例,有完整的建立索引和處理請求的能力
- 增減節(jié)點(diǎn)時,shard會自動在nodes中負(fù)載均衡
- primary shard和replica shard,每個document肯定只存在于某一個primary shard以及其對應(yīng)的replica shard中,不可能存在于多個primary shard
- replica shard是primary shard的副本,負(fù)責(zé)容錯,以及承擔(dān)讀請求負(fù)載
- primary shard的數(shù)量在創(chuàng)建索引的時候就固定了,replica shard的數(shù)量可以隨時修改
- primary shard的默認(rèn)數(shù)量是5,replica默認(rèn)是1,默認(rèn)有10個shard,5個primary shard,5個replica shard
- primary shard不能和自己的replica shard放在同一個節(jié)點(diǎn)上(否則節(jié)點(diǎn)宕機(jī),primary shard和副本都丟失,起不到容錯的作用),但是可以和其他primary shard的replica shard放在同一個節(jié)點(diǎn)上
單node環(huán)境下創(chuàng)建index情況分析
創(chuàng)建索引前,設(shè)置shard和replica的數(shù)量
PUT /test_index
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
- 單node環(huán)境下,創(chuàng)建一個index,有3個primary shard,3個replica shard
- 集群status是yellow
- 這個時候,只會將3個primary shard分配到僅有的一個node上去,另外3個replica shard是無法分配的(一個shard的副本replica,他們兩個是不能在同一個節(jié)點(diǎn)的)
- 集群可以正常工作,但是一旦出現(xiàn)節(jié)點(diǎn)宕機(jī),數(shù)據(jù)全部丟失,而且集群不可用,無法承接任何請求
圖一------單節(jié)點(diǎn)下,shard分配情況
此時再添加一個節(jié)點(diǎn)的話
- 會把原來沒有分配的replica 給分配到這個新節(jié)點(diǎn)上
- 當(dāng)有請求的話,這個兩個節(jié)點(diǎn)都可以接受請求
圖二-----增加至2個節(jié)點(diǎn)后的分布情況
緊接上面的場景,此時再加入一個節(jié)點(diǎn)話,此時shard和replica是如何分配的
圖三---增加至3個節(jié)點(diǎn)后的情況
- primary&replica自動負(fù)載均衡,6個shard,3 primary,3 replica
- 每個node有更少的shard,IO/CPU/Memory資源給每個shard分配更多,每個shard性能更好
- 擴(kuò)容的極限,6個shard(3 primary,3 replica),最多擴(kuò)容到6臺機(jī)器(每個機(jī)器一個shard/replica),每個shard可以占用單臺服務(wù)器的所有資源,性能最好
- 超出擴(kuò)容極限,動態(tài)修改replica數(shù)量,9個shard(3primary,6 replica),擴(kuò)容到9臺機(jī)器,比3臺機(jī)器時,擁有3倍的讀吞吐量
- 3臺機(jī)器下,9個shard(3 primary,6 replica),資源更少,但是容錯性更好,最多容納2臺機(jī)器宕機(jī),6個shard只能容納1臺機(jī)器宕機(jī)---------只要剩下的節(jié)點(diǎn)中能包含完整的數(shù)據(jù),那么宕機(jī)是不會造成太大影響的
分析9個shard,3個節(jié)點(diǎn)的情況
圖四----3個節(jié)點(diǎn),9個shard分配情況
如圖四,是可以容忍2個節(jié)點(diǎn)宕機(jī)的,因為剩下的那個節(jié)點(diǎn),是包含所有的數(shù)據(jù)的。
宕機(jī)分析
假設(shè)圖四 的第一個節(jié)點(diǎn)為master節(jié)點(diǎn),如果此節(jié)點(diǎn)宕機(jī)
- 集群重新選舉master節(jié)點(diǎn)(假設(shè)為圖四的第二個節(jié)點(diǎn)),且集群的狀態(tài)變換為red
- 新master將replica提升為primary shard(r0提升為shard),集群的狀態(tài)變換為yellow
- 重啟宕機(jī)的節(jié)點(diǎn),master將復(fù)制p0至節(jié)點(diǎn)一為replica,使用原有的shard并同步宕機(jī)后的修改,集群的狀態(tài)變換為green
集群的健康狀況說明(green、yellow、red)
green:每個索引的primary shard和replica shard都是active狀態(tài)的
yellow:每個索引的primary shard都是active狀態(tài)的,但是部分replica shard不是active狀態(tài),處于不可用的狀態(tài)
red:不是所有索引的primary shard都是active狀態(tài)的,部分索引有數(shù)據(jù)丟失了