开发者社区> 张友东(林青)> 正文

MongoDB World 2016参会全记录

简介: 上周和 @叶翔 一起参加了在 纽约举行的MongoDB World 2016,MongoDB作为一个NewSQL数据库越来越受关注,这一点从google趋势、百度指数都可以看出来。 本次会议举办得非常用心,演讲主题丰富,涵盖了MongoDB产品规划、内部实现、 用户案例、devops、
+关注继续查看

上周和 @叶翔 一起参加了在 纽约举行的MongoDB World 2016,MongoDB作为一个NewSQL数据库越来越受关注,这一点从google趋势百度指数都可以看出来。

本次会议举办得非常用心,演讲主题丰富,涵盖了MongoDB产品规划、内部实现、用户案例、devops、driver使用等很多内容,能满足各种不同岗位听众的需求。我目前在阿里云数据库团队主要负责MongoDB源码方面的开发工作,所以重点会放在MongoDB内部实现的部分,接下来跟大家分享下参会的一些重要内容及感悟。

MongoDB 3.4 preview

MongoDB的版本迭代非常快,我接触MongoDB还不到一年的时间,已经经历了MongoDB 3.0、3.2两个大版本,云数据库为了跟官方保持同步,已经使用了最新的3.2版本。大版本的发布,新功能改进上还是非常给力的,比如3.2相比3.0版本,重大的改进包括:

  • 默认的存储引擎从mmapv1切换为wiredtiger,提升性能的同时也能通过压缩降低存储成本
  • 复制集的选举使用raft协议,可靠性进一步增强
  • 支持文档校验功能(document validation)
  • 支持left join($lookup)
  • 支持in memory存储引擎(企业版),MongoDB支持复制集各成员使用不同的存储引擎,应用场景的想象空间很大

本次会议上介绍了下一个大版本3.4里的主要特性

总体看来,MongoDB还是很注重社区反馈的,像collation、只读视图的功能都是社区vote比较多的特性;企业版本支持上,3.2里只有企业版支持的功能主要包括审计日志、数据加密、mongodb compass/ops manager、bi connector,in memory存储引擎,大都是数据库外围的增值功能,放在商业版本里很能理解,但in memory存储引擎放到企业版我觉得很意外。

数据库引擎是MongoDB核心的组成部分,开发一个新的引擎很复杂的,而且引擎在各个场景下是否能表现得符合预期,不经过大量的使用验证是很难稳定的,以wiredtiger为例,wiredtiger在作为mongodb存储引擎之后,社区的各种使用案例遇到的问题也帮助wiredtiger改进了很多;希望官方能把in memory引擎放出来,让社区一起来提升它,这样MongoDB就能适应于更多场景了,比如在缓存的场景代替redis...成为真正强大的NewSQL。

MongoDB Atlas

本次大会最重量级的内容就是MongoDB Atlas Cloud Service的发布,MongoDB公司正式提供Database-as-a-service服务模式,用户可以选择在AWS(后续可能支持azure,gcp)上部署MongoDB云服务,模式跟现在的mlab类似。

Async network framework

这个主题主要介绍MongoDB 3.2异步网络框架的改造,Mongos跟Mongod的通信,典型的流程是connect ==> auth ==> [send request ==> recv response] * N ==> close,在之前的版本里整个过程是按顺序同步进行的,总体效率很低。

在3.2里实现了Async network framework,采用状态机转换的模式实现异步通信。一个线程池负责做实际的工作,并处理状态转换。请求的状态可分为『connect、auth、send、recv、close』等状态,connect状态会触发线程执行connect动作,并在连接成功的回调函数里将请求设置为auth状态,然后auth触发认证过程,成功后进入send状态,依此类推...整个过程异步化。

目前这个网络框架主要用于mongos与mongod、复制集mongod之间的通信,driver到MongoDB之间还是connection per thread的模式,跟MongoDB的工程师交流了下,这块有改进计划但不在3.4里。

