起因
偶然間發現有人提了這樣一個問題:ES的每個節點是否有每個索引的完整數據?乍一眼看,這個問題還蠻簡單的,但是又有點詭異,說不上是什麼地方詭異。ok話不多說,我們一起來看一下。
過程
我們先看下面這個圖:
從這個圖我發現兩個Node節點 ,5個shard分片,1個replica備份,沒毛病啊,每個節點就是有完整的信息。。。。停!作爲一個吊炸天(low到爆)的程序員,我怎麼可以輕易下結論,我再次畫了一個圖:
ok,這裏是3個node,3個shard,1份replica,發現了嗎,這邊的話每個節點並沒有完整的數據,但是任意兩個節點有完整的數據
即使一臺機器宕機,剩下兩個節點依然可以提供完整的數據,依然滿足高可用。
結論
發現規律了嗎?其實很簡單 如果每個機器上要有完整的數據 ,需要滿足 分片數*節點數的總分片數量,當然,這裏的總分片數量包含了 主分片和副本分片。因此,我們得出一個公式:副本數replica =(shardNum*nodeNum-shardNum)/shardNum。當replica大於此值時,滿足要求。