【分佈式架構之旅-理論篇】數據庫分庫分表

前言

儲備知識ing,很久之前寫的。

MySQL集羣

MySQL官方提供的是mysql-proxy方案,主要解決了高併發的問題,但是沒有解決高可用的問題。一般項目都是讀多寫少。讀的操作讓mysql-slave去處理,寫的操作讓mysql-master去處理,這減少對主庫的訪問壓力。高可用問題體現在mysql-proxy宕了和單點故障(如果我mysql-master出現了故障,那一切不就GG了)方面。

mysql-proxy.png

什麼是分庫分表

把原本存儲於一個庫的數據分塊存儲到多個庫上,把原本存儲於一個表的數據分塊存儲到多個表上。

爲什麼要分庫分表

數據庫中的數據量不一定是可控的,在未進行分庫分表的情況下,隨着時間和業務的發展,庫中的表會越來越多,表中的數據量也會越來越大,對應着,CRUD的數據操作開銷也會越來越大。服務器的資源(CPU、磁盤、內存、IO等)是有限的,最終數據庫所能承載的數據量、數據處理能力將會遭遇瓶頸。

分庫分表的種類

  • 垂直分割:將一個屬性比較多、行的數據比較大的表、把這個表的不同屬性進行拆分成不同表。因此來降低單庫(表)大小的目的來提高性能。

    • 每個庫(表)的結構都不一樣。
    • 每個庫(表)的數據至少有一列是一樣的。
    • 每個庫(表)的並集是全量數據。
  • 水平分割:以某個字段按照一定的規律(取模)將數據分割到多個庫(表)中。

    • 每個庫(表)的結構都是一樣。
    • 每個庫(表)的數據都不一樣。
    • 每個庫(表)的並集是全量數據。

分庫策略

  • Hash取模,通過表的一列字段進行hash取code%1024.

    • Range範圍取模,比如2016年的數據放到A庫,2017年的數據放到B庫。

    • List預定義

分庫分表存在的問題

  • 多數據源的管理

  • 跨庫事務的處理(伸縮性差)

  • 查詢數據結果的結果集合並

  • 分佈式全局唯一的id

發佈了62 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章