讀寫分離 & 快取 & 水平切分
1、什麼是讀寫分離
讀寫分離
其實就是將資料庫分為了主從庫,一個主庫用於寫資料,多個從庫完成讀資料的操作,主從庫之間通過某種機制進行資料的同步,是一種常見的資料庫架構。
-
主庫:提供寫服務的資料庫。
-
從庫:提供讀服務的資料庫。
-
主從之間:通過某種機制同步資料,比如
MySQL
的binlog
。 -
分組:一組從同步叢集。
2、分組架構解決的問題
大多數網際網路業務,往往讀多寫少,這時候,資料庫的讀會首先稱為資料庫的瓶頸,這時,如果我們希望能夠線性的提升資料庫的讀效能,消除讀寫鎖衝突從而提升資料庫的寫效能,那麼就可以使用分組架構
(即讀寫分離架構
)。用一句話概括,讀寫分離是用來解決資料庫的讀效能瓶頸的,在資料庫無法勝任當前的讀要求時,就可以進行讀寫分寫,通過增加從庫線性提升系統讀效能。
3、讀寫分離的不適用性
在網際網路的應用場景中,常常資料量大、併發量高、高可用要求高、一致性要求高,如果使用讀寫分離
,就需要注意這些問題:
-
資料庫連線池要進行區分,哪些是讀連線池,哪個是寫連線池,研發的難度會增加。
-
為了保證高可用,讀連線池要能夠實現故障自動轉移。
-
潛在主從一致性問題。
二、快取
快取,也是網際網路中常常使用到的一種架構方式,同讀寫分離
不同,讀寫分離
是通過多個讀庫,分攤了資料庫讀的壓力,而儲存則是通過快取
的使用,減少了資料庫讀的壓力。他們沒有誰替代誰的說法,但是,如果在快取
和讀寫分離
之間進行二選一時,還是應該首先考慮快取
。
快取的應用場景:
-
如果面臨的是
讀效能瓶頸
-
-
對於雲上的架構,主庫提供高可用服務,從庫不提供高可用服務。
這幾類場景就建議使用快取架構來加強系統讀效能,代替資料庫主從分離架構。當然快取架構的潛在問題:如果快取掛了,流量全部壓到資料庫上,資料庫會雪崩;同樣快取會有快取穿透、快取一致、快取雪崩、快取併發等問題。
三、水平切分
1、水平切分概念
水平切分,也是一種常見的資料庫架構,一般來說:
-
每個資料庫之間沒有資料重合,沒有類似
binlog
同步的關聯。 -
所有資料並集,組成全部資料。
-
會用某些演算法,來完成資料分割,例如取模運算。
一個水平切分急群眾的每個資料庫,通常稱為一個分片。
2、水平切分解決的問題
大部分的網際網路業務,資料量都非常大,單庫容量最容易成為瓶頸,當單庫的容量成為了瓶頸,我們希望提高資料庫的寫效能,降低單庫容量的話,就可以採用水平切分了。
四、小結
-
讀寫分離,解決
資料庫讀效能瓶頸
問題; -
水平切分,解決
資料庫資料量大
問題; -
對於大資料量、高併發量、高可用要求、高一致性的網際網路業務,微服務快取架構,可能比讀寫分離架構更加合適。