背景 當站點的規模不斷膨脹,這給資料庫帶來巨大的查詢壓力,單單資料庫性能優化已經是不夠的,需對資料庫進行伸縮擴展。有三種方式: 1、資料庫主從 2、數據表分庫(垂直分區) 3、數據分區(水平分區) PS:事實上,很多大規模的站點基本上經歷了從簡單主從複製到垂直分區,再到水平分區的步驟。 資料庫主從 ...
背景
當站點的規模不斷膨脹,這給資料庫帶來巨大的查詢壓力,單單資料庫性能優化已經是不夠的,需對資料庫進行伸縮擴展。有三種方式:
1、資料庫主從
2、數據表分庫(垂直分區)
3、數據分區(水平分區)
PS:事實上,很多大規模的站點基本上經歷了從簡單主從複製到垂直分區,再到水平分區的步驟。
資料庫主從
幾乎所有主流關係資料庫都支持數據複製功能,可將主伺服器數據複製到從伺服器,這個功能可以對資料庫進行簡單擴展。在主從基礎上,採用讀寫分離的方法將應用程式中對資料庫的寫操作指向主伺服器(保證數據一致性),而將讀操作指向從伺服器。
為何有用?
大多數站點的資料庫讀操作要比寫操作更密集,而且查詢條件相對複雜,資料庫能力大部分消耗在查詢上。通過將大量讀操作剝離出來,轉移到更多的從伺服器上實現水平擴展,是非常簡單有效的。
MySQL為例
MySQL主從配置簡單,只需做兩點:
1、開啟主伺服器上的二進位日誌(log-bin)。
2、在主伺服器和從伺服器上分別進行簡單的配置和授權。
分發讀操作方式:
應用程式本身不擅長分散讀操作到多台從伺服器上,可使用資料庫反向代理來分發。MySQL可使用MySQL Proxy。
數據表分庫(垂直分區)
對於某些寫操作更加頻繁的站點,主從方式的主伺服器還是會成為瓶頸,從伺服器的擴展並沒帶來好的效益。這時可以根據業務分割,將不同業務數據表部署在不同的資料庫集群上,這就是數據表分庫,也叫垂直分區。
制約
這種方式有個制約,跨庫的表不能進行join操作,原本簡單聯合語句就能完成的,分庫後需要一步步查詢信息。但是,分庫後的查詢方式會更加容易保持相對穩定的開銷。
例子,淘寶的用戶和商品信息,將這兩個數據表拆分成兩個資料庫。
數據分區(水平分區)
當數據表分庫後,某一業務資料庫(已經是很精細的業務)還是無法承受寫操作壓力時。這時可以考慮數據分區,將同一數據表中的數據通過特定演算法進行分離,分別保存在不同數據表中,從而可以部署在不同的資料庫伺服器上。
PS:數據分區並不依賴特定的技術,更多是一種邏輯層面劃分。
例子,Facebook的用戶表,可以根據user_id的奇偶性將用戶劃分為兩部分,分別存儲到不同資料庫伺服器上。
參考文獻
1、《構建高性能Web站點》
2、《大型網站技術架構》