1. 程式人生 > >資料庫分片(Sharding)技術

資料庫分片(Sharding)技術

      假如您有一個應用程式,隨著業務越來越有起色,系統所牽涉到的資料量也就越來越大,此時您要涉及到對系統進行伸縮(Scale)的問題了。

一種典型的擴充套件方法叫做“向上伸縮(Scale Up)”,它的意思是通過使用更好的硬體來提高系統的效能引數。

而另一種方法則叫做“向外伸縮(Scale Out)”,它是指通過增加額外的硬體(如伺服器)來達到相同的效果。

從“硬體成本”還是“系統極限”的角度來說,“向外伸縮”一般都會優於“向上伸縮”,因此大部分上規模的系統都會在一定程度上考慮“向外”的方式。由於許多系統的瓶頸都處在資料儲存上,因此一種叫做“資料分片(Database Sharding)”的資料架構方式應運而生,本文便會討論這種資料架構方式的一種比較典型的實現方式。

簡介

資料分片,是將整體資料分攤在多個儲存裝置(下文統稱為“資料分割槽”或“分割槽”)上,這樣每個儲存裝置的資料量相對就會小很多,以此滿足系統的效能需求。

    值得注意的是,系統分片的策略有很多,例如常見的有以下幾種:

  (1)根據ID特徵:例如對記錄的ID取模,得到的結果是幾,那麼這條記錄就放在編號為幾的資料分割槽上。

  (2)根據時間範圍:例如前100萬個使用者資料在第1個分割槽中,第二個100萬用戶資料放在第2個分割槽中。

    基於檢索表:根據ID先去一個表內找到它所在的分割槽,然後再去目標分割槽進行查詢。

  在這些資料分片策略之中沒有哪個有絕對的優勢,選擇哪種策略完全是根據系統的業務或是資料特徵來確定的。值得強調的是:資料分片不是銀彈,它對系統的效能和伸縮性(Scalability)帶來一定好處的同時,也會對系統開發帶來許多複雜度。例如,有兩條記錄分別處在不同的伺服器上,那麼如果有一個業務是為它們建立一個“關聯”,那麼很可能表示“關聯”的記錄就必須在兩個分割槽內各放一條。另外,如果您重視資料的完整性,那麼跨資料分割槽的事務又立即變成了效能殺手。最後,如果有一些需要進行全域性查詢的業務,光有資料分片策略也很難對系統性能帶來什麼優勢。

資料分片
 
 在ORACLE 中,【全域性關係】是一個【檢視】,而資料分片是通過關係資料的基本運算實現的,這一點在全域性檢視的定義中體現。


資料分片主要有兩種方式:
(1) 水平分片
  按一定條件將  全域性關係  的所有元組劃分成若干個相交的子集,每個子集為關係的一個片段。
  例如,一個公司下屬兩個子公司,每個子公司建有自己的資料庫,並存放本公司的職員資訊。在總公司的資料庫上建立一個全域性關係,可以看到全公司的全體職員資訊。建立全域性關係emp(檢視)的語句如下:
  CREARTE VIEW emp AS
  (SELECT* FROM [email protected]

D1)
  UNION
  (SELECT *FROM [email protected] D2);
  這樣,全域性關係emp中的元組實際上是分佈在另外兩個不同的資料庫上。

(2) 垂直分片
  把全域性關係的屬性集分成若干子集,形成幾個垂直片段。
  例如,全域性關係emp中,有關職工的人事資訊在資料庫D1上,而職工的業務資訊在資料庫D2上。當然,有些屬性(如職工號這樣的關鍵字屬性)應出現在每個垂直片中。建立全域性關係EMP(檢視)的語句如下:
  CREATTE VIEW emp AS
  SELECRT emp1.eno, emp1.ename, emp2.sal,…
  FROM [email protected], [email protected]
  WHERE emp1.eno=emp2.eno;
  全域性關係實際上是將分佈在不同資料庫中的一個職工記錄的各部分重新連線起來,然後投影出所要的屬性。
實際上,我們可以通過檢視的定義,實現全域性關係資料的多種分佈要求,全域性關係遮蔽了資料的物理分佈,提供了資料分佈的又一個透明性。

--------------------------------------------------------------------------------------------------

“Shard”字面意思為碎片,Sharding可以譯為【分片】

MySQL5以後提供了Sharding的能力,其目的就是為突破單節點資料伺服器I/O能力限制,解決資料庫Scale Out水平擴充套件的問題。通過Sharding可以將資料按照物理位置貼合用戶分佈,得到更加快速的響應;操作龐然大物總是讓人頭疼,Sharding將資料分塊,更小的資料集操作彙總能夠得到更加的體驗;

