https://www.toutiao.com/i6573966496777634312/算法
本文主要介紹高性能數據庫集羣分庫分表相關理論,基本架構,涉及的複雜度問題以及常看法決方案。數據庫
把一個數據庫切分紅多個部分放到不一樣的數據庫服務器(server)上,從而緩解單一數據庫的性能問題。緩存
讀寫分離分散數據庫讀寫操做壓力,分庫分表分散存儲壓力服務器
分庫分表是在肯定沒有其餘優化空間以後,才採起的方案;微信
優化順序:架構
相似讀寫分離,分庫分表也是肯定沒有其餘優化空間以後才採起的優化方案。那若是業務真的發展很快豈不是很快要進行分庫分表了?那爲什麼不一開始就設計好呢?性能
按照架構設計的「三原則」(簡單原則,合適原則,演化原則),簡單分析一下:優化
首先,這裏的「若是」事實上發生的機率比較低,作10個業務有一個業務能活下去就很不錯了,更況且快速發展,和中彩票的機率差很少。若是咱們每一個業務上來就按照淘寶、微信的規模去作架構設計,不但會累死本身,還會害死業務。架構設計
其次,若是業務真的發展很快,後面進行分庫分表也不遲。由於業務發展好,相應的資源投入就會加大,能夠投入更多的人和更多的錢,那業務分庫帶來的代碼和業務複雜問題就能夠經過加人來解決,成本問題也能夠經過增長資金來解決。設計
按照業務模塊將數據將數據分散到不一樣的數據庫服務器。
一、join操做
問題:數據庫分散在不一樣的數據庫中,沒法作join查詢。
解決:經過業務代碼進行join查詢,而後結果合併。
二、事務
問題:表分散在不一樣的數據庫中,沒法經過事務統一修改。
解決:經過業務代碼實現。
三、成本
服務器成本、開發成本。
業務分庫示意圖:
將單表切分紅多個不一樣的表。
一、垂直拆分:基於列字段進行拆分,拆分後的表結構不同。
二、水平拆分:基於數據記錄進行拆分,拆分後的表結構同樣。
業務分表示意圖:
帶來的問題
增長表操做的次數
某條數據具體屬於哪一個切分獲得子表,須要增長路由算法進行計算,這個算法會致使必定的複雜性。
解決方案:
一、範圍路由
選取有序的數據做爲路由條件,不一樣分段分散到不一樣的數據表中。
優勢:能夠隨着數據的增長平滑地擴充新的表。
缺點:可能存在數據分佈不均勻。
二、Hash路由
選擇某個列(或者幾個列的組合)的值進行Hash運算,而後根據運算結果分散到不一樣的數據庫表中。
優勢:表數據分佈比較均勻。
缺點:初始表數量很差選取,擴充新的表數據須要從新分佈。
三、配置路由
使用獨立的表(或者配置文件等)記錄路由配置信息。
優勢:使用起來簡單靈活,擴充表時只須要遷移指定的數據,而後修改路由表。
缺點:路由表自己太多影響系統總體性能。
一、join操做
問題:數據分散在不一樣的數據庫中,沒法作join查詢。
解決:經過業務代碼join查詢,而後結果合併。
二、count操做
問題:數據分散在不一樣的數據庫中,沒法作count()操做。
解決:
(1)count相加
在業務代碼或者數據庫中間件對每一個表進行count操做,而後將結果相加。
優勢:實現簡單。
缺點:性能較低。
(2)記錄數表
新建一張表,保存數據記錄的數量,每次插入和刪除子表數據成功後,都更新記錄數表。
優勢:性能較好。
缺點:實現複雜。
三、order by操做
問題:數據分散在不一樣的數據庫中,沒法作order by操做。
解決:業務代碼實現或者中間件查詢每一個子表中的數據,而後彙總進行排序。
實現方法:
相似讀寫分離,具體實現也是「程序代碼封裝」和「中間件封裝」,但具體實現複雜一些,由於還有要判斷SQL中具體操做的表,具體操做(例如count、order by、group by等),根據具體操做作不一樣的處理。