最近调优及其他工作实在太忙,没有太多时间写心得,今天抽空来总结一下阶段性成果吧。从一开始的ceph调研、系统调优开始,ceph集群存储大规模数据之后(集群文件数超过2亿),rgw并发写性能下降的问题一直困扰我们,终于在最近找到了原因及相关解决办法
写在前面
松鼠哥的ceph专业课程上线啦!
面向新手同学,从0实战,全面入门ceph安装部署与运维,有需要的同学赶紧扫码订购吧:
rocksdb对osd性能影响很大,对其进行研究和调优的效果还是很明显的。
问题引入
在测试集群的并发性能的时候,我们注意到,经过系统调优后,集群创建初期,至少,在写入数据低于1亿文件数的时期,集群能够保持比较好的性能,并发虽然会有不少波动,但是基本能维持到7500ops(cosbench),但是再继续写,性能就会出现明显的暴跌,降低到1500ops左右,这显然是不可接受的;
我们跟踪排查后发现,每当性能下降剧烈的时候,往往是磁盘有非常厉害的读:
1 | 集群概况: |
根据观察,当磁盘有读操作的时候,写性能往往会下降很多,使用iotop发现,产生大量读的线程主要是[rocksdb:bg0]一类的线程,那么这些都是些什么线程,又在做什么读操作呢?不急,我们先学习一下rocksdb
从LSM-Tree说起
Rocksdb源自于Leveldb,fork了Leveldb的代码后,facebook在Leveldb的基础上做了很多的改进,然后开源并重新命名为Rocksdb,leveldb和rocksdb一样,都是基于LSM-Tree思想所设计的
LSM-Tree
LSM-Tree全称是Log-Structed-Merge-Tree,是一种数据结构思想,它的理论基础是,传统磁盘顺序读写速度比随机读写速度快得多,因此它想了个办法:将随机的读写转换成顺序读写,从而提高读写性能
LSM-Tree的组成结构是:
1、memtable - 常驻内存,主要负责保存要写入的数据
2、immutable - 当memtable写满后,就会变成只读的immutable
3、wal file - 实现log功能,掉电后用以恢复数据
4、SStable - 持久化存在磁盘中的数据库文件,保存了所有的数据
注:图片来自rocksdb detail
这里解释一下rocksdb的读写流程:
写流程
1、首先,为了保证掉电数据恢复,rocksdb先写wal中的log文件,注意,这里是追加模式写,因此速度很快
2、然后写位于内存中的memtable;
3、客户端写返回
4、rocksdb检查memtable否写满,如果写满,则memtable变成immutable,只允许读,等待flush
5、当immutable满足flush条件后,会将immutable的内容一次性flush到磁盘上,作为level0的sst文件保存在db的磁盘分区中
注意,当memtable的内容flush到磁盘上后,所有level的记录都是有序的,因此,在memtable flush到磁盘上时,会进行去重和排序
读流程
1、读请求首先到达memtable,在memtable中查找,查到即返回,否则继续查找
2、在level0中查找,因为rocksdb保证了每一个level的所有记录都是有序的,因此使用二分查找速度很快
3、在上级level中未查到,则需要继续往下查找,直到最后一个level,若仍未查到,则返回查找失败,否则,返回第一次查找到的记录
关于删除和修改
对于删除和修改,与写入并没有太大的区别,删除的时候,会写入一条kv记录,但是该kv记录带有删除标记,待进行SStable合并的时候,会进行实际的删除操作,而修改操作也是,写入一条带有修改标记的kv记录,SStable合并的时候会进行对比,保留最新的一条kv记录。
小总结
LSM-Tree为了提高io性能,将随机写进行了合并,使得每次写操作都能够在一次磁盘io和内存io后返回,速度很快,并且其规定,删除和修改也是作为一条操作记录写入,在后续才进行实际的删除和修改
Rocksdb的SST文件合并
LSM-Tree保证了写操作在一次磁盘和一次内存写后就能返回,但在leveldb/rocksdb端后续处理上,还是有很多的工作,最重要的就是数据落盘后SST文件的合并处理;对于Leveldb来说,写入磁盘后的SStable文件会被分成多个不同的level,这也是leveldb名称的由来;leveldb/rocksdb的组织方式是,当某个level的文件数量或者总大小达到预设的值后,该level的一个文件(level0为所有文件)就会与下一层的文件发生合并,合并后的文件会进入下一个level,例如level0文件大小或数量达到阈值后就会与level1的文件发生合并,原来的level1的文件就可以安全删除了,当然,在合并的时候会进行去重和排序操作,这样就能保证每一层的数据都是有序的,此时的排序相当于N路归并排序。
注:图片来自Leveled Compaction
上图可以清楚地看出,memtable刷入磁盘后形成level0的SST文件,而level0会往下合并,最终形成一棵LSM-Tree
关于rocksdb的相关内容就先做个简单的梳理,网上有非常优秀的资源对其进行了详细、深入的介绍,尤其是facebook的官方,更是给出了最权威最有价值的资料,对深入学习rocksdb提供了很大的帮助
参考资料
LSM Tree 学习笔记
LSM-Tree 与 RocksDB
RocksDB. Leveled Compaction原理分析
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2018/05/10/ceph性能调优历程-rocksdb篇-1/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!