首页 存档 技术 查看内容

MongoDB2015回顾:全新里程碑式的WiredTiger存储引擎

2018-3-30 13:00 |来自: 互联网 305 0

摘要: 编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由毕洪宇分享。转载请注明来自高可用架构公众号「ArchNotes」。 毕洪宇,唯品会实时计算平台资深开发工程师。曾在 eBay、PPTV 任职 DBA。2012 年加 ...

编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由毕洪宇分享。转载请注明来自高可用架构公众号「ArchNotes」。

毕洪宇,唯品会实时计算平台资深开发工程师。曾在 eBay、PPTV 任职 DBA。2012 年加入唯品会,历任 DBA、大数据平台工程师、实时平台工程师。专注数据库、大数据、分布式计算技术方向。

“2015 年 MongoDB 在年初发布了 3.0,标志一个新的里程碑,分离 Server 层和 Storage 层,并引入了 WiredTiger 存储引擎,基于此,我们也才敢再把 MongoDB 捡起来用。” 毕洪宇

存储引擎的发展

MongoDB 拆分后的架构图如下


下面先从存储引擎层开始介绍一下一些改进点,现在已知支持的存储引擎包括:MMAP,WiredTiger,RocksDB,Memory 以及 Encryption 等。

MMAP

在 3.0.x 的时候依然还是默认的存储引擎,新的改进就是在并发方面,由原来的 database-level 锁转为 collection-level 锁,不过在 3.2 以后默认的存储引擎替换为 WiredTiger。

WiredTiger

应该是 MongoDB 2015 年最大的亮点了,内部架构图:


那么它有哪些比较突出的 feature 呢?


Document-level concurrency control

MongoDB 早期的锁粒度是简单粗暴的,instance-level,database-level 这也是一直被吐槽的地方;有一些场景为了适应这么粗粒度锁拆了一堆数据库出来,如果没有自动化管理配合的话,运维压力非常大。而 document-level 并发控制的引入使得 MongoDB 的并发能力得到极大的释放。

这里的数据也是存多版本的,有些类似 RDBMS 中 MVCC ( multi version concurrency control ),来实现同一行的读写之间的并发访问,进一步提高系统的并发访问能力。

Compression

WiredTiger 支持两种压缩方式 snappy ( 默认 ) 和 zlib;

官方的测试效果:


我们一个业务场景之前在 2.6 上,1.18 Billion 记录数占用磁盘空间 3.12 TB,而升级到 3.0.x 后空间占用降到了 270 GB,使得 PCIE/SSD 的使用更划算。

我们在 MongoDB 3.0 正式生产之前使用 YCSB 进行了简单的压测:

  • Write-only 测试,standalone 模式


  • 同样的 workload,enable 复制集


  • 以及 read-only 场景


在压测过程中,也遇到了一些问题,比如会有短暂的 stall,以及 replication enable 后 Primary 的写入吞吐量会降低非常多,这些都是 MongoDB 在和 WiredTiger 融合后存在的一个不足之处。

WiredTiger 在 eviction,checkpoint 和 capped collection 的处理算法还在持续改善中,感兴趣的可以在 JIRA(WT-1788,SERVER-16736)上跟进。我们也在使用过程中也发现一些问题,也算是接下来对 MongoDB 2016 的一个展望。

另外,关于 WiredTiger 内部也有很多 internal 参数可以调整,这部分基本上在压测时没有调整,只是把 eviction worker min,max 都设置为 4。

RocksDB

该存储引擎是 facebook 开源的,写入强劲 NoSQL Storage ( http://rocksdb.org/ ),不过对于 MongoDB 来说是非官方 built-in 支持的存储引擎 ( https://github.com/mongodb-partners/mongo-rocks ),有朋友在测试写入性能比较野性。

但是 WiredTiger 本身也支持 LSM option (默认是 btree ),可以通过 internal 的参数在创建表时指定,我简单测了一下 LSM 方式的写入也是很强,感兴趣的朋友可以深入 benchmark 下。

不过,关于 WiredTiger 的 LSM 特性和 MongoDB 的结合还在进行中,所以现在使用是修改 undocument parameter,并且也存在比如 memory leak 的 Bug,这里只是 preview test,并没有生产环境使用。

Memory

企业版存储引擎,非开源,有些类似于 MySQL 的 memory engine,也是表级锁;这里简单提下感兴趣的朋友请参考 SERVER-1153。

复制集改进

Replication protocol 在 3.2 之后改进了 Replication Election/Consensus 算法,通过配置协议版本来指定。主要改进点:

  • 引入 election ID 来加速 election progress,在这之前每轮选举无法给两个节点投票,并且每投票一次需要等待 30 秒才能进行下一轮,而引入 election ID 后可以加速这个进程,从而降低 MTTR( mean time to recovery )。简单来说 election ID 在每次“election attemp”的时候递增,用来区分每一轮的选举。

  • 利用已有的复制通道完成心跳检测。在这之前复制集的每个节点默认每 2 秒会给集群中的每个节点发送心跳,这显然是不 scalable 的,因为这样会随着集群的增加导致“heartbeat storm”增加集群的 overhead。而采用新的算法每个节点只需要和上下游节点通过在 oplog 中写入额外的元数据来进行心跳检测,从而提高检测速度。

  • 引入参数 election timeout。定义为:Node calls for an election when it hasn’t heard from the primary within the election timeout。针对具体的网络环境来做 trade-off,如果网络环境比较差,可以提高该值减少 false detection,反之减小。

通过以上,可以进一步保证 MongoDB 的 MTTR。关于复制集另外一个改进,加入了 read concern。

Read Concern

在 3.2 之前复制集只支持 Write Concern,因此如果想做到强一致读的话只能将 Read_Preferanence 设置为 Primary,否则依然会导致 stale read。而 read concern 的引入弥补了这个不足。类似 CAP 中 W R

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部