前言
儲備知識ing,很久之前寫的。
MySQL集羣
MySQL官方提供的是mysql-proxy方案,主要解決了高併發的問題,但是沒有解決高可用的問題。一般項目都是讀多寫少。讀的操作讓mysql-slave去處理,寫的操作讓mysql-master去處理,這減少對主庫的訪問壓力。高可用問題體現在mysql-proxy宕了和單點故障(如果我mysql-master出現了故障,那一切不就GG了)方面。
什麼是分庫分表
把原本存儲於一個庫的數據分塊存儲到多個庫上,把原本存儲於一個表的數據分塊存儲到多個表上。
爲什麼要分庫分表
數據庫中的數據量不一定是可控的,在未進行分庫分表的情況下,隨着時間和業務的發展,庫中的表會越來越多,表中的數據量也會越來越大,對應着,CRUD的數據操作開銷也會越來越大。服務器的資源(CPU、磁盤、內存、IO等)是有限的,最終數據庫所能承載的數據量、數據處理能力將會遭遇瓶頸。
分庫分表的種類
垂直分割:將一個屬性比較多、行的數據比較大的表、把這個表的不同屬性進行拆分成不同表。因此來降低單庫(表)大小的目的來提高性能。
- 每個庫(表)的結構都不一樣。
- 每個庫(表)的數據至少有一列是一樣的。
- 每個庫(表)的並集是全量數據。
水平分割:以某個字段按照一定的規律(取模)將數據分割到多個庫(表)中。
- 每個庫(表)的結構都是一樣。
- 每個庫(表)的數據都不一樣。
- 每個庫(表)的並集是全量數據。
分庫策略
Hash取模,通過表的一列字段進行hash取code%1024.
Range範圍取模,比如2016年的數據放到A庫,2017年的數據放到B庫。
List預定義
分庫分表存在的問題
多數據源的管理
跨庫事務的處理(伸縮性差)
查詢數據結果的結果集合並
分佈式全局唯一的id