1. 程式人生 > 其它 >記憶體資料庫選型之 Redis 與VoltActiveData比較

記憶體資料庫選型之 Redis 與VoltActiveData比較

依靠記憶體來儲存資料的資料庫管理系統,也稱為記憶體資料庫,成為解決高併發、低時延資料管理需求的技術路線。近年來,隨著動態隨機儲存 器  (DRAM)  容量的上升和單位價格的下降,使大量資料在記憶體中的儲存和處理成為可能,越來越多的記憶體資料庫管理軟體  (IMDB)  逐漸成熟。

  在金融、通訊行業的業務場景中,記憶體資料庫的運用越來越深入,不斷有新的業務需求、效能要求被提上日程。面對豐富的IMDB產品,如何在 明確業務需求的基礎上選擇更適合自己的IMDB產品? 這裡我們選擇業界普遍使用的Redis與VoltActiveData(以下簡稱VOLT)做一個多方位的比較,希望能幫助大家更加了解不同IMDB產品的特性和差異點,能根據自己的業務特徵做好技術方案選型。


 · Client接入DB叢集方式比較  

Redis

常用方案如通過proxy來定址分片,叢集 擴縮容對業務層不透明。

VOLT

透明接入任意node,系統內部派發分 片事務。


· 與源資料庫的資料同步

> 匯入

Mysql同步資料到Redis

通過JedisCluster優化 - 管道(pipeline)模式匯入,資料量大的情況下會造成記憶體溢位的情況,超百萬資料要分批次執行。

Mysql同步資料到VOLT

執行連線mysql指令碼可直接同步資料至VOLT。

> 匯出

Redis同步資料到Mysql

通過非同步佇列方式將資料同步至MySQL:

VOLT同步資料到Mysql

執行連線mysql指令碼可直接同步資料至VOLT:

Step1​ 在VOLT中建立流:

Step2​ 在儲存過程中呼叫流:


· 事務支援  

Redis事務

Redis只支援單節點事務,叢集模式下需要redis+lua指令碼配合使用,  lua一般採用c/c++來編 寫。

VOLT事務

VOLT 是一個完全符合 ACID 的關係型資料庫,它使應用程式開發人員不必在自己的應用 程式中開發程式碼來執行事務和管理回滾。


· SQL標準化

edis實現

Redis屬於NoSql系列的資料庫,它的儲存結構是Key-Value,它並不像關係資料庫那樣提供 任何的SQL,像排序、聚合函式、  sql語句無法通過sql查詢實現。

例:  實現排序

只能通過有序集合(sorted set)組合score+時間的方法組合實現

VOLT實現

​VOLT使用標準SQL,包括 CREATE INDEX,CREATE TABLE,

CREATE VIEW ,SELECT, INSERT, UPDATE, DELETE操作等。學習成本和程式碼遷移成本很低,程式碼複用程度高,已經使用SQL 實現的應用,可以相對容易的遷移到VOLT。  

同時VOLT還支援使用者自定義函式,通過  Java編寫並匯入資料庫,   使用者自定義函式能在SQL語句中使用。

例:  實現排序


 · 熱部署

Redis實現版本迭代

在專案中編寫程式碼實現功能,版本迭代需要重新部署伺服器。

VOLT實現版本迭代

VOLT通過編寫儲存過程實現,無需重啟應用伺服器,重新編譯儲存過程即可,  保證程式 的穩定性。

程式中只需呼叫儲存過程:


 · 雙寫一致性(資料庫和快取的同步)

Redis

業務層需要實現機制來保證快取和資料庫的一致。這意味著:

  1. 開發者需要實現寫快取、寫DB這兩套介面
  2. 需要實現快取miss處理機制
  3. 需要實現雙寫,保證資料庫和快取的一致性
  4. 鍵值的timeout設定維護​
VOLT

VOLT本身就是RDBMS,或者VOLT可以通過簡單配置完成到源資料庫的同步。

(可參見上文“VOLT同步資料到Mysql”)


 · 主從讀取一致性保證     

Redis

需要業務層加入實現機制才能保證不讀到髒、過期資料。

比如“選擇性讀主”方案的實現流程為:

VOLT

DB內部機制保證,對業務層透明。

開箱即用,不需要運維人員選擇主從讀取方式。


 · 業務場景實現比較

> 物件具有多屬性的場景

Redis

單物件多屬性的業務場景非常基本。使用 redis儲存多屬性的情況下,需要業務層  開發兩層轉換(如使用Hash儲存,需要  首先按照物件key查詢得到dict,然後按  屬性名查詢到value)

VOLT

在一行內解決多屬性的讀寫。

> 多型別的物件屬性關聯查詢的場景

Redis

需要業務實現物件的屬性解析,  並根據業

務需要完成比較匹配、組合屬性等。

VOLT

有RDBMS的優勢,使用SQL完成關聯

查詢,解放開發人員。

> 鍵值自增自減原子操作

Redis

用於分散式應用系統的共享計數器,非常 高效。

VOLT

使用表列作為計數器,能保證原子操 作並同樣高效。


總結

 

一級指標

 

 

二級指標

 

 

VOLT

 

 

Redis

 

 

關鍵指標

 

 

TPS

 

 

單節點讀寫10W+,並隨節點數量線性增長

 

 

單節點讀寫10W+

 

 

儲存容量

 

 

隨節點數量增長,實際案例中可到TB級別

 

 

