1. 程式人生 > >資料訪問層:分庫分表與讀寫分離

資料訪問層:分庫分表與讀寫分離

分庫分表

  • 垂直切分
    把資料庫中不同的業務資料拆分到不同的資料庫中。
  • 水平切分
    把同一張表中的資料拆分到兩個資料庫中。

  • 固定雜湊
    規則簡單,但是擴容時不方便,涉及大量的資料遷移。

  • 一致性雜湊

讀寫分離

讀寫分離的目的是分擔主庫讀的壓力(對於資料量大並不起作用),但這裡存在一個數據複製的問題。
這裡有幾種解決方案:
基於資料庫的日誌進行分庫分表。
對資料做平滑遷移!

很多資料庫中介軟體都會提供讀寫分離、負載均衡、安全認證、連線池等功能。這裡以百度的DBproxy中讀寫分離為例簡單介紹:
DBproxy為應用提供讀寫分離服務,讀請求走從庫,寫請求走主庫。
判斷讀寫請求的方法如下:以select、show、use、explain、desc、set(不包括set auto_commit=0)等開頭的,確定不會修改資料的sql,判斷為讀請求。
非讀請求的sql均判斷為寫請求,包括事務。
讀寫分離的具體策略

:

  1. 基本原則是讀請求傳送到從庫,寫請求傳送到主庫。
  2. 為了避免主從延遲帶來的讀不到剛剛更新的資料的問題,同一會話中,寫請求結束後指定時間內的讀請求也發到主庫,此時間可配,由write_time_interval引數指定。如果此時間內沒有新的寫請求,則會話回到從庫。
  3. 事務內的sql不進行讀寫分離,全部發到主庫。
  4. DBProxy會快取影響會話狀態的sql命令,當同一個客戶端會話對應的mysql切換時,會在切換後的mysql上回放這些快取的sql命令,以保證客戶端會話的一致性。影響會話狀態的sql包括use命令和set命令。