【技術解密】SequoiaDB分散式存儲原理
來自專欄 SequoiaDB——NoSQL技術分享
分散式架構勢在必行
在傳統的資料庫技術中,為了保證數據的安全與高性能,通常會選擇高端的外置存儲作為資料庫的主要存儲源,而本地磁碟則被視為不可靠的性能低下的一種設備。這種觀念的產生,主要是由於過去本地磁碟的生產技術存在一定的瓶頸,並且其穩定性和性能確實都遠落後於高端存儲。
· 互聯網應用迅猛發展
在過去, IT行業的發展遠沒有現在蓬勃,大家更多的是在家裡或者辦公室通過桌面級設備上網查詢資料和瀏覽世界各類時事新聞。在這樣的時代背景下,互聯網企業和像銀行、通訊類公司這種對IT部門十分依賴的傳統企業,一台小型機和一個優秀的關係型資料庫就能夠很好的處理企業內部多個系統之間的數據了。
但是在最近10年,甚至更短的時間裡,每個人手中都擁有了一部或者多部智能移動終端,它們除了能夠打電話、發簡訊,也能夠像筆記本電腦一樣,上網、玩遊戲、購物、聊天。各種智能應用和業務場景也被開發者發掘出來了,這些新穎的應用也正在被大部分消費者所接受。
· 硬體成本大大降低
一台小型機+一個優秀的關係型資料庫已經越來越不能滿足IT部門對急速膨脹的數據量的處理需求了,重要一個原因,傳統的資料庫技術無法做到方便快捷地將海量數據分配給多台伺服器去計算,而永遠只能通過垂直擴容硬體的方式提升系統性能。
經過這10幾年的發展,過去不被企業認可的磁碟技術有了很大的進步,從SATA磁碟到SAS磁碟,從機械磁碟到SSD磁碟,技術的進步,使得本地磁碟的穩定性和讀寫性能都有了非常大的提升。它們也逐漸被企業使用在重要的生產環境中。· 分散式大數據技術革新
與磁碟技術同時發展起來的,還有各種大數據技術。先有谷歌的三篇著名論文,後有各種技術特點的NoSQL/NewSQL資料庫。它們的技術實現,都是基於廉價的X86伺服器和本次磁碟作為主要的硬體伺服器而設計。
並且各種NoSQL/NewSQL資料庫的技術特點,都包含了數據分散式存儲的功能技術,以解決當前企業數據量快速膨脹,客戶對IT系統的相應時間要求越來越高的技術難題。
資料庫分散式原理介紹
Hash 方式分布數據
資料庫Hash方式分布數據,原理就是用戶在建立集合時,指定此集合的切分方式為Hash,並且顯式指定ShardingKey 為記錄中哪個欄位。
圖1
當應用APP向資料庫發送寫入記錄的請求時,首先會將記錄與請求發送到資料庫的Coord節點,Coord節點會根據此集合的切分方式,例如ShardingKey=id,ShardingType=Hash,以及記錄中ShardingKey的Hash值,判斷應該將此記錄分發給哪個數據分區組。一旦數據分區組接收到寫入記錄請求與寫入的數據信息,數據分區組會調用資料庫中相應的方法將此記錄持久化到磁碟上,並且同時更新此數據分區組中對應集合的索引數據。
Range 方式分布數據
資料庫Range方式分布數據,原理就是用戶在建立集合時,指定此集合的切分方式為Range,並且顯式指定ShardingKey 為記錄中哪個欄位。
圖2
當應用APP向資料庫發送寫入記錄的請求時,首先會將記錄與請求發送到資料庫的Coord節點,Coord節點會根據此集合的切分方式,例如ShardingKey=id,ShardingType=Range,以及記錄中ShardingKey的值,判斷此記錄是屬於哪個範圍的數據分區組,然後再將此記錄發送給對應的數據分區組。一旦數據分區組接收到寫入記錄請求與寫入的數據信息,數據分區組會調用資料庫中相應的方法將此記錄持久化到磁碟上,並且同時更新此數據分區組中對應集合的索引數據。
Partition 方式分布數據
在SequoiaDB資料庫中,對比其他的NoSQL資料庫的簡單數據切分功能,使用了「主子表」的功能,這個功能與部分關係型資料庫的Partition功能類似,都是在資料庫中建立一張邏輯的總視圖,然後將多個Partition通過某個欄位的範圍限定掛載到總視圖上。通過「主子表」這種分散式方式,用戶可以按照需求對於數據進行更好、更細化的切分工作。同時,類似於時間序中或冷熱數據可以做到天然的切分,這樣更有利於硬體資源的充分利用。在SequoiaDB中,main collection 對應關係型資料庫的總視圖,sub collection 對應關係型資料庫的partition。而SequoiaDB資料庫中,比較特殊的是,sub collection 實際上就是一個普通的集合,而main collection 則是只存在於資料庫的編目節點中,並不會在任何數據分區組中寫入任何數據。用戶基本可以理解為main collection為邏輯視圖,只在編目節點中保留一些數據範圍信息,而sub collection 則是資料庫中普通建立的集合,只是在配合main collection 一起使用時,才被稱呼為sub collection。圖3
在一般情況下,用戶建立一個集合,此集合會隨機被分配到某個數據分區組上。如果用戶要利用主子表功能來實現數據的分散式存儲,還需一些小技巧。用戶在建立集合時,可以通過顯式指定此集合被分配到哪個數據分區組上,從而避免sub collection扎堆在某個數據分區組上。用戶最後一個步驟就是給每個sub collection 劃定範圍分區,然後將各個sub collection attach到main collection 上。
多維分區
在SequoiaDB資料庫多種分散式原理上,最為複雜和最為高效的方法,就是數據多維分區。多維分區,顧名思義,就是在對集合做數據分區時,不止一種分區方式同時作用在一個集合上。
如圖4 ,多維分區實際上就是主子表和Hash分區相結合的一種方式。
圖4
目前SequoiaDB的多維分區可以為一個集合提供兩個欄位的做分區。一般情況下,用戶可以在主子表中對time欄位做範圍切分,然後再對sub collection 的id欄位做Hash切分。用戶使用多維分區的方式,主要的優勢在於可以將一個海量數據的集合以更加小的顆粒度做數據均衡,以提升資料庫的性能。用戶在使用多維分區功能時,還可以結合資料庫的Domain 功能,來更好地處理數據分區任務。圖5
Domain,就是資料庫將多個數據分區組整合在一起的一個邏輯域,用戶可以在建立集合空間時直接指定此集合空間屬於哪個Domain上,然後基於此集合空間建立的集合,只要是ShardingType=Hash的,資料庫就會自動將此集合按照ShardingKey的Hash 值分發給屬於此Domain的數據分區組。
SequoiaDB巨杉資料庫2.6最新版下載
SequoiaDB巨杉資料庫技術博客SequoiaDB巨杉資料庫社區推薦閱讀:
※「魔鬼」撒旦(Satan)利用「永恆之藍」漏洞捲土重來 主攻資料庫
※為什麼Docker容器不適合資料庫服務(一)
※關係型資料庫 RDBMS 的舊與新 -- 談談 NewSQL
※SequoiaDB Spark Yarn部署及案例演示
※演講實錄:「分散式資料庫海量數據存儲和實時查詢實現與應用」