# Database 讀寫分離
當流量又開始暴增時,會發現原本無限制擴充 Server ($$$)的架構會讓資料庫連線的資源不敷使用。
因為而在做資料異動的時候,若有要更新範圍(range)的資料,很容易把資料進行鎖定,進而彼此影響到查詢上面的效能。在 [80/20 法則](http://wiki.mbalib.com/zh-tw/80/20%E6%B3%95%E5%88%99)中,大部份 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 的方案去存取這些資料,讓重要的資料存放在可靠性的資料庫就好,提高資料庫的可用性。
# 參考資料
- [一步步構建大型網站架構- 架構設計- | 九街| 白開水的博客](http://www.9streets.cn/art-php-489.html)
- [80/20 法則](http://wiki.mbalib.com/zh-tw/80/20%E6%B3%95%E5%88%99)