主從復(fù)制
主庫同時負(fù)責(zé)讀取和寫入操作缸逃,并復(fù)制寫入到一個或多個從庫中督禽,從庫只負(fù)責(zé)讀操作讲婚。
樹狀形式的從庫再將寫入復(fù)制到更多的從庫中去。如果主庫離線待德,系統(tǒng)可以以只讀模式運(yùn)行君丁,直到某個從庫被提升為主庫或有新的主庫出現(xiàn)。
缺點(diǎn):
- 將從庫提升為主庫需要額外的邏輯将宪。
主主復(fù)制
兩個主庫都負(fù)責(zé)讀操作和寫操作绘闷,寫入操作時互相協(xié)調(diào)橡庞。如果其中一個主庫掛機(jī),系統(tǒng)可以繼續(xù)讀取和寫入印蔗。
缺點(diǎn):
- 你需要添加負(fù)載均衡器或者在應(yīng)用邏輯中做改動扒最,來確定寫入哪一個數(shù)據(jù)庫。
- 多數(shù)主-主系統(tǒng)要么不能保證一致性(違反 ACID)华嘹,要么因?yàn)橥疆a(chǎn)生了寫入延遲吧趣。
- 隨著更多寫入節(jié)點(diǎn)的加入和延遲的提高,如何解決沖突顯得越發(fā)重要耙厚。
主從復(fù)制和主主復(fù)制共同的問題
- 如果主庫在將新寫入的數(shù)據(jù)復(fù)制到其他節(jié)點(diǎn)前掛掉强挫,則有數(shù)據(jù)丟失的可能。
- 副本可能因?yàn)檫^多寫操作阻塞住颜曾,導(dǎo)致讀取功能異常纠拔。
- 讀取從庫越多,需要復(fù)制的寫入數(shù)據(jù)就越多泛豪,導(dǎo)致更嚴(yán)重的復(fù)制延遲。
- 在某些數(shù)據(jù)庫系統(tǒng)中侦鹏,寫入主庫的操作可以用多個線程并行寫入诡曙,但讀取副本只支持單線程順序地寫入。
- 復(fù)制意味著更多的硬件和額外的復(fù)雜度略水。
聯(lián)合
聯(lián)合(或按功能劃分)將數(shù)據(jù)庫按對應(yīng)功能分割价卤。
例如,你可以有三個數(shù)據(jù)庫:論壇渊涝、用戶和產(chǎn)品慎璧,而不僅是一個單體數(shù)據(jù)庫,從而減少每個數(shù)據(jù)庫的讀取和寫入流量跨释,減少復(fù)制延遲胸私。
較小的數(shù)據(jù)庫意味著更多適合放入內(nèi)存的數(shù)據(jù),進(jìn)而意味著更高的緩存命中幾率鳖谈。沒有只能串行寫入的中心化主庫岁疼,你可以并行寫入,提高負(fù)載能力缆娃。
缺點(diǎn):
- 如果你的數(shù)據(jù)庫模式需要大量的功能和數(shù)據(jù)表捷绒,聯(lián)合的效率并不好。
- 你需要更新應(yīng)用程序的邏輯來確定要讀取和寫入哪個數(shù)據(jù)庫贯要。
- 從兩個庫聯(lián)結(jié)數(shù)據(jù)更復(fù)雜暖侨。
- 聯(lián)合需要更多的硬件和額外的復(fù)雜度。
分片
分片將數(shù)據(jù)分配在不同的數(shù)據(jù)庫上崇渗,使得每個數(shù)據(jù)庫僅管理整個數(shù)據(jù)集的一個子集字逗。
以用戶數(shù)據(jù)庫為例函荣,隨著用戶數(shù)量的增加,越來越多的分片會被添加到集群中扳肛。
類似聯(lián)合的優(yōu)點(diǎn)傻挂,分片可以減少讀取和寫入流量,減少復(fù)制并提高緩存命中率挖息。也減少了索引金拒,通常意味著查詢更快,性能更好套腹。如果一個分片出問題绪抛,其他的仍能運(yùn)行,你可以使用某種形式的冗余來防止數(shù)據(jù)丟失电禀。類似聯(lián)合幢码,沒有只能串行寫入的中心化主庫,你可以并行寫入尖飞,提高負(fù)載能力症副。
常見的做法是用戶姓氏的首字母或者用戶的地理位置來分隔用戶表。
缺點(diǎn):
- 你需要修改應(yīng)用程序的邏輯來實(shí)現(xiàn)分片政基,這會帶來復(fù)雜的 SQL 查詢贞铣。
- 分片不合理可能導(dǎo)致數(shù)據(jù)負(fù)載不均衡。例如沮明,被頻繁訪問的用戶數(shù)據(jù)會導(dǎo)致其所在分片的負(fù)載相對其他分片高辕坝。
- 再平衡會引入額外的復(fù)雜度〖鼋。基于一致性哈希的分片算法可以減少這種情況酱畅。
- 聯(lián)結(jié)多個分片的數(shù)據(jù)操作更復(fù)雜。
- 分片需要更多的硬件和額外的復(fù)雜度江场。
非規(guī)范化
非規(guī)范化試圖以寫入性能為代價來換取讀取性能纺酸。在多個表中冗余數(shù)據(jù)副本,以避免高成本的聯(lián)結(jié)操作扛稽。
在多數(shù)系統(tǒng)中吁峻,讀取操作的頻率遠(yuǎn)高于寫入操作,比例可達(dá)到 100:1在张,甚至 1000:1用含。需要復(fù)雜的數(shù)據(jù)庫聯(lián)結(jié)的讀取操作成本非常高,在磁盤操作上消耗了大量時間帮匾。
參見 細(xì)聊冗余表數(shù)據(jù)一致性 學(xué)習(xí)筆記