青胜于蓝!这里有数据库的一点新资讯!

2021-08-06 10:40:12 浏览数 (1)

导语 |  腾讯云MongoDB目前广泛应用于游戏、电商、ugc、物联网等场景,为了更好地为客户提供服务,腾讯数据库团队对MongoDB进行升级,诞生了青胜于蓝的腾讯云MongoDB 4.2版本,并且已经正式在腾讯云发布啦,让我们一起来看看新版有哪些亮点吧~

一、 CMongo 介绍

MongoDB作为时下最流行的nosql数据库,是一款集高性能、分布式、易扩展等特性为一身的文档型数据库,同时其易用性和功能丰富程度是其他同类产品所不能比拟的。

CMongo是腾讯云数据库联合团队基于开源MongoDB,进行深度内核优化的MongoDB管理平台,支持腾讯云和内部上云

二、开源版本新特性

今年7月份,CMongo平台正式上线了MongoDB 4.2版本,腾讯云官网现在已经发布,新版本推出了哪些新功能和改进呢?来让我们一起围观~

(一)分布式事务

MongoDB在4.0版本就已支持单副本集事务,4.2版本开始支持分布式事务,新版本采用传统的二阶段提交的方式来保证事务的ACID特性。分布式事务与副本集事务的使用方式完全兼容,用户在使用事务时无需关注自己的库表类型。

1.适用场景

通过分布式事务,MongoDB极大地扩展了自身所适用的业务场景,主要包括

  • 支付及高频交易系统:例如证券、股票交易数额更新;
  • 事件流处理:一系列复杂且有顺序要求的事件更新和存储;
  • 账单系统:例如用户订阅新的手机服务,更新每月话费详情等;
  • 分片数据重分布:支持分片键的原地修改(后面有详细说明)。

2.使用限制

此外,分布式事务仍存在一些限制需要注意

  • 使用分布式事务需要升级API驱动至4.2以上版本。
  • 默认的事务执行最大时间为60s(可调整)。
  • 涉及多个分片的分布式事务受网络影响带来的性能损耗较大。
  • 和副本集事务一样,分布式事务同样没有限制一个事务中最大的文档读取次数,但一般来说建议一个事务中读取的最大文档数不要超过1000;事务中写入的文档数较多时,建议拆分成多个不同事务进行分批写入。
  • 分布式事务的读级别为快照读。
  • 事务执行期间,集群中有新的分片或分片中有新的Arbiter加入时,正在执行的事务会自动失败并回滚。
  • 事务执行期间会影响涉及到的分片表的balance性能。

3.基于分布式事务的功能增强

得益于分布式事务的推出,MongoDB 4.2在新版本对数据库的功能进行了增强,主要有以下3个方面

(1)取消事务的大小限制:4.2之前的事务,最大只支持总共16MB大小的数据写入,新版本则没有这些限制,事务中写入大于16MB的数据会被自动拆分。

(2)事务性能指标统计:支持通过currentOp和serverStatus命令查看当前正在执行的事务;事务执行性能的一些相关指标如耗时、扫描文档数、获取锁的次数等,也会被记录到日志中。

(3)事务错误处理:新的API驱动支持自定义回调函数来进行事务的后处理。

4.支持分片键原地修改

在4.2版本前,用户在建立分片表时需要预先指定分片键,并且当分片表建立后,不支持对分片键进行修改。如果用户觉得当前分片表的分片键不合适,想要修改分片键时,只能重新建立一张新的分片表并手动从旧表中进行数据的拷贝,过程繁琐耗时。

但好消息是,从4.2版本开始MongoDB支持对分片键的原地修改,用户可以直接通过修改分片表的分片键来令集群的数据进行重分布,底层的数据搬迁等功能会自动且透明地进行,这一过程同样也不会影响分布式事务的读写。

(二)查询能力增强 MongoDB具有丰富查询语句、聚合框架和二级索引,用户可以使用多样的方式进行数据的查询,比如条件过滤、范围查找、多表关联查询、地理查询等。在4.2版本,MongoDB又推出了一系列查询语句进一步增强了其数据查询的能力。下面我们将逐一介绍这些功能。

1.物化视图

MongoDB可以通过创建视图(view)来动态地查询和聚合多个表中的数据,创建视图并不会真正写入数据,而是会在读取视图时才去按照预先定义好的条件过滤和聚合多个表中的数据,所以MongoDB中的视图可以认为是一张“虚拟的”表。

在4.2版本中,MongoDB支持创建“物化的”视图,物化视图会在创建时对查询到的数据进行存储(需用户指定表名),并支持手动刷新。通过物化视图,用户可以缓存中间结果,避免每次查询时进行重复计算,提高运行效率。

2.通配符索引

MongoDB支持对单个字段建立索引,但表中字段不明确的情况下,用户可能不知道表中的哪些字段可以创建索引,这时就可以使用4.2版本提供的通配符索引来解决这个问题。

