MongoDB爱好者
垂直技术交流平台

MongoDB 4.2新特性:分布式事务、字段级加密、通配符索引、物化视图

MongoDB 4.2已经发布,我们来看看它增加了哪些新特性?分布式事务?数据库加密?通配符索引?

在2019年MongoDB World大会上,CTO Eliot Horowitz介绍了MongoDB 4.2中的一些功能,这些功能扩展了其在数据库技术方面的领先地位:分布式事务(Distributed Transactions),字段级加密(Client Side Field Level Encryption),通配符索引(Wildcard Indexing)、按需物化视图(Materialized Views)。

1

这些都是重大的改进,表明MongoDB在企业级功能方便更加完善。

MongoDB 4.2提升了事务和分析技术水平。它提供大规模的分布式事务的ACID担保和复杂的数据处理流程,还有最先进的加密控制保护机制。我们可以在任何地方运行MongoDB4.2:在本地数据中心,云上、混合云、Atlas云上。我们可以获得阿里云、AWS,Azure和GCP可用的完全托管,云原生的MongoDB服务。阿里云全球第一个实现了MongoDB异地多活架构。可以支持互联网跨国公司的大规模出海业务。

现在使用MongoDB的公司越来越多了,技术架构方案也越来越成熟。MongoDB新特性也是为了满足更多的企业级业务场景需求。

1. MongoDB 4.2 新特性

先来大体上看看有哪些改进,作为4.0的加强版,事务特性做了增强,之前支持跨文档事务(复制集群),现在支持分布式事务(分片集群)。索引功能也进行了小改动,支持通配符索引,其实类似我们知道的ES搜索的字符匹配搜索,而且是不定字段模式。安全性也开始全库加密和特定字段加密。

  • ACID保证:分布式,跨分片集群节点分布式事务,全局时间点读取和可变分片键值。
  • 查询和分析:Atlas Data Lake,按需物化视图,通配符索引和MongoDB图表,用于丰富数据可视化。
  • 弹性和伸缩性:可重试的读写,集群新节点选举速度提高10倍,Zstandard压缩
  • 企业安全性:客户端字段级加密,支持支持无停机多个CA机构证书轮换,降低了3倍数据库审计的开销成本。
  • 随处运行:Atlas自动扩展,全文搜索服务,以及支持与Kubernetes和Apache Kafka集成。
    K8s也是火爆的不行,面试处处问容器,技术圈子好装逼,复杂的配置容器还是难以实现,还是需要人工介入。

2. 分布式事务

事务从跨文档事务级别,扩展到分片集群的分布式事务级别。用不用先不说,有了这个功能,起码部分特殊业务场景可以作为备选方案。

4.2版本已经发布,4.0的多文档ACID事务支持的分布式事务,MongoDB4.2扩展提供更高级别的事务功能。使用分布式事务,事务将能够跨MongoDB Atlas的全局集群工作,并允许大型分片部署(包括跨多个区域的部署)来处理这些操作。

分布式事务在保持多语句操作的完全原子性的同时完成所有这些操作。如果任何事务无法在分片上提交,则会中止该事务中涉及的所有分片操作。比较好的一点就是使用4.2分布式事务与使用4.0的多文档事务完全相同。这意味着我们可以使用相同的熟悉的关系式事务语法,并且在扩展分布式事务时,客户端代码不需要修改。做到无缝迁移。

MongoDB4.2引入分布式事务引入同时来带来了许多其他新功能。例如,可变的分片键值key,更大规模的事务,驱动程序端的帮助类和记录度量数据,都使得开发更加容易。以可变分片键值为例。由于能够更改数据记录的主键key,该记录可以在分片集群之间迁移数据,从而允许全局重新分配数据或分层存储归档旧的数据,只要能在60秒的事务运行时间限制内完成即可。

有了分布式事务,MongoDB现在可以支持大多数业务场景,比如极端数据一致性要求的电商、支付、订单等场景:文档级ACID事务,跨多文档事务,到全局分布式集群事务。

3. 客户端字段级加密

全库加密比较简单,很多数据库也开始支持,但是字段级加密,复杂度比较高,但是加密策略会更加灵活,很多时候只需要对敏感字段加密,比如价格,或者供应商的手机号加密。MongoDB4.2的这个新特性还是比较实用的。当然之前大多数加密需要应用开发人员自己实现。

MongoDB提供了一系列安全选项,从端到端加密(E2E)实时加密到静止数据加密,细粒度的基于角色的访问控制(RBAC)和全面的审计功能。由于某些特殊的法律所要求的严格性,可能有时候需要从数据库中安全地选取,查询和存储加密数据,而这些加密后的数据,数据库却不能读取解密,这个也就是客户端加密,严格保证数据库的安全性。

2

这个是必须始终在数据库中加密并且仅在客户端解密的数据加密模式。MongoDB新的Field Level Encryption新特性就是为了解决这一挑战。使用此功能,服务器不知道要加密的字段。所有加密和解密都在驱动程序级别完成。

它是驱动程序,当它看到写入或查询命令中涉及加密字段时,从密钥管理器获取适当的密钥,加密数据并将其发送到服务器。然后服务器只看到密文并且不知道密钥。当从服务器返回结果时,服务器将该密文发送给驱动程序,并且已经有密钥的驱动程序对其进行解密。从应用程序的角度来看,这种机制是完全透明的,客户端应用完全不知道数据库进行了什么加密操作。

密钥管理也远离数据库,可以将密钥绑定到单个记录或用户账号。这样也使得删除用户加密信息变得容易。通过删除密钥管理系统中的相关密钥,可以有效地删除使用该密钥加密的所有数据。这也意味着我们可以安全地使用MongoDB Atlas等托管服务,因为他们知道数据永远不会在日志,内存或基础架构的任何其他部分中以未加密的方式显示。

