天天看點

MySQL的分庫分表1分庫分表的幾種形式2分片前的準備

1分庫分表的幾種形式

把一個執行個體中的多個資料庫拆分到不同的執行個體

MySQL的分庫分表1分庫分表的幾種形式2分片前的準備

一後有的節點還是無法負擔寫負載

把一個庫中的表分離到不同的資料庫中

MySQL的分庫分表1分庫分表的幾種形式2分片前的準備

終極大招水準拆分!即分片處理(通常所說的分庫分表即此)

不同于MySQL的分區表是在同一個節點中的同一個資料庫建立的

而分片後通常是存在不同的實體節點上

由于技術難度極高,難以維護,情非得已,謹慎操作

2分片前的準備

對一個庫中的相關表進行水準拆分到不同執行個體的資料庫中

MySQL的分庫分表1分庫分表的幾種形式2分片前的準備

選擇分區鍵

  • 盡量避免跨分區查詢的發生(無法完全避免)
  • 盡量使各個分片中的資料平均

存儲無需分片的表

  • 每個分片中存儲一份相同的資料

    對于資料量不大且并不經常被更新的字典類表,經常需要和分區表一起關聯查詢,每個分片中存儲一份備援的資料可以更好提高查詢效率,維護其一緻性就很重要了

  • 使用額外的節點統一儲存

    沒有備援問題,但是查詢效率較差,需要彙總

在節點上部署分片

  • 每個分片使用單一資料庫,并且資料庫名也相同

    結構也保持相同,和單一節點時的一緻

  • 将多個分片表存儲在一個資料庫中,并在表名上加入分片号字尾
  • 在一個節點中部署多個資料庫,每個資料庫包含一個切片

配置設定分片中的資料

期望盡量平均配置設定

  • 按分區鍵的Hash值取模來配置設定分片資料

    可以相對平均的配置設定資料,但是難以人為控制江蘇資料配置設定到哪個分片中

  • 按分區鍵的範圍來配置設定分片資料

    常用于分區鍵為日期或數值類型,可以清楚知道資料被配置設定到哪個分片中,但易産生配置設定不均及通路量不均

  • 利用分區鍵和分片的映射表來配置設定分片資料

    前面兩種都無人發靈活地控制哪些資料存儲在哪些分片中于是有此法

    可使用緩存方式讀寫 映射表,防止成為資料庫瓶頸

生成全局唯一ID

  • 使用

    auto_increment_increment

    auto_increment_offset

    伺服器變量讓MySQL以期望的值和偏移量來增加

    auto_increment

    列的值

    方法簡單,不依賴于某節點,比較普遍采用但需要非常仔細的配置伺服器,不适用于一個節點包含多個分區表情況

  • 使用全局節點來生成ID

    在一個全局資料庫節點中建立一個包含

    auto_increment

    列的表,APP通過該表生成唯一數字,但該表易成為系統瓶頸
  • 在Redis等緩存nosql伺服器中建立全局ID

    避免了MySQL性能低的問題