内存数据库选型之 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中文站??