文章目录
一、MongoDB简介
MongoDB是一款由C++语言编写,基于分布式文件存储的NoSQL数据库,具有免费、操作简单、面向文档存储、自动分片、可扩展性高、查询功能强大等特点,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对(key-value)组成,MongoDB的文档类似于JSON对象。
1、MongoDB的特点
(1)文档结构的存储方式,能够更便捷的获取数据
使用JSON风格语法,易于掌握和理解:MongoDB使用JSON的变种BSON作为内部存储的格式和语法。针对MongoDB的操作都使用JSON风格语法,客户端提交或接收的数据都使用JSON形式来展现。相对于SQL来说,更加直观,容易理解和掌握。并且支持嵌入子文档。
(2)内置GridFS,支持大容量的存储
GridFS是一个出色的分布式文件系统,可以支持海量的数据存储,可用于存储和检索大文件,如图片,音频文件,视频文件等。内置了GridFS了MongoDB,能够满足对大数据集的快速范围查询。
(3)通过副本集保证高可用性
应用服务器,连接到MongoDB的整个副本集,副本集中有一台主服务器负责整个副本集的读写,副本节点定期同步主节点的数据和oplog,以保证数据的一致性。一旦主节点宕机或挂掉,副本节点会通过心跳机制检测到,并根据事先副本集创建时设置的节点优先级进行主节点的重新选举,从而保证高可用。
(4)可扩展性强,支持多数据存储引擎
MongoDB支持多数据存储引擎(WiredTiger,MMAPv1, In-Memory),其中WiredTiger为MongoDB默认的存储引擎。所谓的多数据储存引擎形象的说就是拔插式引擎,用当前的引擎替换掉前面的引擎就可以使用了,简单方便快捷。MongoDB提供整个数据库集群的管理工作,而真正将数据持久化的则是数据存储引擎。
二、RocksDB简介
RocksDB是针对KV数据存储的高性能嵌入式数据库,内核数据结构是基于LSM树实现的,它的特点是支持高效的点查找以及范围扫描、支持高速写入等。RocksDB可以作为MongoDB的底层数据存储引擎,适合大量的写操作场景。
1、LSM树简介
传统关系型数据库使用btree或一些变体作为存储结构,能高效进行查找。但保存在磁盘中时它也有一个明显的缺陷,那就是逻辑上相离很近但物理却可能相隔很远,这就可能造成大量的磁盘随机读写。LSM树能让我们进行顺序写磁盘,从而大幅提升写操作,作为代价的是牺牲一些读性能。
LSM树由两个或以上的存储结构组成,比如在论文中为了方便说明使用了最简单的两个存储结构。一个存储结构常驻内存中,称为C0 tree,具体可以是任何方便KV查找的数据结构,比如红黑树、map之类,甚至可以是跳表。另外一个存储结构常驻在硬盘中,称为C1 tree,具体结构类似B树。C1所有节点都是100%满的,节点的大小为磁盘块大小。
2、LSM树的插入步骤
大体思路是:插入一条新纪录时,首先在日志文件中插入操作日志,以便后面恢复使用,日志是以append形式插入,所以速度非常快;将新纪录的索引插入到C0中,这里在内存中完成,不涉及磁盘IO操作;当C0大小达到某一阈值时或者每隔一段时间,将C0中记录滚动合并到磁盘C1中。
3、LSM树的合并步骤
合并过程中会使用两个块:emptying block和filling block。
-
从C1中读取未合并叶子节点,放置内存中的emptying block中。
-
以升序找C0中的节点,与emptying block进行合并排序,合并结果保存到filling block中,并将C0对应的节点删除。
-
不断执行第2步操作,合并排序结果不断填入filling block中,当其满了则将其追加到磁盘的新位置上,注意是追加而不是改变原来的节点。合并期间如果emptying block使用完了则再从C1中读取未合并的叶子节点。
-
C0和C1所有叶子节点都按以上合并完成后即完成一次合并。
参考:https://baijiahao.baidu.com/s?id=1613810327967900833&wfr=spider&for=pc