不同的技術(shù)所說的“分片”可能并不是指的同樣的東西,比如跟Oracle技術(shù)人員說“分片”,跟MongoDB技術(shù)人員說的“分片”就是兩個不同的東西。我僅從MongoDB技術(shù)的角度做如下解釋,注意這些內(nèi)容對于其他技術(shù)不一定適用。所謂分片,是把一份完整的數(shù)據(jù)按一定的條件劃分成不同的幾份,由不同的服務(wù)器來存儲劃分之后的內(nèi)容,每份內(nèi)容就叫做一個片。這個劃分條件在MongoDB中叫做片鍵。對于外界來說,顯然不希望知道數(shù)據(jù)是從哪里來,分了多少片,因為對于應(yīng)用來說,需要看到的是完整的一份數(shù)據(jù),而不希望自己的業(yè)務(wù)邏輯中摻雜了”去哪里取這份數(shù)據(jù)”這樣與業(yè)務(wù)無關(guān)的問題。所以在分片的同時,MongoDB提供了mongos作為對外接口,使得數(shù)據(jù)在物理上分開存儲和處理,在邏輯上還是完整的一份。有了分片將數(shù)據(jù)分布在不同的物理設(shè)備上,就引入了更多的設(shè)備為同一份數(shù)據(jù)服務(wù)。無論機(jī)率如何,每臺設(shè)備都有一定的機(jī)會出現(xiàn)故障。假設(shè)每臺機(jī)器出現(xiàn)故障的機(jī)會x%是一樣的,隨機(jī)參與服務(wù)的機(jī)器數(shù)量增多,整個集群出現(xiàn)故障的機(jī)會就會隨著參與服務(wù)的設(shè)備數(shù)量n增加而增加,所以對于集群整體而言,出現(xiàn)故障的機(jī)率就是x%*n。也就是說,集群中的任何一個設(shè)備出現(xiàn)故障,整個集群就處于不健康的狀態(tài)從而影響對外界的服務(wù)。這就是我們常說的在分布式環(huán)境下故障是常態(tài)為了解決這個問題就需要冗余,也就是這里所說的副本。它的目的在于,當(dāng)集群中的一臺設(shè)備出現(xiàn)問題的時候,會有一臺跟他持有相同數(shù)據(jù)設(shè)備馬上代替它的位置對外界提供服務(wù),從而從外界看起來整個集群仍然是健康的。當(dāng)然副本的存在同時也提供了一個額外的用處,就是讀寫分離。但是要記住讀寫分離只是副本的“副業(yè)”,它的“主業(yè)”是提供高可用。解釋到這里你應(yīng)該已經(jīng)了解分片和副本各自的用處了,那么先有誰再有誰的問題能夠理解了嗎?不妨自己嘗試分析一下。