共计 1919 个字符,预计需要花费 5 分钟才能阅读完成。
内存和磁盘的双存储引擎架构
1.1 应用场景形容
OpenMLDB 的线上服务局部为了满足不同的性能和老本需要,提供了两种别离基于内存和磁盘的存储引擎。对于这两种存储引擎的应用考量,和举荐匹配场景,见如下表。
1.2 存储引擎架构
1.2.1 内存存储引擎架构
内存存储引擎的具体架构参考:在线模块架构 – 4.2 Storage Engine
1.2.2 磁盘存储引擎架构
OpenMLDB 磁盘存储引擎底层基于 RocksDB 实现。RocksDB 实质上是一个基于磁盘的 KV 数据库,其实现的根本逻辑为将创建表格时的索引所对应的 KEY
和 TS
(OpenMLDB 列索引)组合起来,成为 RocksDB 的 KEY,并且映射到相应的 column family。RocksDB 内的值则即为以后索引键对应的 OpenMLDB 内的一行数据。下图反映了基于 RocksDB 进行存储引擎映射的根本架构。
1.3 应用形式
内存引擎为 OpenMLDB 默认的存储引擎,两种引擎的应用阐明如下
- 两种引擎的指定为表级别,即在同一个数据库内,不同表格能够混合应用不同的存储引擎(然而一张表只能对应一种存储引擎)
- 存储引擎的指定通过建表时的参数
storage_mode
进行指定,其可选值为Memory
,HDD
, 或者SSD
,比方
CREATE TABLE t1 (col0 STRING, col1 int, std_time TIMESTAMP, INDEX(KEY=col1, TS=std_time)) OPTIONS(partitionnum=8, replicanum=3, storage_mode='HDD');
- 如不指定存储模式,则默认应用内存存储引擎
- 表格创立当前,无奈再批改其存储模式
1. 性能反对比照
尽管在大部分的场景,双存储引擎的性能反对是统一的,然而在某些场景上还是有所区别。下图列出了相干的性能反对区别,在做切换之前须要思考对于业务是否有理论的影响。
2. 性能比照
2.1 硬件配置
- CPU:2x Intel(R) Xeon(R) Gold 6230 CPU @ 2.10GHz
- SSD:Intel DC P4600 Series 2TB,磁盘引擎选用该 SSD 作为存储介质
- DRAM:物理机器内存 512 GB,然而为了不便进行试验,咱们应用工具 Chaosblade (https://github.com/chaosblade…) 进行模仿内存占用。最终模仿测试可用的内存为 8/16/32 GB
2.2 部署和负载
- OpenMLDB 应用集群模式部署,采纳了两个 tablets 的配置,没有开启预聚合优化。
- 测试所用数据和脚本应用了 OpenMLDB 内置的测试脚本的默认参数,能够参考 https://github.com/4paradigm/…
- 对于实时申请,咱们应用了基于全量数据的随机查问,来防止零碎缓存所带来的影响。
- 对于某组特定的可用内存参数,咱们一直增大数据量,来查看零碎性能和数据量的关系。因为零碎缓存的存在,咱们预期当数据量小于内存时,缓存能够很好的防止磁盘 IO 造成的性能消退;然而随着数据量的增大,性能将会出现继续降落趋势,直到某一个平衡点。这个试验能够帮忙咱们学习到不同数据量下的性能体现,以及最终达到的预期最差性能。
2.3 测试后果
图一:不同可用内存容量下,磁盘引擎的拜访提早(纵轴)和数据量大小(横轴)的关系
拜访提早的试验后果如上图一所示,咱们能够有以下察看和论断:
- 当数据量小于可用内存时,因为零碎缓存的存在,仍然能够放弃较高的性能体现(毫秒级提早)。
- 当数据质变大,性能将会继续降落,直到呈现一个绝对均衡的状态(拐点根本是当数据量为内存容量的 2-3 倍左右)。进入均衡状态次要是因为因为数据量较大,缓存根本生效,因而由磁盘 overhead 带来的性能消退占据了主导。
- 在进入均衡状态当前,性能消退到约为最优状况下(数据量较小时)的 20-50%
- 如果数据量小于内存,咱们测试基于 64 GB 物理内存下 16 GB 数据量的内存存储引擎的性能,性能数字对应图上 Mem. table 所示的横虚线。能够看到,内存存储引擎能够相比拟于磁盘引擎的最好性能,额定带来拜访提早大概 25% 的性能改良。该改良次要来自于基于内存存储引擎的双层跳表的索引构造,带来的窗口数据的快速访问。
- 综上剖析,磁盘存储引擎整体的性能约为内存存储引擎的 15-38%
3. 总结
本文总结了 OpenMLDB 双存储引擎的架构和性能比照,以及系统性的考查了磁盘引擎的性能体现。理论应用中,咱们举荐依据理论的利用场景进行抉择。比方对于咱们所测试的利用场景,如果须要 10 毫秒左右的超低提早,那么优先选择内存存储引擎;如果对于内存老本敏感,同时能够承受如 20-30 毫秒左右的提早性能,则能够优先思考磁盘引擎,将会帮你节俭 80% 左右的硬件老本。
正文完