高性能持久化键值存储,适用于大量记录。

11

这个场景涉及到10亿条记录,每条记录大小为1KB,存储在SSD中。哪种kv存储可以提供最佳的随机读取性能?需要将磁盘访问次数减少到每个查询只有1次,并且所有数据索引都将存储在内存中。

Redis速度快,但在内存中存储1TB数据太昂贵。 LevelDB每次查询都要多次读取磁盘。 我找到的最接近的是fatcache,但它不是持久化的。它是一个基于SSD的memcached。

有任何建议吗?

4个回答

10

RocksDB 或许是您的最佳选择,它专为内存和闪存等快速存储进行了优化,并且高度可定制。 如果您的应用程序在初始批量加载后是只读的,则可以配置 RocksDB 将所有内容压缩到一个大文件中。 这样,阅读将保证最多只有单个 I/O 操作。 但是,如果您的应用程序既要处理读操作又要处理写操作,则为了使每个读操作最多只有一个 I/O 操作,您需要牺牲写入性能,因为您需要经常配置 rocksdb 进行压缩,这会损害写入性能。

RocksDB 的调整指南也可以在此处找到。


2

您可以尝试使用RocksDB,这是一个专为SSD存储优化的Facebook库。您还可以尝试使用Ardb,它是基于RockDB/LevelDB/LMDB构建的Redis协议兼容的NoSQL数据库。


1

你看过Aerospike吗?我没有使用过它,但他们声称在固态硬盘上有良好的性能表现。


0

LMDB比RocksDB更快,使用的内存只有1/3。此外,LMDB不需要调整;而RocksDB需要仔细调整超过40个参数才能达到接近LMDB的性能。

http://www.lmdb.tech/bench/inmem/scaling.html

此外,LMDB是完全事务性的且100%防崩溃,而RocksDB则不是。


1
我比较了RocksDB和LMDB。在我的测试环境中,RocksDB获胜。 - avhacker
4
当所有数据都可以加载到内存中时,我认为LMDB会胜出。以下是我的测试环境:4GB RAM虚拟机,1000万条记录,每条记录的键大小为16字节,值大小为1024字节。你可以看到数据大小至少为10GB。我尝试在测试集中多次进行随机读取,RocksDB总是获胜。 - avhacker
当然,这取决于值的大小。请参阅此新的磁盘基准测试报告:http://symas.com/mdb/ondisk/ - hyc
@hyc RocksDB 真的不支持 ACID 吗? - eonil
2014年时还不支持ACID事务,我相信他们声称今年已经加入了此功能。 - hyc
这篇文章中的lmdb链接都已失效。 - kawing-chiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接