未知

 

 

索引

 

 

支援一級、二級索引,複合索引。紅黑樹實現

 

 

僅鍵值索引,hash實現

 

 

複雜SQL能力

 

 

支援標準SQL92和部分SQL99

 

 

不支援

 

 

整合要求

 

 

 

 

 

1、對裝置配置要求不敏感,配置越高處理效能越好 2、內建整合ZK
3
、可以安裝於物理機、虛擬機器、容器,支援雲化部署 4、提供對K8S operator的支援*

 

 

支援物理機、虛擬機器、容器化和雲化部署

 

 

高可用

 

 

容災

 

 

原生支援主備、雙活、一主多備、多活容災
原生支援本地機房冷熱災備和跨機房冷熱災備

 

 

分散式單叢集

 

 

副本數

 

 

支援多副本。一套資料副本宕機後,應用無影響。若資料為3副本,當同一資料3副本節點都宕機後,叢集不可用。

 

 

支援多個slaver,但如果叢集中超過半數以上節點的master宕機,無法仲裁導致叢集服務不可用。

 

 

開源支援

 

 

 

 

 

支援開源版本

 

 

開源支援

 

 

例項

 

 

 

 

 

支援單臺物理機器上多例項,但不建議單臺物理機器上啟動多例項(避免資源爭用)
單例項多執行緒並行處理

 

 

推薦單伺服器多例項,單例項單執行緒

 

 

多租戶

 

 

 

 

 

使用K8S來實現多租戶*

 

 

沒有K8S operator的支援

 

 

多使用者

 

 

 

 

 

支援,但無法配置獨立表空間,支援使用者、角色許可權管理,暨:不同表使用到的記憶體資源做不到隔離,所有的表都可以用到所有的記憶體空間,但是每個表可以設定配額管理,最大不允許超過多少條記錄

 

 

不支援

 

 

Scheme

 

 

 

 

 

分割槽表及複製表模式並存,分佈鍵是指為分割槽表選擇的自動分割槽的欄位,VOLT自動根據分佈鍵的資料,雜湊後將資料放到叢集不同的分割槽

 

 

叢集模式僅可用分割槽表,主從模式僅可用複製表。

 

 

ACID

 

 

原子性

 

 

支援

 

 

支援

 

 

一致性

 

 

強一致性

 

 

不支援,主副本資料不保證一致性。

 

 

隔離性

 

 

支援

 

 

支援

 

 

永續性

 

 

支援以Snapshot方式持久化
支援,SnapshotCommandlog結合,資料載入迅速*

 

 

支援,通過RDBAOF方式,RDB無法做到事務級別持久化,AOF方式資料載入緩慢

 

 

SQL標準化

 

 

 

 

 

標準SQL都支援,但與ORACLE語法存在差異性,主要表現在函式上。

 

 

不支援

 

 

儲存過程

 

 

 

 

 

支援儲存過程(JAVASQL),可實現複雜運算

 

 

不支援,複雜執行由業務程式碼實現

 

 

自定義函式

 

 

 

 

 

支援

 

 

不支援

 

 

檢視

 

 

 

 

 

支援

 

 

不支援

 

 

索引

 

 

 

 

 

支援

 

 

使用雜湊表儲存kv資料,rehash時效能下降

 

 

連線數

 

 

 

 

 

理論無限制

 

 

未知

 

 

行儲存、列儲存、欄位個數

 

 

 

 

 

欄位個數最多1024個,行儲存。支援直接二進位制和JSON儲存

 

 

未知

 

 

執行計劃

 

 

 

 

 

支援

 

 

 

 

安全

 

 

使用者名稱密碼

 

 

寫在配置檔案中,密文儲存

 

 

支援

 

 

運維

 

 

管理工具

 

 

自帶命令列管理工具SQLCMD自帶圖形管理工具VMC支援跟流行的三方監控工具整合,如:普羅米修斯、grafanaNew relic*

 

 

提供命令列介面、圖形介面

 

 

叢集擴容

 

 

自動化線上擴容、縮容,一鍵操作*

 

 

支援,多個步驟,例項啟動->加入叢集->遷移資料

 

 

TTL

 

 

 

 

 

支援根據數量、時間的生命週期管理

 

 

支援基於時間的生命週期管理

 

 

匯入匯出

 

 

 

 

 

支援通過檔案批量匯入,支援Kafka訂閱和批量匯入,支援JDBC匯入
支援匯出的方式有:檔案匯出,匯出到hadoop,通過JDBC匯出到其他資料庫,匯出到Kafka,匯出到ElasticsSearch,支援Socket自定義匯出。
支援基於事件的資料匯出

 

 

不支援

 

 

定時任務

 

 

 

 

 

支援定時任務執行和任務編排,支援定時跑批

 

 

不支援

 

 

程式設計介面

 

 

 

 

 

支援所有流行的程式語言(如:JAVA,C/C++,C#,Python,Go,PHP,Node.js,Erlang等)支援REST,JDBC等規範

 

 

支援所有流行的程式語言

 

 

資料自動分佈

 

 

 

 

 

可在資料寫入、資料複製、叢集擴縮容等多種場景下,自動完成資料均衡分佈操作。

 

 

叢集擴縮容時需要手工重新分佈資料

 

 

內容參考網際網路

 


如果您希望整合VOLT到您的技術棧中,請與我們聯絡!

​​​​Volt Active Data中文站