記憶體資料庫選型之 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
業務層需要實現機制來保證快取和資料庫的一致。這意味著:
- 開發者需要實現寫快取、寫DB這兩套介面
- 需要實現快取miss處理機制
- 需要實現雙寫,保證資料庫和快取的一致性
- 鍵值的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副本,當同一資料3副本節點都宕機後,叢集不可用。
|
支援多個slaver,但如果叢集中超過半數以上節點的master宕機,無法仲裁導致叢集服務不可用。
|
|
開源支援
|
|
支援開源版本
|
開源支援
|
例項
|
|
支援單臺物理機器上多例項,但不建議單臺物理機器上啟動多例項(避免資源爭用)
|
推薦單伺服器多例項,單例項單執行緒
|
多租戶
|
|
使用K8S來實現多租戶*
|
沒有K8S operator的支援
|
多使用者
|
|
支援,但無法配置獨立表空間,支援使用者、角色許可權管理,暨:不同表使用到的記憶體資源做不到隔離,所有的表都可以用到所有的記憶體空間,但是每個表可以設定配額管理,最大不允許超過多少條記錄
|
不支援
|
Scheme
|
|
分割槽表及複製表模式並存,分佈鍵是指為分割槽表選擇的自動分割槽的欄位,VOLT自動根據分佈鍵的資料,雜湊後將資料放到叢集不同的分割槽
|
叢集模式僅可用分割槽表,主從模式僅可用複製表。
|
ACID
|
原子性
|
支援
|
支援
|
一致性
|
強一致性
|
不支援,主副本資料不保證一致性。
|
|
隔離性
|
支援
|
支援
|
|
永續性
|
支援以Snapshot方式持久化
|
支援,通過RDB或AOF方式,RDB無法做到事務級別持久化,AOF方式資料載入緩慢
|
|
SQL標準化
|
|
標準SQL都支援,但與ORACLE語法存在差異性,主要表現在函式上。
|
不支援
|
儲存過程
|
|
支援儲存過程(JAVA、SQL),可實現複雜運算
|
不支援,複雜執行由業務程式碼實現
|
自定義函式
|
|
支援
|
不支援
|
檢視
|
|
支援
|
不支援
|
索引
|
|
支援
|
使用雜湊表儲存kv資料,rehash時效能下降
|
連線數
|
|
理論無限制
|
未知
|
行儲存、列儲存、欄位個數
|
|
欄位個數最多1024個,行儲存。支援直接二進位制和JSON儲存
|
未知
|
執行計劃
|
|
支援
|
無
|
安全
|
使用者名稱密碼
|
寫在配置檔案中,密文儲存
|
支援
|
運維
|
管理工具
|
自帶命令列管理工具SQLCMD自帶圖形管理工具VMC支援跟流行的三方監控工具整合,如:普羅米修斯、grafana、New relic等*
|
提供命令列介面、圖形介面
|
叢集擴容
|
自動化線上擴容、縮容,一鍵操作*
|
支援,多個步驟,例項啟動->加入叢集->遷移資料
|
|
TTL
|
|
支援根據數量、時間的生命週期管理
|
支援基於時間的生命週期管理
|
匯入匯出
|
|
支援通過檔案批量匯入,支援Kafka訂閱和批量匯入,支援JDBC匯入
|
不支援
|
定時任務
|
|
支援定時任務執行和任務編排,支援定時跑批
|
不支援
|
程式設計介面
|
|
支援所有流行的程式語言(如:JAVA,C/C++,C#,Python,Go,PHP,Node.js,Erlang等)支援REST,JDBC等規範
|
支援所有流行的程式語言
|
資料自動分佈
|
|
可在資料寫入、資料複製、叢集擴縮容等多種場景下,自動完成資料均衡分佈操作。
|
叢集擴縮容時需要手工重新分佈資料
|
※內容參考網際網路
|
如果您希望整合VOLT到您的技術棧中,請與我們聯絡!