作者简介
张友东,阿里云数据库技术专家,Mongoing中文社区联合发起人,主要关注分布式存储、NoSQL数据库等技术领域,目前主要从事MongoDB云数据库的研发工作,致力于让开发者用上最好的MongoDB云服务,本次给大家分享上周(6.19-6.21)在芝加哥参加 MongoDB Wolrd 2017 的一些收获。
MongoDB云数据库包年5折,包月6折活动火热进行中,猛击了解详情
会议安排
Pre conference 6.19
- Advacacy summit, Pattern summmit, Workshop(SQL opt, security, ops manager, data modeling)
会议的前一天也有不少的议题,基本都是邀请制的,包括开发者峰会、合作伙伴峰会、以及一系列的收费workshop。
Conference 6.20 - 6.21
- Keynotes (09:00 - 10:50, 17:00 - 18:30)
- Session (MongoDB production intro, MongoDB internal, user case)
会议2天的安排主要分为keynotes 和 session,keynotes 是所有的参会者(1000+)聚在一块,主要内容是MongoDB公司的产品发布,产品新特性介绍,以及合作伙伴的主题演讲; Session 部分内容很丰富,每个 Session 约40分钟,每个时间段都有多个不同主题的 Session 可选,内容包括 MongoDB 产品,MongoDB 内部机制,用户使用案列等。
Just for fun
- After party: 第一天会议结束有一个after party 的活动,把参会者拉到一个类似酒吧的地方,听音乐、吃东西、聊天 ...
- Fun run: 第二天的早上有一个晨跑的活动,
- Taste beer:会议结束后,会提供各种类型的啤酒供大家品尝,参会者喝酒聊天,很有意思,可惜我对啤酒完全不感兴趣。
如此丰富多彩的活动,我只能说老外真会玩。难得出远门一趟,加上好奇心比较重,上面所有的活动我去都参加了,今年跑步带了装备,3 miles 妥妥的。
App
跟去年一样,今年大会也开发一款 APP,方便大家在手机上安排会议内容,并可以对speaker做点评以及提问,还能方便的认识其他的参会者,就是一个简单版本的朋友圈。
After party 活动现场
Taste beer 活动现场
Advocacy summit
通过 TJ 的介绍,联系到负责 Advocacy summit 的同学,参加了本次的 advocacy summit 活动,主要是 MongoDB 社区比较活跃的一些开发者聚在一块,听 MongoDB 的CXO 们聊未来的一些技术方向,针对一些 topic 进行技术讨论,一共50人左右,圆桌的形式,一整天吃饭、讨论都在这个房间了,收获很大。(注:被右后方大胖哥挡住的人就是我,[捂脸])
Atlas
MognoDB 公司在去年 MongoDB world 的时候发布来 DBaas 服务 Atlas,能基于 AWS 来构建 MongoDB 云服务,Atlas 经过一年的发展,多了许多新特性,同时还有很多特性正在开发中,非常值得期待。
Atlas feature
- Live migration,在线迁移,可以将你原来的实例数据无缝的迁移到 Atlas
- Queryable backups, 备份集支持直接查询,这样当只需要部分数据时,可以直接到备份集里查询出来,而不用恢复整个数据集
- 支持AWS、Azure、GCP,这个特性比较给力,基本上国外主要的云平台都支持上了,不论你在哪个云上,都可以方便的使用 Atlas 的服务。
Atlas future
- Perfromance advisor 支持智能的性能分析及建议
- M2 大规格实例的支持
- Full CRUD in data explore 能在atlas控制上直接操作数据,执行命令等,数据库管理员的福音
- Hosted BI connector BI分析进一步加强
- MongoDB charts integration 整合 MongoDB chart,方便的根据数据出图形报表
- Cross Cloud 未来 Atlas 能跨多个云服务商部署,可能一个复制集,Priamry 在 AWS 上,Secondary 在 Azure 上
- LDAP authentication、KMIP integration 安全方面的加强
另外今年也发布了新的产品 MongoDB stitch,能更方便的基于 MongoDB 构建应用,MongoDB stitch 目前只能在 Atlas 上使用。
Storage
Wiredtiger 团队的负责任介绍了 MongoDB 存储方面的一些开发计划
- 3.6 会支持存储引擎级别的 upgrade/downgrade,主要是有新压缩算法的支持、以及考虑将大文档的更新只存储「改变的内容」,这样可能会导致存储格式发生变化,upgrade/downgrade 就是为了支持数据级别的版本升降级。
- 3.8 会支持transaction,同时在大量集合、大量更新的场景做优化,然后完全废弃 mmapv1 引擎。
- 4.0 及以后的版本,MongoDB 会支持 LSM 来适应大量写入场景,以及针对分析场景做 column store 的支持,同时还会考虑在移动领域,以及云存储场景的应用。
Drivers
3.6 版本里,Driver 方面主要有几大改进
- 协议上的统一,MongoDB 的通信协议经过多次迭代改进,会在3.6进行统一,所有的请求走一种协议,并支持网络数据包的压缩(3.4已经支持snappy压缩,3.6会支持更多的压缩算法)。
- 支持 retryable write,所有的写都可重试,这样用户就不用担心写失败的场景,可以完全交由Driver处理(后面有个主题专门介绍)。
- Notification API,支持订阅数据库的所有修改,比如用户可以订阅指定集合的insert、update操作,当集合的数据发生变化时就会得到通知,一种典型的场景就是订阅oplog的修改,可以用于做增量备份,也可以将oplog应用到其他的地方,扩展更多的应用场景。
Unconference session
上述议题结束后,有一个 unconference 环节,议题大家现场提,每个人都可以提出想讨论的问题,每个人也可以对提出的议题投票,最后得票数比较多的议题会拿出来进行圆桌讨论,我提出向大家介绍一下 MongoDB 中国社区的发展情况,以及用户遇到的主要问题,将这些问题feedback给官方团队。
China MongoDB community: Introduction and Feedbacks
第一次用英文做分享,居然完整的讲完了,大家对中国用户会一次活动有200+人表示非常震惊,并对我们社区的工作高度赞扬,感谢社区里每一位同学的努力付出。
Mongoing中文社区(mongoing.com)今年已经在杭州、深圳、北京、成都组织了四场用户交流会,后续我们将会组织更多的线上、线下的技术交流活动,给 MongoDB 的用户建立了一个良好的技术交流平台,大家可以关注「Mongoing中文社区」的公众号,后续的技术活动、干货文章会第一时间推送给你。
Sessions
本次的 Session 内容丰富,每个时间段都有多个可选的topic,我主要关注 MongoDB internal、MongoDB schema design 等方面的主题。
Scale wiredtiger to 1m collections
这个topic里介绍 wiredtiger 如何支持100万个集合,wiredtiger 相比 mmapv1 有很大的性能提升,但在大量集合的场景,wiredtiger 的表现不如 mmapv1,是因为 wiredtiger 每个集合/索引都对应一个物理文件,对文件系统的性能依赖很大;而 mmapv1 将同一个数据库的数据合并存储在一块,不会产生大量物理文件。
Wiredtiger 在成为 MonogDB 存储引擎之后,发现很多最初的设计跟 MongoDB 的场景是不相匹配的,比如wiredtiger假设用户只会创建很少的table,也只有少量的线程会并发读写,而在 MongoDB 的场景里可能会有大量的集合,同时因为 MongoDB one thread per connection 的网络服务模型,会导致同时可能有大量的线程读写wiredtiger数据。
Wiredtiger 为了更好的支持大量集合的场景,主要做了如下改进
- cache handle 的管理,由原来的链表改为hash表,实现O(1)的查找和删除。
- eviction 和 checkpoint 的时候,考虑到大量集合的场景,而大量集合中可能只有少数集合是活跃的,会尽量高效的跳过未修改的集合数据。
- 增加 --groupCollecitons 选项,同一个数据库的所有集合及索引只会对应2个wiredtiger的table,一个用来存储数据,一个用来存储索引;这个特性目前还在开发中。
Session in MongoDB 3.6
这个topic 主要介绍 3.6 版本里即将引入 的 Session 特性,Driver 连接 MongoDB server时,可以先建立一个 Session,Session 的状态信息会存储到 server 端,即使 Client 断开重连,Session 的信息不会丢失,基于这个特性,在3.6里会实现
- Retryable write,因为 Session 信息在server端,所有的写操作在客户端都是可重试。
- Session 自动超时,能自动回收 Session 关联的所有资源
- 实现 cluster 级别的killOp,mongos 上的 Session,mongos 会自动跟 shard 上的 Session 关联起来,当用户 killOp 清理 mongos 上的Session操作时,mongos 会自动将 shard 上关联的 Session 操作也清理掉;用户不再需要连接到每个shard上去逐个 killOp。
Advanced schema design
这个 topic 主要介绍文档数据库常用的设计模式,其实这些模式都是比较通用的,在很多场合都适用。
Attribute
文档数据库最大的特点就是其灵活性,可以通过 field: value 来表达各种数据,在设计时field可以尽量抽象成 attribute,比如一个文档用于记录每个城市的气温。
{
weather:
{
wuhan_temp: 30
hangzhou_temp: 28
beijing_temp: 20
...
}
}
这样做有个比较大的问题就是字段数量不确定,并且非常不便于索引,更好的方式应该是进一步抽象,提取出城市以及气温这2个Attribute,比如
{
weahter[
{city: "hangzhou", temp: 30},
{city: "wuhan", temp: 20},
{.... }
]
}
这样改进后结构更清晰,而且能方便的针对 weather.city, weather.temp 建索引。
Subset
Subset 主要针对大文档,在有些场景,用户的文档可能很大,但需要访问/修改的部分可能很少,其中大部分内容都是静态的,并且很少被访问,这样的数据就没必要加载到内存,这样就可以通过 Subset 的方式,将静态很少被访问的数据以子集的方式存储到其他地方。比如下述文档
{
field1: value1,
field2: value2,
...
filedN: { } // very big, and rarely access
}
这是可以将filedN 存储到另外的集合,然后加上对应的引用,这样就只有经常需要访问的数据被加载到内存,内存利用的效率更高。
Computed
Computed 主要用于减少频繁需要的重复计算,比如针对某个集合,经常需要对集合的某个字段进行求和,这是就可以考虑在每次插入时,进行求和计算,并把计算结果存储下来,这样每次求和时就不用全表扫描来计算。
Approxmiation
Approxmiation 是 Computed 的改进,如果每次插入时更新计算结果开销太大,并且应用能够接受不精确的结果,则可以考虑周期性的进行更新,比如MongoDB本身对集合的文档数、大小信息就是使用周期性更新的策略来维护的,所以每次db.coll.count() 都能很快的返回,但风险就是如果中间出现crash,可能导致count值与实际文档数不一致。
Overflow
Overflow 主要思路是将数据存储到多个bucket里,比如以天为单位组织数据,先把数据存储到当天的bucket(也可以是一个集合),到第二天又创建一个新的bucket存储新的数据,划分bucket的方式可以很灵活。
Sizing your cluster
这个 topic 主要介绍如何做容量评估,主要几个方面
- Data size 根据需要的集合数量、文档数量、以及文档平均大小来预估总的数据量,来评估需要的磁盘存储空间
- Working set 根据索引大小、经常需要访问的文档数来预估活跃数据集来评估需要的内存大小
- Queries IOPS 根据读写访问请求评估需要的IOPS量
- Shard Collections 根据容量、读写需求评估是否需要进行分片,以及分片的规模
上面的方法只是一个理论上的预估,要精确的了解容量及性能需要,最好是进行实际测试来评估。
Duriablity over sneakernet
这个 topic 主要介绍WriteConcern、ReadConcern的设计初衷,以及各个level分别解决什么问题,这个官网文档很详细了就不做过多的介绍了。值得一提的是,Speaker 以独特的方式演讲,把问题解释得非常透彻,大写的服。
Others
- 其他还听了关于 Index selection、MongoDB perf 理论及实践的topic,内容都非常的好,但太过细节不太好整理,这里就先忽略了,等PPT出来大家可以学习下。
- 国内还有华为、东航的同学参加了 MongoDB world 17,他们都是MongoDB的客户
- 今年关于Giant ideas的分享有好几场,印象比较深的是 Matt Parker 关于数学的一场演讲,把很多数学问题搞得很有趣,比如通过excel来模拟照片,通过多米诺骨牌来模拟与非门。