High Scaling Websites Structure Learning Notes 大型網站架構學習筆記

Database 讀寫分離

當流量又開始暴增時,會發現原本無限制擴充 Server ($$$)的架構會讓資料庫連線的資源不敷使用。

因為而在做資料異動的時候,若有要更新範圍(range)的資料,很容易把資料進行鎖定,進而彼此影響到查詢上面的效能。 在 80/20 法則中,大部份 80% 人都是在看文章比較多(讀取資料:SELECT),只有少部分 20% 的人或意見領袖,才會發表文章表示看法(異動資料:INSERT、UPDATE、DELETE),而在做資料異動的時候很有可能會對資料進行鎖定,進而去影響讀取的速度。若是要異動範圍(range)的資料,很容易把資料進行鎖定,更會影響到彼此查詢上面的效能。

這時候我們就會想要把資料庫做讀寫分離,所以像是 Facebook、部落格之類的媒體,大多會把資料庫做讀寫分離,使用者做異動的行為會去主資料庫(Master)去做寫入的動作,然後從資料庫(Slave)在定期的去同步資料庫的內容,而其他大部份的讀者在讀取資料時,都去讀取從資料庫(Slave)的資料,這樣就不會有因為資料異動而導致資料被鎖定,造成讀取變慢的問題。

而在主從架構中,可以是有很多台從的資料庫(Slave),透過分散式處理可以將不同的連線分配給不同的從資料庫(Slave),讓每一台從的資料庫平均分配差不多的連線量,因為需要處理的連線減少了,進而讓每個查詢都能夠在短時間都能夠回應查詢結果,提高系統的可用度。

資料庫主從架構中,主(Master)資料庫用來做寫入資料異動(INSERT、UPDATE、DELETE)的動作,從(Slave)資料庫用來做讀取(SELECT)的動作。

而若有些很少在查詢的資料,像是 Log 紀錄或是在做 分析的資料,這類的資料從放在可靠性較高的資料庫(MySQL、Postgres、Oracle...etc)中,對於我們來說是比較浪費的,因為他會佔用存取資料庫的資源,這類的資料我們可能可以考慮用一些 NoSQL 的方案去存取這些資料,讓重要的資料存放在可靠性的資料庫就好,提高資料庫的可用性。

參考資料