如果你曾经手工写过数据库数据加密代码,肯定理解加密和解密,以及保证秘钥安全性等规则的复杂程度,数据库数据加密简单的对称加密很好理解,关键还涉及到秘钥的保存,安全性、以及加密算法和字段的灵活替换,还有客户端和数据库端如何做到加密解耦。那么MongoDB 4.2中的字段级加密的简洁设计可以帮助我们解决这个问题,真正提高大家的工作效率。

2019年国家出台法律法规,要求大型互联网、金融、政府机构必须通过严格的等级保护审查,相信这个功能非常的及时。当然如果你有更复杂的等保安全需求,可以联系我,也可以联系阿里云,中国唯一的通过等保三级和金融云等保4级的云计算公司。阿里云安全团队有丰富的经验可以帮助客户建立严格的安全系统,通过等保评审。

注:被攻击或者数据泄露多了一层防护,起码不会立即被破解,导致大规模的数据风险,又加上等保的法规,很多公司必须要做系统安全,这是不错的一个解决方案。

4. 通配符索引

索引大家都很熟悉,数据库基本都有自己的索引机制,而且支持的索引类型差别也比较大,MySQL、Oracle、ES、Hbase都有自己的实现,索引类型和算法差别很大。Mongodb4.2新增的通配符索引,也比较特殊,说白了就是某个字段不确定,某些字段确定,但是可能需要针对不确定的字段做快速搜索匹配,这个和全文索引差别还比较大,应该是为Document级别的数据提供了更多的索引灵活度。

通配符索引是灵活文档模型提出的问题的答案; 我索引建立在什么字段上,要查询什么字段,一切可能都不确定?虽然有时候很容易分辨哪些字段创建索引,但有些情况下还是比较难以判断。例如,我们电商网站可能在子文档中有一组可变字段来表示商品的特征,并且当销售从衣服到汽车、手机、化妆品等的所有商品时,这些字段有很多不同的特征,但是用户希望快速搜索到这些商品。使用MongoDB4.2的通配符索引,可以为该子文档中的所有特征字段创建索引,并创建一个涵盖所有这些字段及其值的索引。

大家想了解详细信息,可以阅读官方文档“MongoDB 4.2-1:通配符索引”中阅读有关此新特性的更多信息,
https://www.mongodb.com/blog/post/coming-in-mongodb-42–1-wildcard-indexes

如果有基于MongoDB的社交APP或者电商App,比如某些商品的标签、或者某些个人的标签,后期有搜索某个标签的人群,比如搜索喜欢动漫、健身、跑步、音乐标签的人群,这个索引就比较合适。轻量级APP平台可以基于MongoDB快速实现。而又不需要ES这种全文搜索的海量数据规模。一定程度上降低了数据搜索的体量。

5. 物化视图

这个功能特性的目的,就是缓存计算结果,以便于后期高并发反复使用此前的计算结果。达到改善数据库性能的目的。

MongoDB4.2支持创建数据集视图,向客户端应用程序呈现大数据分析的结果,预计算(提前计算)或仅过滤数据集部分结果。所需要的只是将$out运算符放在MongoDB聚合管道的末尾以创建新集合来缓存分析的数据结果。当我们想要更新结果时,可以重新运行命令并再次写出所有记录。

在MongoDB 4.2中更加简单,方便,不需要每次重新运行全部命令:我们可以使用新的$merge运算符来更新视图集合。可以控制新文档的更新方式,并可以在新视图上使用索引以加快访问速度。再提一个优点,物化视图可以分片存储,并且可以完全控制视图的更新时间。

MongoDB 4.2 下载

可以下载最新的4.2版本,安装试用
https://www.mongodb.com/download-center/community

3

参考资料:
https://www.mongodb.com/collateral/mongodb-4.2-guide-to-what-is-new
https://www.mongodb.com/new

作者:徐雷
MongoDB中文社区联席主席;
《MongoDB实战》第2版译者;
阿里云大学讲师;阿里云栖社区讲师;
目前就职于阿里巴巴,架构师。

赞(12)
未经允许不得转载:MongoDB中文社区 » MongoDB 4.2新特性:分布式事务、字段级加密、通配符索引、物化视图

评论 2

评论前必须登录!

 

  1. #1

    新的$merge运算符来更新视图集合,这里指的是每次手动执行一次物化,
    db.votes.aggregate([
    { $match: { date: { $gte: new Date(“2019-05-07”), $lt: new Date(“2019-05-08”) } } },
    { $project: { _id: { $dateToString: { format: “%Y-%m”, date: “$date” } }, thumbsup: 1, thumbsdown: 1 } },
    { $merge: {
    into: “monthlytotals”,
    on: “_id”,
    whenMatched: [
    { $addFields: {
    thumbsup: { $add:[ “$thumbsup”, “$$new.thumbsup” ] },
    thumbsdown: { $add: [ “$thumbsdown”, “$$new.thumbsdown” ] }
    } } ],
    whenNotMatched: “insert”
    } }
    ])
    像以上语句,难道只能过分钟就要到数据库里执行一次这个语句吗?没有办法让它自动执行吗?我应用场景是希望10分钟就执行一次。
    2、文中提到的可以完全控制视图的更新时间,这个又是怎么做的呢?
    现在社区内或是其他博客中都没有提到相关的物化视图的使用。官网的也只是给了生成物化视图的例子。

    weibinlong4年前 (2020-07-17)
  2. #2

    物化视图没有自动触发的功能吗?

    weibinlong4年前 (2020-07-17)