1. 背景
OpenMLDB 是一款开源的高性能全内存 SQL 数据库,在时序数据存储、实时特征计算等方面都有很多创新和优化。Redis 是业界最流行的内存存储数据库,广泛应用于缓存等高性能在线场景。虽然二者应用场景不尽相同,但作为都是使用内存作为存储介质的数据库,希望通过对相同数据行数下的内存占用量进行测试对比,让客户直观了解二者在内存资源上的消耗占比。
2. 测试环境
本次测试基于物理机部署(40C250G * 3),硬件信息如下。
CPU:Intel® Xeon® CPU E5-2630 v4 @ 2.20GHz
Processor:40 Cores
Memory:250 G
Storage:HDD 7.3T * 4
软件版本具体如下。
对比产品 | 版本 | 部署模式 | 内存统计方式 |
---|---|---|---|
OpenMLDB | 0.8.5 | 集群模式(2 tablets) | 内置命令(show table status ) |
Redis | 7.2.4 | 单机模式 | 内置命令(info ) |
3. 测试方法
使用 Java 开发测试工具,使用OpenMLDB Java SDK 和 Jedis,分别向 OpenMLDB 和 Redis 插入相同的数据,对比两者的内存占用情况。因为两者支持的数据类型和数据存储方式的不同,实际数据插入方式有一定的差异。因为特征数据都是有时序的,为了尽可能贴近用户的实际使用情况,我们设计了两种测试方式。
3.1 方法一:随机生成数据数据集
设计每一个测试数据集都有 m 个 key作为主键,每个 key 可能有 n 个不同的 value(模拟时序性)。简单起见,这里 value 就只用 1 个字段表示,可以通过配置参数分别控制 key 和 value 字段长度。对应到 OpenMLDB,创建一个包含( key,value)两列数据的测试表,以每一个 key:value 作为一条数据,插入测试表中。对应到 Redis,以每个 key 作为键,以这个 key 对应的多个 value 组合为 zset,存储到 Redis 中。
3.1.1 举例
计划测试 100万(记为1M)个 key,每个 key 对应有 100 条时序数据。则实际存储时,OpenMLDB 中存储的实际数据量为 1M * 100 = 100M,即 1 亿条数据。而 Redis 中,则是存储 1M 个键,每个 key 对应的 value 为包含 100 个成员的 zset。
3.1.2 可配置参数
配置项 | 说明 | 默认值 |
---|---|---|
KEY_LENGTH | key 的长度 | 50 |
VALUE_LENGTH | 单个 value 的长度 | 100 |