在Replica set中有Primary和Secondary的概念,那末在Sharding中其實(shí)也有1個(gè)Primary的概念。
任何1個(gè)mongoDB中都有1個(gè)未分區(qū)的整體DB的collection在某1個(gè)Shard中。以下圖。
Collection1在ShardA中有1部份Chunks在ShardB中也有1部份Shards,而在ShardA 中卻有1個(gè)Collection2保存整體的ShardA+ShardB的Collection1的和。
1個(gè)mongos(從app發(fā)出的mongo Shard 的routing的service)啟動(dòng)或重啟的時(shí)候。
當(dāng)1個(gè)Chunck移動(dòng)完了,用最新的metadata更新完config servers的時(shí)候。
當(dāng)要去切分Chunks的時(shí)候。(切分終了后肯定是要寫入最新的metadata)
當(dāng)在Shards之間移動(dòng)Chunks的時(shí)候。(移動(dòng)以后所有的位置變化了,肯定也要寫入最新的metadata)
之前說過Config Servers需要3個(gè)。主要是為了高可用性和高冗余性來進(jìn)行的設(shè)計(jì)。那末當(dāng)這3個(gè)servers的狀態(tài)有變化的時(shí)候,整體Shards的處理也會(huì)隨之產(chǎn)生變化。
當(dāng)1⑵個(gè)Config Server掛掉的時(shí)候,Config Servers的metadata就變成了read-only的狀態(tài),和Replica的Primary掛掉的時(shí)候效果類似,Replica的全部集群如果沒有了Primary全部集群就變成了ReadOnly的狀態(tài),而這里的的ReadOnly指的是metadata的狀態(tài)。你可以繼續(xù)讀寫Shards的數(shù)據(jù),但是由于metadata不能改變了,那末依照上面的什么時(shí)候去寫中寫的那樣,Chunks的切分和移動(dòng)就不會(huì)產(chǎn)生了。
悲催的情況,當(dāng)你的3個(gè)Config Servers都掛掉的話,其實(shí)也沒必要太擔(dān)心。只要你1直不重啟mongos你還是可以繼續(xù)使用這個(gè)Shards的,但是如果你在3個(gè)Config Servers掛掉后,在這3個(gè)Config Servers恢復(fù)之前重啟了mongos那末你的Shards集群也就沒法使用了。從現(xiàn)象上其實(shí)可以看出,這些數(shù)據(jù)應(yīng)當(dāng)是持久化在內(nèi)存中的,1旦重啟內(nèi)存數(shù)據(jù)消失那末也就失效了。
所以沒有metadata的集群是沒法運(yùn)行的。所以metadata的備份和使用就很重要。相對Shards中的大量的實(shí)際data來講,metadata還是很輕便和易于使用的,也就是說metadata相對來講是低載入本錢,而且metadata對集群來講也不是必要(比如上面說的掛了1⑶個(gè)的時(shí)候集群在特定條件下也是可使用的),所以,Config Server的備份還是相對簡單的。
つづく???