例如,用户某张表的userMetadata字段可能有好几种潜在的数据格式,如字符串类型的字段,数组类型的字段等,如下所示:

代码语言:javascript复制
{ "userMetadata" : { "likes" : [ "dogs", "cats" ] } } { "userMetadata" : { "dislikes" : "pickles" } }{ "userMetadata" : { "age" : 45 } }{ "userMetadata" : "inactive" }

这时用户可能并不知道userMetadata中有哪些字段,但又想通过对这些字段建立索引来优化查询性能,所以可以通过如下命令建立userMetadata字段的通配符索引来覆盖一个文档下的多个特征字段:

代码语言:javascript复制
db.userData.createIndex( { "userMetadata.$**" : 1 } )

建立了通配符索引后,MongoDB会在后台自动地对匹配的特征字段建立稀疏索引,这时我们再通过如下类似命令去查询数据时,会走我们建立好的通配符索引优化查询效率。

代码语言:javascript复制
db.userData.find({ "userMetadata.likes" : "dogs" })db.userData.find({ "userMetadata.dislikes" : "pickles" })db.userData.find({ "userMetadata.age" : { $gt : 30 } })db.userData.find({ "userMetadata" : "inactive" })

3.其他查询能力优化

  • 更细粒度的更新操作:在更新文档的某些字段时,支持读取和计算当前文档的其他字段(例如将其他字段的值赋值给欲更新的字段),且这一操作是原子的。
  • 新增三角表达式数学运算符:$sin, $tan, $asin等。
  • 新增$round表达式用于转换数字位数,例如$round:[1234.5678, 2]=1234.56。
  • 新增$now表达当前集群时钟大小。

2.3 弹性和可扩展性增强

基于分布式的架构设计,MongoDB天然就具有分布式系统的种种优点,如高可用性、可扩展性等等。MongoDB 4.2版本在分布式系统的构建方面,也有一系列的优化,包括可重试的读写、在线建索引、更快的副本集成员切换速度和冷启动速度等方面的优化。

1.可重试的读写

通过新版本的API驱动,MongoDB在读取数据时如果遇到网络问题,会自动进行重试读,提供了弱网络环境下的自动重试能力,可以有效降低业务代码的复杂度。

同时,新驱动也支持对网络传输错误导致的写入操作进行重试。为了保证数据的一致性,驱动层会自动地对每个写入操作赋予一个唯一id,网络异常时通过唯一id来判断是否重试写入。

2.在线建索引

在4.2版本前,建立索引主要有前台建索引和后台建索引两种方式,它们各有利弊。

  • 前台建索引:建立索引的耗时短,索引的底层存储结构最优,但缺点是会阻塞表的读写。
  • 后台建索引:建立索引的耗时长,索引底层存储结构不一定最优,但是不会阻塞读写。

而在4.2版本,MongoDB开始支持在线建索引(online index build)这种方式建立索引,它既有前台建索引的速度和存储结构的优势,又不会阻塞表的读写。

3.热更新能力增强

无论什么数据库,总不可避免的需要进行维护或者迁移,那么在进行一些维护操作时,必然会有一些数据库主从切换的操作,这可能会影响到用户正在主节点上执行的业务。在4.2版本,MongoDB通过对主从切换时间的优化以及连接保持功能,不仅切主时间大幅降低,并且在切主后,仍会自动将主节点上的请求进行平移,实现切主操作的热更新。

(四)字段级加密 MongoDB 4.2在API驱动层面,实现了字段级的加密,用户可以在写入数据前对指定字段进行加密传输,在读取时只能通过特定的证书或密码对加密信息进行解密。通过该功能,用户可以对敏感信息进行加密处理,又避免了全库加密,具有很高的灵活性和安全性。

三、CMongo平台新特性

MongoDB本身具备的功能之外,CMongo团队在内核和新特性方面做了许多优化和工作,旨在提供云上极致的MongoDB服务。

(一)基础能力

功能方面:CMongo默认提供1主2从的副本集部署结构,支持跨可用区部署,拥有极高的可靠性,随着业务的增长,CMongo提供几乎可以无限扩展的分片集群部署模式。同时,平台也提供了数据库企业级功能,包括备份回档、运维监控等,满足CMongo用户安全管控和运营需求。

  • 备份回档:支持无间断备份,数据库支持回档到任意时间段;支持DB和表级别回档。
  • 自动限流:高负载时自动限流保护,提高数据库可用性。
  • 只读灾备:集群与集群间支持数据同步,扩展数据库读能力和容灾能力。
  • 秒级监控:实时监控和健康巡检,异常秒级发现,分钟级处理。

