内存数据库选型之 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方式持久化
支持,Snapshot与Commandlog结合,数据加载迅速*

 

 

支持,通过RDB或AOF方式,RDB无法做到事务级别持久化,AOF方式数据加载缓慢

 

 

SQL标准化

 

 

 

 

 

标准SQL都支持,但与ORACLE语法存在差异性,主要表现在函数上。

 

 

不支持

 

 

存储过程

 

 

 

 

 

支持存储过程(JAVA、SQL),可实现复杂运算

 

 

不支持,复杂运行由业务代码实现

 

 

自定义函数

 

 

 

 

 

支持

 

 

不支持

 

 

视图

 

 

 

 

 

支持

 

 

不支持

 

 

索引

 

 

 

 

 

支持

 

 

使用哈希表保存kv数据,rehash时性能下降

 

 

连接数

 

 

 

 

 

理论无限制

 

 

未知

 

 

行存储、列存储、字段个数

 

 

 

 

 

字段个数最多1024个,行存储。支持直接二进制和JSON存储

 

 

未知

 

 

执行计划

 

 

 

 

 

支持

 

 

无

 

 

安全

 

 

用户名密码

 

 

写在配置文件中,密文存储

 

 

支持

 

 

运维

 

 

管理工具

 

 

自带命令行管理工具SQLCMD自带图形管理工具VMC支持跟流行的三方监控工具集成,如:普罗米修斯、grafana、New 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中文站??