Async network framework在设计实现时还考虑了代码可读性方面的问题,异步代码是非常难读的,各种回调很容易把人绕晕;MongoDB在在实现时大量使用了C++ 11的lamda表达式,尽可能将异步的代码写得『同步化』,以提升代码可读性。

Raft Protocol in MongoDB

从3.2版本起,MongoDB使用raft协议来保证一致性,这个主题思远同学在之前中文社区的Webinar也分享过,有兴趣的同学直接去看中文的PPT及视频,不做过多介绍。

Sharded cluster

这个主题主要介绍了Sharded cluster的config server从『多个独立mongod节点』演变为『复制集』后的一些设计考虑。

config server改为复制集模式后,复制集的备节点同步可能存在延时,而且primary节点还可能出现回滚(rollback)的情况,为了让所有mongos看到一样的视图,一致性的问题得重新考虑,3.2版本里引入了Read Concern的功能来解决这个问题。

mongos向config server写入时,使用默认的write concern,但读取时使用read concern majority级别,确保读取的数据已经成功写入大多数节点,这样就不会读到可能会回滚的数据了;

但光靠majority还不够,读到的数据可能不是最新的,比如3节点复制集,primary上成功更新了信息,比如chunk迁移后更新路由信息,但2个secondary还未同步,通过majority级别的read concern读取时,仍然可能读到未更新的路由信息。为了解决这个问题,在readConcern里加了一个afterOpTime的选项,指定读取的数据一定在某个时间戳以后,以确保读到最新的数据。

Testing Infrastructure

本次大会有好几个分享MongoDB内部测试相关的主题,我听了3个分享,分别讲MongoDB的持续集成测试、宕机测试、性能测试,感觉MongoDB在测试上的确做得很好,非常值得学习,总的来说就是将所有的测试『自动化』。

MongoDB使用evergreen(evergreen目前也是开源的)做持续继承测试,因为MongoDB实现上包含很多模块如replication、sharding、index等,再加上MongoDB是能在linux、windows、solaris等多个平台上运行的,测试是相当难做的。

MongoDB通过evergreen来实现自动化的持续集成测试,其自动追踪代码commit,并根据配置(哪个模块、哪个OS平台、哪些测试case)来执行测试,测试通过后,将代码提交到内部的代码仓库。绝大部分的测试工作都是在AWS机器上完成的,而且ervegreen还能弹性的控制测试需要的AWS的机器资源,以尽量降低成本。

为了保证MongoDB在异常情况下的数据可靠性,需要针对MongoDB运行的不同环境(虚拟机 or 物理机)进行断电测试,他们使用一种可编程插座来实现通过ssh的方式来自动启停服务器,以模拟断电测试环境。

性能测试(这里说的性能测试并不是说单纯测MongoDB的服务能力,目的是要发现MongoDB可能存在的性能问题,并进行优化),性能测试的基础还是『测试自动化』,多种workload持续测试,当发现性能问题后(有的问题可能要跑很久才会出现),就做case study,分析原因以及如何让问题重现,然后改进代码,重新测试...直到问题解决。

Wiretiger cache调优

wiredtiger cache的配置是个老大难的问题,社区里最近很多用户遇到持续insert场景下,cache满了之后,cache evict导致请求响应很慢,通过设置小的cache size可以缓解这个问题,所以wiredtiger的cache并不是越大越好。

wiredtiger的cache里存储解压缩后的数据,访问时如果WT cache命中,则直接读取数据;如果cache不命中,则会在OS page cache查找,再不命中则从磁盘读取。如果WT没有开启压缩、加密,则数据不会存储到WT cache里,相当于关闭了cache(这一点未实际验证过)。

对于WT cache的配置,没有明确的规则,建议如果读多写少,可以配置较大的cache size;如果写多读少,则配置较小的cache size。

存储引擎API及mongorocks

MongoDB 3.2已经支持wiredtiger、mmapv1、in-memory存储引擎,其他的一些存储引擎比如rocksdbterakdb也对MongoDB做了适配,但没有被合到官方代码里。