分片使得資料分攤在各個資料節點,對其操作實現負載均衡! 

 Sharding按【方向】可以分為兩類。 (1)垂直分片:以表為單位,把不同的表分散到不同的資料庫或主機上。特點是規則簡單,實施方便,適合業務之間耦合度低的系統。 (2)水平分片:以行為單位,將同一個表中的資料按照某種條件拆分到不同的資料庫或主機上。特點是相對複雜,適合單表巨大的系統。   Sharding按【模式】可以分為兩大模式。 (1)靜態分片模式,即【分割槽鍵】是靜態分配的,一般使用範圍或雜湊函式,例如深圳團隊放到一個分片,北京團隊放到另外一個分片;或者編號為0096開頭的員工放到一個分片,而0199開頭的員工放到另外一個分片。這種模式雖然實現簡單,但明顯的缺陷便是存在資料不均勻的情況。 (2)動態分片模式,即分割槽函式將從字典中查詢【分割槽鍵】,然後定位具體哪個分片儲存了資料。這種模式比靜態模式更加靈活,但是需要一個集中儲存來存放字典,每次查詢資料都需要執行2次查詢,並且集中儲存本身還可能存在單點故障。 

相關推薦

資料庫分片Sharding技術

      假如您有一個應用程式,隨著業務越來越有起色,系統所牽涉到的資料量也就越來越大,此時您要涉及到對系統進行伸縮(Scale)的問題了。 一種典型的擴充套件方法叫做“向上伸縮(Scale Up)”,它的意思是通過使用更好的硬體來提高系統的效能引數。 而另一種方法則叫做“向外伸縮(Scale O

MongoDB分片sharding/分割槽partitioning介紹

分片簡介   分片是指將資料拆分,將其分散存放在不同的機器上的過程。有時也用分割槽(partitioning)來表示這個概念。   幾乎所有資料庫軟體都能進行手動分片(manual sharding)。應用需要維護與若干不同資料庫伺服器的連線,每個連線還是完全獨立的。應用程

分片技術sharding——區塊鏈擴容問題的良方

任何一個曾經開發過DApp的程式設計師都必須考慮到當前公共區塊鏈的侷限性,其中區塊鏈侷限性的最重要和最明顯的問題就是有限的吞吐量,比如,每秒處理的交易量過少。為了執行一個能夠處理實際吞吐量需求的DApp,區塊鏈就必須具有可擴充套件性。 進行區塊鏈擴容的一個答案就是分片技

分片技術Sharding:化整為零,分而治之

目前的區塊練技術面臨著一個巨大的瓶頸,那就是:如何有效地提升區塊的吞吐量(TPS)。 區塊鏈的擴充套件性一直是大多數公鏈發展過程中難以避開的一塊攔路石,比特幣因之有一段長達三年的擴容之爭,以太坊一度因為一個小小的密碼貓遊戲而長時間擁堵不堪。 目前提出的問題解決思路

MySQL 高可用:mysql+mycat實現資料庫分片分庫分表

什麼是MYCAT: 一個徹底開源的,面向企業應用開發的大資料庫叢集 支援事務、ACID、可以替代MySQL的加強版資料庫 一個可以視為MySQL叢集的企業級資料庫,用來替代昂貴的Oracle叢集 一個融合記憶體快取技術、NoSQL技術、HDFS大資料的新型SQL Se

MySQL資料庫分片分庫分表

分庫分表 將存放在一個數據庫中的資料,按照特定方式進行拆分,分散到多個數據庫中,已達到分散單臺裝置負載的效果 垂直分割(縱向切分) 水平分割(橫向切分) 將單個表,拆分成多個表,分散到不同的資料庫 將單資料庫的多個表進

Mycat之資料庫分片分片列舉-yellowcong

列舉分片,簡單來講,就是根據某個值,決定這條資料放到哪一個庫裡面。我現在有個需求,我有很多使用者,根據地址來放到資料庫,三個資料庫,湖北、北京、上海。實現的步驟:1、建立資料庫,2、配置schema.xml檔案,3、配置server.xml,4、新增rul

資料庫分庫分表sharding(一)——基本思想、拆分策略和拆分所帶來的問題

資料庫分庫分表(sharding)(一)       目的:我覺得學習一項技術,必須知道它的原理,尤其是這項技術的目的所在,為啥要用它!資料庫分庫分表的用處:資料庫中的資料量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,資料庫中的表會越來越多,表中的資料量

MySQL的分片——分散式資料庫概述

系統分析:OLAP or OLTP? 在網際網路時代,海量資料的儲存與訪問成為系統設計與使用的瓶頸問題,對於海量資料處理,按照使用場景,主要分為兩種型別:聯機事務處理(OLTP)和聯機分析處理(OLAP)。   聯機事務處理(OLTP)也稱為面向交易的處理系統,其基本特徵

Mycat之資料庫分片取模分片-yellowcong

取模分片,簡單來講,根據資料庫的主鍵和儲存的節點數進行取模操作,然後根據取模的結果,將資料存放到對應的節點中,取模分表,可以將資料均勻的分配到各個庫中。實現的步驟:1、建立資料庫,2、配置schema.xml檔案,3、配置server.xml,4、新增ru

Python從菜鳥到高手13分片Slicing

方式 ans 表示 獲取元素 nsh 通過 int 值類型 步長 分片操作是從序列A中獲取一個子序列B。序列A可以稱為父序列。從A中獲取B,需要指定B在A中的開始索引和結束索引,因此,分片操作需要指定兩個索引。 ??由於字符串可以看做是字符的序列,所以我們可以用序列的這個分

VB6基本資料庫應用:連線資料庫與SQL語句的Select語句初步

資料庫我們已經建好了,重提一下上一章的結果,我們最後建立了一張Student的表,其中有StudentID(數字的雙精度型別)和StudentName(文字型別。補充一下,2013中有【長文字】和【短文字】,人名不會很長,根據上一章選擇儘量小的資料型別的規則,這裡就選【短文字】就可以了)。儘

***資料庫基礎重點

1.在生活中我們已經可以存放東西的檔案,可是為什麼還需要資料庫呢? 因為檔案存放東西存在一定的隱患: *存放在檔案裡的東西可能不安全; *存放在檔案裡的內容不太方便檢視; *對於大量的資料檔案不便於存放; *在程式中需要用到資料時對檔案不方便訪問; 重點來啦:因為檔案存在這樣的問題,所以有專

資料庫應用金融

近年來,隨著Internet的快速發展,各個行業均已進入資訊化時代,金融業在中國20世紀70年代就已起步;20世紀80年代已經進入推廣應用階段,陸續引進了美國、日本等先進的資訊裝置;90年代各大專業銀行等資訊系統紛紛升級,緊跟國際資訊化腳步,引進國外先進技術,不斷提高自身資訊化水平;到90年

SQL Sever 資料庫視訊 1024節日快樂!

分離資料庫:     其實就是將資料庫從SQL Server 2008的例項中分離出去,但是不會刪除該資料中的檔案和事務日誌檔案,這樣,資料庫就可以再附加到其他的 SQL Server 2008例項上去  (也可以理解成資料庫獨立出去,附加到別的例項上去)

redis叢集與分片1-redis伺服器叢集、客戶端分片 redis叢集與分片1-redis伺服器叢集、客戶端分片

redis叢集與分片(1)-redis伺服器叢集、客戶端分片   下面是來自知乎大神的一段說明,個人覺得非常清晰,就收藏了。 為什麼叢集? 通常,為了提高網站響應速度,總是把熱點資料儲存在記憶體中而不是直接從後端 資料庫中

redis集群與分片1-redis服務器集群、客戶端分片

服務器集群 包含 工作 direct 數據丟失 網站 這一 線性 取模 下面是來自知乎大神的一段說明,個人覺得非常清晰,就收藏了。 為什麽集群? 通常,為了提高網站響應速度,總是把熱點數據保存在內存中而不是直接從後端數據庫中讀取。Redis是一個很好的Cache工具

流水線、超流水線、超標量superscalar技術對比

流水線      流水線技術是一種將每條指令分解為多步,並讓各步操作重疊,從而實現幾條指令並行處理的技術。程式中的指令仍是一條條順序執行,但可以預先取若干條指令,並在當前指令尚未執行完時,提前啟動後續指令的另一些操作步驟。這樣顯然可加速一段程式的

Mysql資料庫學習4階段性完結

-- 倒序輸出全部使用者的許可權資訊 SELECT * from users order by powers  desc -- 統計女生人數,靈活使用count,看題目要求,你要計算的是什麼? SELECT  COUNT(sid) FROM `student` WHERE sse

Mysql資料庫學習3DQL

恩 ,在資料庫中一直都是認為查詢是最難的。因為種類多,花樣也太多了,要查哭。但還是學到了很多東西啊,在以後的開發中一定可以用上的,回想起我們實踐周老師給講的。 一個模組 增刪改查 至少8個功能     1.查詢全部     2.按條件查