基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移彻底透明化。并提供专业的数据库在线扩容、备份回滚、性能优化等解决方案。后端
了解更多安全
MongoDB World 2019 上发布新版本 MongoDB 4.2 Beta,包含多项数据库新特性,本文尝试从技术角度解读。性能优化
MongoDB 4.2 以前,全文搜索(Full Text Search)的能力是靠 Text Index 来支持的,在 MongoDB-4.2 里,MongoDB 直接与 Lucene 等引擎整合,在 Atlas 服务里提供全文建索的能力。网络
下面是一个 Full Text Search 使用的简单示例,整个使用体验很是简单,除了须要在 Atlas 控制台上建索引,其余跟正常使用 MongoDB 毫无差异,随着这块能力的完善,能覆盖不少 Elastic Search 的场景。架构
Step1: 准备数据app
MongoDB Enterprise > db.fruit.find() { "_id" : 1, "type" : "apple", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp." } { "_id" : 2, "type" : "banana", "description" : "Bananas are usually sold in bunches of five or six." }
Step2: Atlas 上建立 FTS 索引分布式
Step3: 使用 MongoDB 客户端作搜索,支持 Wildcard、Prefix 等多种搜索能力ide
// 简单查询 db.fruit.aggregate([ { $searchBeta: { "term": { "query": "Smith", "path": "description" } } } ]) { "_id" : 1, "type" : "apple", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp." } // Wildcard 查询 db.fruit.aggregate([ { $searchBeta: { "term": { "query": "s*l*", "path": "description", "wildcard": true } } } ]) { "_id" : 1, "type" : "apple", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp." } { "_id" : 2, "type" : "banana", "description" : "Bananas are usually sold in bunches of five or six." }
MongoDB 4.0 支持副本集事务,极大的丰富了应用场景;4.0 的事务存在最大修改 16MB、事务执行时间不能过长的限制,在 4.2 支持分布式事务的这些问题都解决了。分布式事务的支持也意味用户修改分片key的内容成为可能,由于修改分片key的内容,可能会致使key要迁移到其余shard,而在4.2以前,没法保证这个迁移动做(目标上新写、源上删掉)的原子性,而借助分布式事务,这个问题也就迎刃而解。工具
4.2 支持的分布式事务是硬核技术,目前具有这个能力的开源数据库自己也很少,MongoDB 采用二阶段提交的方式(细节之后再分析),实如今多个 Shard 间发生的修改,要么同时发生,要么都不发生,保证事务的 ACID 特性。
在使用上,4.2 的分布式事务跟 4.0 副本集事务使用方式彻底同样,用户无需关心后端数据如何分布。
MongoDB 在保证数据库服务可用性方面持续努力,在 4.0 提供了 Retryable Write 功能,在新的 4.2 版本,MongoDB 增长了 Retryable Read 功能,对于一些临时的网络问题,用户无需本身实现重试逻辑,MongoDB 会自动重试处理,保证用户业务的连续性。
MongoDB 4.2 在查询语言的表达能力上进一步加强,update、aggregation、index 等方面都有巨大的提高,具体细节等 4.2 正式版文档发出能够详细了解。
4.2 以前,Update 操做基本上都是用肯定的值更新某个字段,在新版本里,Update 能根据文档现有的字段内容来生成新的更新内容,以下的实例,根据文档 pay、tax 字段,加起来生成一个 total 字段;这个在 4.2 以前,用户须要先读取文档内容,获取 pay、tax 字段获得结果,而后调用 Update 设置新的字段。相似的特性还有不少,基本上 Aggregation 里能表达的更新操做,4.2 的 Update 命令都能支持。
db.orders.find() { "_id" : 1, "pay" : 100, "tax" : 17 } // 这个操做发布会PPT上有写,但实际连 4.2 测试并不能工做,等正式版出来再看看 db.orders.update( {_id: 1}, { "$set": { "total": { "$sum": ["$pay", "$tax"] } } })
Aggregation 方面,MongoDB 也作了大量的改进,来更好的支持业务分析场景;好比增长 操做符,能不断的将增量分析结果与原来的结果进行汇总(老的版本只支持 out,把当次分析结果写到某个集合)。
使用 MongoDB 时,常常会遇到一些场景,某个字段包含不少个属性,不少属性均可能须要用于查询,如今的解决方案时,针对每一个属性,必须提早知道它的访问行为,创建必要的索引;MongoDB 4.2 引入 Wildcard Index,能够针对一系列的字段自动建索引,知足丰富的查询需求。
以下面的例子所示,书籍的 attribute 字段里包含不少熟悉,包括颜色、大小等信息,若是常常须要根据属性查找,能够针对 attribute 字段创建 Wildcard index。
db.books.find() { "_id" : ObjectId("5d0c5d931eefdf585ae9ca95"), "type" : "book", "title" : "The Red Book", "attributes" : { "color" : "red", "size" : "large", "inside" : { "bookmark" : 1, "postitnote" : 2 }, "outside" : { "dustcover" : "worn" } } } { "_id" : ObjectId("5d0c5d9e1eefdf585ae9ca96"), "type" : "book", "title" : "The Blue Book", "attributes" : { "color" : "blue", "size" : "small", "inside" : { "map" : 1 }, "outside" : { "librarystamp" : "Local Library" } } } { "_id" : ObjectId("5d0c5dac1eefdf585ae9ca97"), "type" : "book", "title" : "The Green Book", "attributes" : { "color" : "green", "size" : "small", "inside" : { "map" : 1, "bookmark" : 2 }, "outside" : { "librarystamp" : "Faraway Library", "dustcover" : "good" } } } // 没有索引的时候,根据颜色属性查找,走全表扫描 db.books.find({"attributes.color": "green"}).explain() { "queryPlanner" : { "queryHash" : "528C4C03", "planCacheKey" : "528C4C03", "winningPlan" : { "stage" : "COLLSCAN", } // 针对 attributes 字段全部的子字段创建 Wildcard 索引,针对 color、size 等的查询就均可以走索引 db.books.createIndex({ "attributes.$**": 1 }); db.books.find({"attributes.color": "green"}).explain() { "queryPlanner" : { "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", } db.books.find({"attributes.size": "small"}).explain() { "queryPlanner" : { "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", }
MongoDB 除了支持 SSL、TDE 等安全机制,在 4.2 引入「字段级加密」的支持,实现对用户JSON文档的Value 进行自动加密。整个过程在 Driver 层完成,传输、存储到服务端的文档Value都是密文,MongoDB 4.2 Drvier 支持丰富的加密策略,能够针对集合、字段维度开启加密,加密过程对开发者彻底透明。
Kubernetes 是工业级的容器编排管理平台,可使用 Kubernetes 管理 MongoDB 集群的整个生命周期,但随着业务部署环境愈来愈复杂多样化,有的多是私有云部署、有的是公有云的部署,使得集群的管理难度也愈来愈高。
在新版本 MongoDB Atlas(公有云), MongoDB Cloud Manager(私有云企业版管理) 都集成了 Kubernetes operators 的支持,使得用户可使用 Kubernetes 统一管理 MongoDB 资源。
MongoDB Chart 在去年的 MongoDB World 已经介绍过了,今年有作了多方面的加强,算得上是一个功能比较完备的 BI 分析工具了。有了 Charts,MongoDB 也无需支持 SQL 来去对接 BI 工具了。
Charts 在使用上仍是有必定学习成本的,不是特别直观,须要配合教程,了解下运做原理,才能获得想要的图,好比这个例子里,针对电影集合,Released 的年份作了聚合分析,获得分布图。
MongoDB 在4月份的时候收购了 Realm,一个为移动端开发而设计的新型数据库。MongoDB 去年发布了 MongoDB Mobile 来应对移动端的数据存储需求,在收购 Realm 后,两者会进行深度整合,Real Core 里会借助MongoDB提供的能力,增长非结构化数据存储到能力,好比 JSON、Dict、Set,让 Realm 变得更强大,同时发挥 Realm 在移动端生态以及 MongoDB 数据库存储的优点。
在新版本 Atlas 服务里,提供了 Atlas Data Lake,能直接经过 MongoDB API 访问存储在 AWS S3 (将来支持 Azure、Google 的存储服务)里的数据。
基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移彻底透明化。并提供专业的数据库在线扩容、备份回滚、性能优化等解决方案。
本文为云栖社区原创内容,未经容许不得转载。