讀寫分離
一主多從,主從同步,讀寫分離,互聯網大部分業務讀多寫少,一般讀會先成爲性能瓶頸。讀寫分離解決讀寫高併發問題,有以下特點:
- 簡單易操作
- 線性提升讀性能
- 消除讀寫鎖提升寫性能
- 冗餘從庫實現讀高可用,寫依舊單點
水平切分
水平切分是爲了解決併發量高、數據量大的問題,具體方案是分庫或分表,建議分庫:
- 分表公用一個庫,依然是一個數據庫文件,存在IO競爭
- 分庫可遷移到不同的實例,性能更高,擴展性更好
水平切分解決數據量大的問題,一般按主鍵id的範圍或Hash值切分,有以下特點:
- 多實例結構相同,共同組成全局數據,但互相獨立
- 多實例線性提升寫性能
按範圍切分要求主鍵遞增,各實例間數據量不均、請求不均,優點是擴容簡單,Hash切分則剛好相反,擴容可能導致數據遷移。
水平切分主鍵/非主鍵查詢
水平切分非主鍵訪問,可建立非主鍵到主鍵的二級索引或索引外置,通過二次查詢查找數據,也可不用索引而通過基因法快速定位,參考
跨庫分頁
全局唯一id
水平切分不能用分區表原因:
架構師之路
讀寫分離+水平切分
綜合兩者優點:
- 線性提升讀性能
- 線性提升寫性能
數據庫中間件
目前基本使用基於客戶端的sharding-jdbc或基於中間件服務的sharding-proxy
垂直切分
垂直切分多個實例結構不同,往往通過業務主鍵關聯構成全局數據。垂直切分降低了單庫數據量,進而降低磁盤IO提升吞吐量,一般與業務結合緊密:
- 長度短,訪問頻率高放一起
- 長度長,訪問頻率低放一起
列增加方案
版本號+通用ext列
- 可隨時動態擴展屬性,遷移方便
- ext無法索引
擴展行key-value
- 一行變多行,不方便多列查詢