MongoDB存储引擎适配工作量还是很大的,需要实现的接口挺多,还需要考虑各种可能的优化,比如wiredtiger引擎针对oplog采用特殊的删除策略来提升性能。希望存储引擎API的抽象能做得越来越好,适配起来更简单,这样才能让更多的引擎加入进来,让用户能有更多的选择。

SQL Proxy (BI Connector)

MongoDB 3.2企业版里支持bi connector来适配了多种bi分析工具如tableau等,通常这些工具都是直接使用SQL来进行数据分析,MongoDB开发了SQL proxy用于实现从sql到MongoDB的查询语言MQL的转换。

SQL里大部分操作都在MongoDB里都能找到对应操作符,重点需要解决数组字段的查询、MongoDB在实现SQL PROXY时,把数组的多个元素当做多个文档来看待(类似与$unwind操作符的工作),目前也有类似的项目做SQL到MQL的转换,如querymongo

其他

  • 国外技术会议参会平均年龄远大于国内,现场见到不少白头发的老头
  • MongoDB专门为会议开发了一个app,每个参会者会发一个小的智能设备,相互碰一下,app上就会自动加好友,app的数据就存储在MongoDB,这是对技术最好的诠释。
  • 会议除了技术分享,会议第一天晚上安排了一个after party的活动,把参会的人拉到酒吧,听歌吃东西;第二天早上还有一个跟CTO一起晨跑的活动(老美的身体都太棒了,跑了几分钟就被甩得跟不上了,经常锻炼太重要了),会议结束后大家一块在会场喝啤酒、吃点心聊天。整个会议感觉很棒,学到了也玩到了。
  • foursquare是目前我了解到使用MongoDB规模最大的公司,部署节点700+,大量使用shareded cluster,MongoDB大有可为
  • 百度、东航分享了使用MongoDB的经验,关注度很高,尤其百度的同学分享后很多听众提问
  • MongoDB的slogan是FOR GIANT IDEAS,本次会议也有2场keynote的分享跟技术及MongoDB无关,而是分享一些『很有创意的想法及实践』。

阿里云数据库团队常年招工,欢迎加入,和我们一起实现Giant Ideas!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
CentOS 6.5下通过yum安装MongoDB记录
最近想尝试一下英特尔的基于WebRTC协同通信开发套件,其中的CS_WebRTC_Conference_Server_MCU依赖MongoDB。 MongoDB是什么? MongoDB 是一个基于分布式文件存储的数据库。
1031 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14237 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28400 0
MongoDB · 捉虫动态 · Kill Hang问题排查记录
AliCloudDB MongoDB在开发过程中遇到一个无法正常退出的BUG,由于是Release版本的编译(-O3),debuginfo已经不能很好的展现出堆栈的情况。这时又该如何确定问题所在呢?本篇文章完整的记录了整个排查过程。 场景 kill命令正常执行,但进程迟迟没有退出。非必现场景,在
1499 0
MongoDB World 2017 参会全记录
本文主要给大家分享上周(6.19-6.21)在芝加哥参加 MongoDB Wolrd 2017 的一些收获,MongoDB World 是 每年 MongoDB 数据库的盛会,来自全球的 MongoDB 技术爱好者聚集在一起讨论 MongoDB 产品及技术的发展情况。
7277 0
Linux文本模式下录制、回放和共享操作记录(script、scriptreplay、mkfifo)的妙用
在生产中,有时候需要把别人的操作过程录制下来,后期可以进行回放查看。还可以实时共享自己的操作,让另一个人在千里之外指导你进行操作。
2685 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20321 0
MongoDB 杭州用户会全记录(千寻位置、妈妈帮、阿里云专家等精彩分享)
MongoDB杭州用户交流会于2017年3月12日下午在阿里巴巴西溪园区举行,吸引了来自全国各地的近300名用户参与,千寻位置、妈妈帮、阿里云等公司的5位技术专家分享了MongoDB 的运维管理及使用经验,干货满满。
6738 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23543 0
+关注
张友东(林青)
阿里云高级技术专家
105
文章
18
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
相关文档: 云数据库 OceanBase 版 可信账本数据库 云原生关系型数据库 PolarDB PostgreSQL引擎
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载