1、爲何要設計成分佈式數據庫,數據爲何要分區?html
當數據量很大的時候,即便服務器在沒有任何壓力的狀況下,某些複雜的查詢操做都會很是緩慢,影響了最終用戶的體驗。數據庫
在大數據量下對數據庫的裝載與導出,備份與恢復,結構的調整,索引的調整等都會讓數據庫中止服務或者高負荷運轉很長時間,影響了數據庫的可用性和可管理性。緩存
這個時候靠提高服務器的硬件配置是起不到做用的,只有靠分區把數據分紅更小的部分才能提升數據庫的可用性和可管理性。服務器
經過分區把各部分數據放到不一樣的機器中,每次查詢能夠由多個機器上的CPU,I/O來共同負載,經過各節點並行處理數據來提升性能。架構
分區的方法負載均衡
Moebius for SQL Server支持兩種分區方式:Hash分區和線性分區。分佈式
Hash分區性能
Hash分區是將表按某一字段的值均勻地分佈到若干個指定的分區中。測試
優勢:每一個分區內分配的數據比較平均,承載的壓力也就比較平均,機器可以比較充分的利用。大數據
缺點:不容易擴展,若是擴展新的分區會涉及到數據的從新分配,所以上在設計的時候要提早的規劃好。
Moebius for SQL Server支持把多個分區數據放在一個機器上而後再根據壓力逐個的拆到新機器中去,這樣既能夠保證了分區的規劃又不浪費機器,實現了線性擴展;
線性分區
線性分區也稱範圍分區,將表按某一字段的取值範圍進行分區,好比按照時間每月的數據在一個分區中。
優勢:擴展性能比較好,由於數據的增加是有必定規律的。
缺點:每一個分區內的數據或者壓力不是很平均,大部分的業務可能都是越老的數據被訪問的頻率越低,這樣老的分區的壓力就比新分區承載的壓力低,從而使機器的利用率不高。
Moebius for SQL Server支持把多個分區數據放在一個機器上,因此能夠經過新老分區的交替使用來提升機器的利用率。
當前SQl Server上出現的一些將數據庫拆分的技術
分區表
SQL Server 2005引入的分區表技術,讓用戶可以把數據分散存放到不一樣的物理磁盤中,提升這些磁盤的並行處理能力,達到優化查詢性能的目的。可是分區表只能把數據分 散到同一機器的不一樣磁盤中,也就是仍是依賴於一個機器,不能從根本上解決問題。理想的解決辦法是把數據分散到不一樣的機器中,經過多個機器上的 CPU,I/O的並行處理來提升性能。
分佈式分區視圖
分佈式分區視圖容許用戶將大型表中的數據分散到不一樣機器的數據庫上,用戶不須要知道直接訪問哪一個基礎表而是經過視圖訪問數據,在開發上有必定的透明性。但 是並無簡化分區數據集的管理、設計。用戶使用分區視圖時,必須單首創建、管理每一個基礎表(在其中定義視圖的表),並且必須單獨爲每一個表管理數據完整性約 束,管理工做變得很是複雜。並且還有一些限制,好比不能使用自增列,不能有大數據對象。另外通過實際測試,對於符合分區規則的查詢性能還能夠,對於全局查 詢並不像咱們預期的那樣,是並行計算,有時還不如不分區的響應快。
庫表散列
一些大公司也在本身開發基於庫表散列的數據庫架構,好比My Space通過數次數據庫升級,最終採用按照用戶進行的庫表散列,微軟爲MSN/Hotmail和納斯達克開發的數據依賴型路由(Data-Dependent Routing,DDR)。可是這些都是基於本身業務邏輯進行的,沒有一個通用的實現。客戶在實際應用中要投入很大的研發成本,面臨很大的風險。
Moebius for SQL Server分佈式網格集羣
Moebius for SQL Server 在結構上分爲數據層數據庫和訪問層數據庫兩部分。
從圖中能夠看出,下面的像網格同樣的機器叫數據層,數據層中每一個機器上存儲着數據全集的一個分區,每一橫行組成一個數據全集,每一縱列是某個分區的多份相同的數據。目的是達到查詢時負載均衡的效果,同時也是高可用性的保障:某個列的機器出現問題後其餘的機器會負載訪問。
這 樣一個查詢要查詢幾個機器才能獲得結果,一個插入語句可能要同時影響幾個機器上的數據。爲了避免讓這樣一個複雜的結構暴露給應用程序和開發人員,在數據層上 面又放了一層機器叫中間層也叫訪問層,訪問層機器負責維護各個機器關係的配置信息,處理SQL語句,根據SQL語句的類型和條件來決定由哪些機器來提供服 務,緩存數據等工做。
Moebius for SQL Server分佈式網格集羣工做原理
如下從DML語法的角度介紹一下中間件的工做方式
當中間層接到一個INSERT語句後,經過分析SQL語句獲得要插入的表, 這個表的分區列,再根據分區列的值決定應該這條數據插入到第幾個分區的數據中去,再從配置信息中獲得這個分區列中有多少可用的機器,而後插入數據。
當 中間層接受到一個查詢語句後,首先分析該語句要查找的表,根據要查找的表和語句的WHERE條件計算出要從某一個分區中取數據仍是幾個分區列中去取數據, 取完數據後在中間層合併後再返回給應用程序。要說的是每一個分區列能夠有多份相同的數據,每一個查詢從每列可用的機器上隨機找出一個數據庫進行查找。從而達到 查詢的負載均衡,即提升了查詢的性能,又保障了整個系統的可靠性。如圖所示,全局查詢和局部查詢。