专栏首页Golang语言社区Go 生态圈的 K/V 数据库 benchmark

Go 生态圈的 K/V 数据库 benchmark

原文作者:smallnest

Go生态圈有好几个K/V数据库,我们经常用它来做我们的存储引擎,但是这些数据库引擎的性能如何呢?本文试图用性能而不是功能的数据考察这些数据库,我测试了几种场景: 并发写、并发读、单一写并发读、并发删除,得出了一些有趣的数据。

测试在两台机器上测试的,一台机械硬盘,一台固态硬盘,使用256字节作为value值的大小,9个字节作为key的大小,测试简单的读写删除操作,并没有测试批量读写操作。 每个测试case测试1分钟。

代码: kvbench

K/V 数据库

-Rocksdb: RocksDB是Facebook维护的高性能的嵌入式K/V数据库。它是LevelDB的克隆版,针对多核、SSD做了很多优化。 LSM tree数据结构。

-badger: 一个纯Go实现的快速的嵌入式K/V数据库,针对LSM tree做了优化,在某些情况下可以取得比较好的性能。

-goleveldb: leveldb的纯Go实现,非Google的C++版本

-bolt: 一个广泛使用的K/V数据库,基本上不会有新的功能加入了。

-bbolt: coreos的bolt克隆版,继续维护和扩展bolt的功能。

-buntdb: 一个基于内存的K/V数据库,也可以落盘。

-cznic/kv: 基本上不维护了。

-pebble: 一个性能优异的K/V数据库。

-map (in-memory) with AOF persistence: 基于map数据结构的数据库。

-btree (in-memory) with AOF persistence: 基于btree数据结构的数据库。

btree使用btree的数据结构,如果文件路径为:memory:,则直接写内存,而不会存于硬盘文件中。fsync为true是会同步硬盘文件。 map使用map的数据结构,如果文件路径为:memory:,则直接写内存,而不会存于硬盘文件中。fsync为true是会同步硬盘文件。

当然,除了基本的K/V操作外,有些数据库还加入了事务、bucket(Column Families)等额外的功能,这也是选型的时候要考虑的一个重要方面。

查看硬件环境

查看磁盘情况:fdisk -l 查看磁盘型号:smartctl -a /dev/sda

下面两个命令不太准, 都显示1: cat /sys/block/sda/queue/rotational lsblk -d -o name,rota

使用MegaCli工具: /opt/MegaRAID/MegaCli/MegaCli64 -ldpdinfo -aall |grep 'Media Type'

机械硬盘

硬盘是希捷的机械硬盘:

1Vendor:               SEAGATE
2Product:              ST900MM0168
3User Capacity:        900,185,481,216 bytes [900 GB]
4Rotation Rate:        10500 rpm

2客CPU, 20个物理 CPU core, 开了超线程40个逻辑 CPU core。

32G内存。

1/不写盘(nofsync)

throughputs

btreemap相关的实现最好,因为都是直接的内存操作,而且操作也很简单。而且map更简单,通过hash直接找到对应对象。

对于其它的K/V数据库,相对来说rocksdb性能更好一些,而buntdb在只读的情况下性能不错。

time (latency)

耗时基本和吞吐负相关,耗时越长,性能越差,唯一的例外是goleveldb,它的耗时也很短,但是吞吐率却没有足够优秀。

2/同步写盘(fsync)

throughputs

在数据落盘的情况下,写的性能急剧下降,因为每次写都需要同步到硬盘中,比较好的是rocksdb和badger,能达到1000+ op/s, 其它基本都在100以内。

time (latency)

和吞吐率负相关,goleveldb例外。bbolt和kv删除的时候也很慢。

SSD 固态硬盘

采用固态硬盘,我们期望写的性能能提升起来,看测试结果。

10块 SSD, 型号:

1Vendor:               AVAGO
2Product:              AVAGO
3Revision:             4.66
4User Capacity:        298,999,349,248 bytes [298 GB]
5Device Speed: 6.0Gb/s
6Link Speed: 12.0Gb/s
7Media Type: Solid State Device

1/不写盘(nofsync)

throughputs

读写都很快,rocksdb表现依然很优秀。而buntdb的只读依然很快。因为没有同步落盘的操作。

这个数据和前面的不写盘的数据不相同,是因为我换了一台有ssd的机器进行测试。

time (latency)

2/同步写盘(fsync)

throughputs

在落盘的情况下,写操作有了大幅的提升。尤其是goleveldb和badger,但是rocksdb的读是远远领先于其它K/V数据的(除了btree和map)。

time (latency)

总的来说,rocksdb的表现不错。为了保证不丢数据,我们可能需要设置同步硬盘的参数,但是这可能影响写的性能,需要通过批量写和SSD来解决。

对badger有点小失望,当然它对SSD的优化还是很可以的,有可能测试大的数据的时候才能显示出来它的优势。 对于简单的场景,也可以采用btree、map这种简单的数据结构来实现,加上AOF,如果想减少AOF的大小,可以像redis一样合并AOF的操作,去掉无用的中间数据。


版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Golang语言社区--【数据库知识】从关系型数据库到非关系型数据库

    1. 关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库。 关系模型是在1970年由IBM的研究员E.F.Codd博士首先提出的,在之后的几十年中...

    李海彬
  • 数据库中间件

    作者:[美]威廉·肯尼迪(William Kennedy)布赖恩·克特森(Brian

    李海彬
  • Linux内核通知链机制的原理及实现

    一、概念: 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它...

    李海彬
  • 硬盘变身窃听器!无需改装,无需麦克风,参数被赞媲美CD | 密大&浙大黑科技

    你的手机可能在监听你,你的电脑可能泄露自己的数据,你的智能音箱也可能把你的悄悄话上传到千里之外。

    量子位
  • Gdevops北京站:邀你开启运维与数据库的一年之“技”

    经过潜心打磨,结合行业热点 2019年度Gdevops全球敏捷运维峰会 将于5月10日以北京为起点强势启动 展开新一年精彩纷呈的技术巡演! 关于Gdevops...

    腾讯大讲堂
  • 日均7亿交易量,如何设计高可用的MySQL架构?

    大型国有银行,整体核心的系统都是大机+DB2 这样的传统架构;针对现在的互联网金融业务快速扩张的需求,传统的架构面临着比较大的挑战。

    java思维导图
  • 日均7亿交易量,如何设计高可用的MySQL架构?

    大型国有银行,整体核心的系统都是大机+DB2 这样的传统架构;针对现在的互联网金融业务快速扩张的需求,传统的架构面临着比较大的挑战。

    用户1516716
  • 面试官:你们的MySQL是如何支撑日均7亿交易量的?

    大型国有银行,整体核心的系统都是大机+DB2 这样的传统架构;针对现在的互联网金融业务快速扩张的需求,传统的架构面临着比较大的挑战。

    黄泽杰
  • 【Python 第36课】 异常处理

    在程序运行时,如果我们的代码引发了错误,python就会中断程序,并且输出错误提示。 比如我们写了一句: print int('0.5') 运行后程序得到错误...

    Crossin先生
  • 腾讯云自研数据库CynosDB发布会现场实录

    2018年11月22日, 腾讯云新一代自研云原生数据库CynosDB正式发布。这是业界第一款全面兼容市面上两大最主流的开源数据库MySQL和PostgreSQL...

    腾讯云数据库 TencentDB

扫码关注云+社区

领取腾讯云代金券