什么是分布式數據庫
傳統數據庫(例如mysql)一般是單機數據庫,其容量和性能受宿主機本身的性能的限制,在web系統這種數據量性能要求一般的場景下其可以很好的滿足,但是在大數據量大吞吐量的場景(例如:云數據庫這種單實例多租戶)下其力不從心,借用分布式的設計理念產生了分布式數據庫,用多臺物理機承載數據庫實例從而擴展數據庫的能力。
與mysql的區別
mysql通過各種擴展組件也可以實現類似分布式數據庫的能力,但是和云原生的分布式數據庫有很大區別。
一種分布式mysql的實現
1. 接入層
使用nginx這種網關做接入層,實現高可用和負載均衡;
2. 路由轉發層
其實就是一個mysql實例,只不過這個實例里面存儲的是用戶元數據,比如:某個用戶的某個表的某個范圍的行是存儲在哪一個mgr中的,用來做路由轉發;
3. mgr集群
mysql可以用多個實例組成一個mgr(MySQL Group Replication),比如三個mysql實例組成一個mgr,那么這個mgr中一個主mysql負責讀寫和數據同步,其他從mysql負責數據冗余也可以提供讀服務,多個mgr就組成了一個mgr集群,配合上路由轉發就實現了分布式;
可以看出上面的分布式mysql和主流的分布式存儲設計不大一樣,主要特點就是冗余,其最小單位是一個mysql實例,可以結合下面介紹的分布式數據庫架構對比;
架構
1. 元數據引擎
- 管理存儲集群和一些數據庫中的元數據,比如dbschema,租戶信息之類的;和大部分分布式存儲系統類似。
- 當數據發生異常時,調度數據遷移;
2. 查詢引擎
所謂查詢引擎主要有兩個功能,
- 解析sql語句(或者是dataframe這種查詢)將其轉換成可執行的任務;
- 執行這些任務,根據元數據引擎中的信息將任務轉發至對應的存儲節點;
3. 索引引擎
數據庫都有的東西,主要功能就是提高查詢效率,類似與書本的目錄;
4. 存儲引擎
- 主流一般都是用lsm-tree算法,比如tikv直接使用rocksdb,cnosdb使用自己實現的lsm-tree引擎
- 既然云原生,那么可以使用云服務,比如對象存儲來作為存儲后端,比如OceanDB的ceresdb
架構
- 一個分布式數據庫實例只需要一個元數據集群,一般搞三個元數據實例(raft算法);
- 可以看出查詢引擎是無狀態的,所以它可以任意水平擴展
- 索引引擎是與數據一一對應的,所以索引引擎需要伴隨存儲引擎部署
- 存儲引擎也是支持水平擴展的,只是需要在元數據管理集群中注冊;
OLAP
一般來說,分布式數據庫是面向大量數據的存儲計算的(OLAP),與mysql這種OLTP的數據庫還有些不一樣,簡單說來就是,對于mysql這種一般是的場景就是一行的寫入和讀取,但是分布式數據庫更多會面對count,max這種在查詢時附帶函數計算的場景,而且這種計算大多是面向列的計算,所以在設計上,會有一下區別:
mysql:OLTP + 行存;
分布式數據庫:OLAP + 列存
行存與列存:是指數據在底層的組織方式;