1. 程式人生 > >關系數據庫集群

關系數據庫集群

數據庫集群 分庫 但是 性能 好的 數據一致性 邏輯 性能優化 開啟

背景

當站點的規模不斷膨脹,這給數據庫帶來巨大的查詢壓力,單單數據庫性能優化已經是不夠的,需對數據庫進行伸縮擴展。有三種方式:

1、數據庫主從

2、數據表分庫(垂直分區)

3、數據分區(水平分區)

PS:事實上,很多大規模的站點基本上經歷了從簡單主從復制到垂直分區,再到水平分區的步驟。

數據庫主從

幾乎所有主流關系數據庫都支持數據復制功能,可將主服務器數據復制到從服務器,這個功能可以對數據庫進行簡單擴展。在主從基礎上,采用讀寫分離的方法將應用程序中對數據庫的寫操作指向主服務器(保證數據一致性),而將讀操作指向從服務器。

為何有用?

大多數站點的數據庫讀操作要比寫操作更密集,而且查詢條件相對復雜,數據庫能力大部分消耗在查詢上。通過將大量讀操作剝離出來,轉移到更多的從服務器上實現水平擴展,是非常簡單有效的。

MySQL為例

技術分享圖片

MySQL主從配置簡單,只需做兩點:

1、開啟主服務器上的二進制日誌(log-bin)。

2、在主服務器和從服務器上分別進行簡單的配置和授權。

分發讀操作方式:

應用程序本身不擅長分散讀操作到多臺從服務器上,可使用數據庫反向代理來分發。MySQL可使用MySQL Proxy。

數據表分庫(垂直分區)

對於某些寫操作更加頻繁的站點,主從方式的主服務器還是會成為瓶頸,從服務器的擴展並沒帶來好的效益。這時可以根據業務分割,將不同業務數據表部署在不同的數據庫集群上,這就是數據表分庫,也叫垂直分區。

制約

這種方式有個制約,跨庫的表不能進行join操作,原本簡單聯合語句就能完成的,分庫後需要一步步查詢信息。但是,分庫後的查詢方式會更加容易保持相對穩定的開銷。

例子,淘寶的用戶和商品信息,將這兩個數據表拆分成兩個數據庫。

數據分區(水平分區)

當數據表分庫後,某一業務數據庫(已經是很精細的業務)還是無法承受寫操作壓力時。這時可以考慮數據分區,將同一數據表中的數據通過特定算法進行分離,分別保存在不同數據表中,從而可以部署在不同的數據庫服務器上。

PS:數據分區並不依賴特定的技術,更多是一種邏輯層面劃分。

例子,Facebook的用戶表,可以根據user_id的奇偶性將用戶劃分為兩部分,分別存儲到不同數據庫服務器上。

參考文獻

1、《構建高性能Web站點》

2、《大型網站技術架構》

關系數據庫集群