轉:淺談高性能數據庫集羣: 分庫分表

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等),根據具體操做作不一樣的處理。

相關文章
相關標籤/搜索