数据库内核方面:CMongo团队在日常的运营过程中,结合具体的业务场景场景深入地对MongoDB进行改造,主要包括:

  • 物理拷贝:不停服拷贝物理存储文件,极大地提升了备份、加节点等操作的速度。
  • skip优化:优化分片集群的skip查询,有效减少查询操作的计算量和速度。
  • 地理查询优化:优化地理查询算法,部分场景提升10倍以上效率。
  • ttl索引优化:优化ttl索引淘汰逻辑,避免影响现网业务。

(二)新功能

随着4.2版本的发布,CMongo也已经或即将推出一些重要的功能和优化,如审计日志、百万库表优化、分片集群只读灾备等等,接下来让我们一起简单了解下这些功能吧。

1.审计日志

审计功能属于数据安全的重要一环,能够在事后追溯一些关键操作或者危险操作,是很多企业级产品的必备功能。CMongo团队通过对数据库内核的改造,支持多种粒度的审计日志上报。 如图,CMongo支持用户在控制台上对审计规则进行配置,具体的审计规则会持久化在集群对应的configServer或mongod节点中,当用户发起连接、读写等请求时,对应的审计日志会被自动收集和上报至云上的审计平台,而CMongo团队在实现审计功能时,也对以下几个用户比较重视的方面进行了全面优化:

  • 用户体验:用户可以进行灵活的动态配置:包括自定义审计规则组合,快速开启和关闭审计功能,不停服修改配置等。
  • 安全性:用户修改密码时需要脱敏后记录,防止用户的隐私泄露。
  • 数据全面及准确性:覆盖所有用户常用的命令,在内核获取客户端、命令,请求耗时等信息。
  • 高性能:支持同步和异步方式上报,降低审计功能对服务性能的影响。

当前,CMongo支持配置的审计操作如下:

  • 认证:客户端连接和登录操作。
  • CRUD:insert、update和delete操作等。
  • DDL操作:如dropDatabase、dropUser等。

2.优化百万库表

在运营过程中,我们发现部分业务在使用MongoDB时会创建大量库表,其数量有时甚至会超过百万级,而过多的库表会影响整个数据库的查询性能,增加数据库的内存消耗,并且在数据库实例重启时,冷启动加载库表文件的耗时可能会高达小时级,非常不利于平时的运营维护操作,详细请参看专项分享《百万级库表能力!这个MongoDB为什么可以这么牛?》。 针对上述问题,CMongo团队通过对MongoDB百万库表的场景进行深入剖析,结合业界的解决方案对百万库表的架构进行了优化,将用户的百万库表合并存储为单个文件,成功将该场景下的读写性能提升了100倍,有效降低了数据库实例的内存消耗,百万库表场景下,数据库冷启动时间也从小时级缩短到分钟级,最终有效应对了百万库表这种极端场景,支撑了用户业务平稳运行。

3.分片集群的只读灾备

在MongoDB服务领域,CMongo团队提供了业内特有的只读灾备服务,用户通过我们的只读灾备服务,可以在线地将主集群的数据同步到另一个灾备集群,从而通过灾备集群来扩展业务的读能力,分摊主集群压力,也可以在主集群异常的情况下进行集群切换,达到快速容灾的目的。 只读灾备服务在4.2版本前,只支持副本集的数据同步场景,我们通过对数据库内核和同步服务的改造,将在接下来的版本里支持分片集群的只读灾备服务,进一步提高云上集群的服务能力。

四、总结

随着4.2新版本的发布,CMongo数据库的核心能力进一步得到了扩展和增强。在数据处理方面,分布式事务、可重试读写、通配符索引和在线建索引等新特性的引入不仅丰富了CMongo适用的业务场景,也进一步降低了用户的使用成本。在可靠性方面,字段集加密、审计日志和只读灾备等功能进一步提高了CMongo数据库的安全性和可靠性。在性能方面,CMongo团队通过对数据库内核的深度改造,优化了百万库表、地理查询等众多极端场景下的数据库读写性能,满足了用户苛刻的业务需求。

腾讯云MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的文档数据库MongoDB打造的高性能NoSQL数据库,100%完全兼容MongoDB协议。相比原生版本,CMongo内核团队对原生内核做了大量优化和深度定制,包括百万TPS、物理备份、免密、无损加节点、rocksdb引擎等优化,同时也新开发了流控、审计、加密等企业级特性,为公司内外客户的核心业务提供了有力的支撑。

目前,腾讯云 MongoDB 已在稳定性、安全性、性能以及企业级特性上取得了显著突破。接下来我们还会继续在性能、新特性、成本等方面进行持续不断的打磨、改进,争取为公司内外用户提供更好的云MongoDB服务。

 推荐阅读

自动的内存管理系统实操手册——Golang垃圾回收篇

自动的内存管理系统实操手册——Java垃圾回收篇

百万级库表能力!这个MongoDB为什么可以这么牛?

Serverless 在大厂都怎么用?


? 想知道新版数据库的具体资讯?点击【阅读全文】进入【腾讯云官网】云数据库TencentDB for MongoDB查看详情!

0 人点赞