MongoDB到现在已经走过了12个年头了。就在今天刚刚发布了5.0版本。来看一下新版本发布了哪些新功能和特性~官方选择从4.4直接跳到5.0可能也是为了表达出该版本变化比较大(调整了发布节奏)的含义。
从上图加粗的几点特性来看,主要功能包括:
Time-Series collections
原生时序表支持Clustered indexes
聚簇索引Window functions
窗口函数New temporal operators
新的时间相关操作符Live resharding
实时重新分布Multi-cloud
混合云在发布会上展示了更多,一起来看看细节。😃
本地时间序列,本质上是 扩展和加强MongoDB在时序数据处理方面的能力 。(可能因为发现很多客户都把原本存在MongoDB的数据迁移到ElasticSearch中去做时序数据的分析所以才想去着重加强这一块的能力。)
什么是时间序列集合? 本质上,MongoDB5.0新引入了一种集合类型(回想一下,之前有capped collection,普通集合,系统集合以及基于普通集合的视图),并且对这种集合进行了针对性的支持和优化。
哪些数据适合? 所有跟时序有关的都可以,比如金融交易,各种智能终端/传感器的监控数据。官方使用的例子是全美各地的天气数据(温度、湿度等)。
创建时序集合会在后台创建一个普通集合和一个自动创建的对应的可写非物化视图( non-materialized view
),该视图作为抽象层。该抽象层允许用户始终将数据作为原始的单个文档来进行处理,因此用户不需要再关系时序数据是如何存储和持久化的,只需要关注业务层该如何使用或分析这些时序数据即可。
如何使用?
使用方式一如既往的简单,基本上跟使用普通集合没有什么差异。只是需要在特定的字段上补充 timeseries
关键字即可。
创建一个名为weather
的时序集合:
db.createCollection("weather", {
timeseries: {
timeField: "ts",
metaField: "source",
granularity: "minutes"
},
expireAfterSeconds: 9000
});
其中:
timeField
字段为时序字段,其类型必须为MongoDB支持的时间类型比如 ISODate("2021-05-20T10:24:51.303Z")
。metaField
为元数据字段,可用来创建二级索引,比如标记时序数据的来源等。MongoDB会自动将一段时间内具有相同metaField的测量值聚合到一起并做,以消除存储层中该字段的重复。granularity
为粒度字段,即时序数据的更新频率,默认为秒级( seconds
)。expireAfterSeconds
过期字段,并非新增字段。时序数据配上TTL索引,让时序数据可以自动淘汰。如果建时序表的时候指定了
expireAfterSeconds
,则不需要再创建TTL索引了。之后想修改时间需要使用collMod
命令。未来还可以配合Atlas在线归档(Online Archive
)功能来进行使用。
作为初期版本,时序表还有一些 限制 ,比如:
主要是为了解决版本更新的难题 。
很多线上业务希望使用新版本的新特性,但是出于各种原因考虑,普遍不太敢去做线上数据库的升级。数据库升级对于运维同事而言也是不小的挑战。中间涉及到的代码变更,驱动升级,全面的兼容性测试等等都带来了大量的工作量。Versioned API可以在这样的场景下发挥作用,也就是说数据库升级到了更新的版本,但是存量业务还是会使用旧版的API来进行访问。不会存在不兼容的问题。换句话说,该功能 将应用程序的生命周期与数据库的更新彻底解耦了 。
尝试彻底解决数据库初始建模不合理的问题 。
在4.4以前的版本,shard key一旦定义好就是不可改变的。很多业务在运行了很长时间,积累了大量数据后发现自己的shard key不合理,想变更就很困难了。普遍只有两种方式:1)停服搬迁(dump&load);2)在线迁移(live migration)。前者需要很长的停机维护时间,后者需要花费较长时间而且需要业务自行处理各种复杂的逻辑(DDL,孤儿文档,数据一致性问题等),均不是最优解决方案。
我们看到在4.4版本官方推出了refinable shard keys。但是只是通过在shard key上添加后缀的方式来实现数据分布的调整。正如其名所展示的,这只是refine,并不能彻底解决shard key不合理的问题。
Live Resharding
可以理解为官方自己在MongoDB内部实现了 live migration
并处理了各种复杂的情况和一致性问题,对于那些初始shard key不合理但是又拥有庞大数据量的业务非常友好。
使用方式也很简单,只是一条mongos上执行的command而已:
db.adminCommand({
reshardCollection: "<database>.<collection>",
key: <shardkey>
})
当然,此功能也会有一些限制,仅列举一部分,细节可参考官方文档:
addShard
以及表级别的 createIndexes/renameCollection
等在线归档功能,目的是为了解决 数据降冷 的需求。
基于serverless理念的无服务器实例,暂时还没正式上线Atlas平台。可能会主推两个产品: elastic database model & serverless model
。
和其他serverless的产品(比如 Lambda
、 DynamoDB
、 cloud function
)类似,支持以下能力:
Versioned API
的能力可能是看到其他云服务提供商基于MongoDB在做类似的事情,官方决定自己下场做了,让我们期待一下。
两者能力集成 。可以基于data lake中的数据快速创建和分享可视化图表。
底层基于lucene,支持全文搜索功能。
新增了对函数评分的支持 ,允许在文档字段上应用数学公式来计算相关性,比如受欢迎程度或距离——例如,据有更多或更好评论的较近餐厅将在搜索的结果列表中会更靠前。另外新支持了 自定义搜索同义词集合 来支持更普遍的用户查询。
Realm 让用户在手机、平板电脑和树莓派等物联网设备上拥有简单、强大的本地持久性。其本质是为了解决终端数据同步的问题。让开发人员可以直接与存储对象交互,而不需要考虑ORM或者数据库语法。今年早些时候发布了 Realm Sync,支持终端设备与atlas数据库后端之间同步数据。
新增功能为:
新的mongo shell,引入了语法突出显示、智能自动补全、上下文帮助以及有帮助的错误信息,可以为MongoDB用户创建更直观的交互式体验。
window function
;$dateAdd
,$dateDiff
,$dateSubtract
,也是为了更好支持时序数据的处理read concern "snapshot"
),而且可以设置保留时长dbstats
和 serverStatus
命令输出结果更新,会展示更多系统/库表相关信息仅代表个人意见,欢迎交流~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。