Wiredtiger 在MONGODB 中的疑问

Wiredtiger 在MONGODB 中的疑问

MongoDB 中也有类似MYSQL 的数据库引擎的插件化的概念,虽然MYSQL 被ORACLE 搞得现在对这个数据库的引擎认知都存在于INNODB,但实际上MYSQL 在之前的存储引擎还是丰富多彩的,MONGODB 的存储引擎也是如此,目前MONGODB 主推的(官方)的数据库引擎是 WIREDTIGER ,之前MONGODB 官方的数据库引擎是 MMAP1, 而实际上MONGODB 还有一个数据库引擎脚ROCKS DB,听说是不错,至少和WIRETIGER 平分秋色,甚至略胜一筹。

那今天我们主要来看看WIREDTIGER 为什么是目前MONGODB 的主力数据库引擎,有点在哪里,浅层的原理是什么。

下面的图是MONGO DB wiredtiger的数据库引擎的架构图。

可能看到图,传统DBA就会马上又一个反向,cursors ,一个性能差,有慢,应该被绝迹的词汇。 实际上在MONGODB 中,快速的返回结果其实cursors的功劳不小,首先不要用传统的数据库思维来去想MONGODB,他返回的数据结果集,要比传统的数据结果集大的多,(言外之意就是MONGODB 处理的数据量(吞吐)比传统数据库要大的多)。使用传统的方法,将结果集缓存在OUTPUT 这样显然对MONGODB 不是一个好的处理方式。

Wiredtiger 在MONGODB 中的疑问

OK,我们不在此做过多纠缠,

和众多数据库一样,提高系统的性能,在于修改数据的时候并不是马上将磁盘的数据进行修改,而是通过多版本控制,来决定哪些数据应该被显示,哪些数据要被修改并刷盘,这里面通过 transactions 和  snapshots 来进行传统数据库的 MVCC的活动,而数据则通过 CACHE 给出。

同时wiredtiger与 mmvp1 引擎比较,有以下优势

1 比传统引擎更多使用 CPU CORES 和  内存

2 插入免锁逻辑,多线程不会阻塞

3 采用更高的压缩率,降低I/O的使用,提高I/O性能

4  将文件的 b+ TREE  放入 cache, 加快数据的读取

5 使用了Hazard pointers 来处理,dirty page 的问题,所以才成就了插入免锁逻辑

注:删除需要锁,所以MONGODB 中,删除操作应该好好考虑如何处理。

2 作为WIREDTIGER 中的两个日志系统,Journal and oplog ,系统他们的负责的任务是不同的,(如不清楚  Journal  & oplog 是什么请百度),那么这里有一个问题,Journal   和 oplog 在记录日志的物理顺序是否一致。

Wiredtiger 在MONGODB 中的疑问

答案是,oplog 与实际的操作顺序是一致的而 Journal log 与操作结果的顺序一致。这也是由于两者在对MONGODB 数据库在功能上的主责不同。一个是负责系统crash后的恢复,自然以结果为ORDER ,而OPLOG 则是要对 REPL负责,所以操作的顺序是ORDER。

最后,mongodb 的高速插入与wiredtiger使用的 lSM 也有关系,找一个时间可以研究一下 LSM的原理,可以更加理解MONGODB 插入速度快的秘诀。