MongoDB 4.2 新特性解读
云數(shù)據(jù)庫(kù) MongoDB 版
基于飛天分布式系統(tǒng)和高性能存儲(chǔ),提供三節(jié)點(diǎn)副本集的高可用架構(gòu),容災(zāi)切換,故障遷移完全透明化。并提供專業(yè)的數(shù)據(jù)庫(kù)在線擴(kuò)容、備份回滾、性能優(yōu)化等解決方案。
了解更多
MongoDB World 2019 上發(fā)布新版本 MongoDB 4.2 Beta,包含多項(xiàng)數(shù)據(jù)庫(kù)新特性,本文嘗試從技術(shù)角度解讀。
Full Text Search
MongoDB 4.2 之前,全文搜索(Full Text Search)的能力是靠 Text Index 來(lái)支持的,在 MongoDB-4.2 里,MongoDB 直接與 Lucene 等引擎整合,在 Atlas 服務(wù)里提供全文建索的能力。
MongoDB FTS 原理
Full Text Search 示例
下面是一個(gè) Full Text Search 使用的簡(jiǎn)單示例,整個(gè)使用體驗(yàn)非常簡(jiǎn)單,除了需要在 Atlas 控制臺(tái)上建索引,其他跟正常使用 MongoDB 毫無(wú)差別,隨著這塊能力的完善,能覆蓋很多 Elastic Search 的場(chǎng)景。
Step1: 準(zhǔn)備數(shù)據(jù)
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 上創(chuàng)建 FTS 索引
Step3: 使用 MongoDB 客戶端做搜索,支持 Wildcard、Prefix 等多種搜索能力
// 簡(jiǎn)單查詢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." }Distributed Transaction
MongoDB 4.0 支持副本集事務(wù),極大的豐富了應(yīng)用場(chǎng)景;4.0 的事務(wù)存在最大修改 16MB、事務(wù)執(zhí)行時(shí)間不能過(guò)長(zhǎng)的限制,在 4.2 支持分布式事務(wù)的這些問(wèn)題都解決了。分布式事務(wù)的支持也意味用戶修改分片key的內(nèi)容成為可能,因?yàn)樾薷姆制琸ey的內(nèi)容,可能會(huì)導(dǎo)致key要遷移到其他shard,而在4.2之前,無(wú)法保證這個(gè)遷移動(dòng)作(目標(biāo)上新寫、源上刪掉)的原子性,而借助分布式事務(wù),這個(gè)問(wèn)題也就迎刃而解。
4.2 支持的分布式事務(wù)是硬核技術(shù),目前具備這個(gè)能力的開源數(shù)據(jù)庫(kù)本身也不多,MongoDB 采用二階段提交的方式(細(xì)節(jié)以后再分析),實(shí)現(xiàn)在多個(gè) Shard 間發(fā)生的修改,要么同時(shí)發(fā)生,要么都不發(fā)生,保證事務(wù)的 ACID 特性。
在使用上,4.2 的分布式事務(wù)跟 4.0 副本集事務(wù)使用方式完全一樣,用戶無(wú)需關(guān)心后端數(shù)據(jù)如何分布。
High Availablity
MongoDB 在保證數(shù)據(jù)庫(kù)服務(wù)可用性方面持續(xù)努力,在 4.0 提供了?Retryable Write?功能,在新的 4.2 版本,MongoDB 增加了?Retryable Read?功能,對(duì)于一些臨時(shí)的網(wǎng)絡(luò)問(wèn)題,用戶無(wú)需自己實(shí)現(xiàn)重試邏輯,MongoDB 會(huì)自動(dòng)重試處理,保證用戶業(yè)務(wù)的連續(xù)性。
Improved Query Language
MongoDB 4.2 在查詢語(yǔ)言的表達(dá)能力上進(jìn)一步增強(qiáng),update、aggregation、index 等方面都有巨大的提升,具體細(xì)節(jié)等 4.2 正式版文檔發(fā)出可以詳細(xì)了解。
Update 能力增強(qiáng)
4.2 之前,Update 操作基本上都是用確定的值更新某個(gè)字段,在新版本里,Update 能根據(jù)文檔現(xiàn)有的字段內(nèi)容來(lái)生成新的更新內(nèi)容,如下的實(shí)例,根據(jù)文檔 pay、tax 字段,加起來(lái)生成一個(gè) total 字段;這個(gè)在 4.2 之前,用戶需要先讀取文檔內(nèi)容,獲取 pay、tax 字段得到結(jié)果,然后調(diào)用 Update 設(shè)置新的字段。類似的特性還有很多,基本上 Aggregation 里能表達(dá)的更新操作,4.2 的 Update 命令都能支持。
db.orders.find() { "_id" : 1, "pay" : 100, "tax" : 17 }// 這個(gè)操作發(fā)布會(huì)PPT上有寫,但實(shí)際連 4.2 測(cè)試并不能工作,等正式版出來(lái)再看看 db.orders.update( {_id: 1}, { "$set": { "total": { "$sum": ["$pay", "$tax"] } } })分析能力增強(qiáng)
Aggregation 方面,MongoDB 也做了大量的改進(jìn),來(lái)更好的支持業(yè)務(wù)分析場(chǎng)景;比如增加?操作符,能不斷的將增量分析結(jié)果與原來(lái)的結(jié)果進(jìn)行匯總(老的版本只支持merge操作符,能不斷的將增量分析結(jié)果與原來(lái)的結(jié)果進(jìn)行匯總(老的版本只支持out,把當(dāng)次分析結(jié)果寫到某個(gè)集合)。
Index 能力增強(qiáng)(Wildcard Index)
使用 MongoDB 時(shí),經(jīng)常會(huì)遇到一些場(chǎng)景,某個(gè)字段包含很多個(gè)屬性,很多屬性都可能需要用于查詢,現(xiàn)在的解決方案時(shí),針對(duì)每個(gè)屬性,必須提前知道它的訪問(wèn)行為,建立必要的索引;MongoDB 4.2 引入?Wildcard Index,可以針對(duì)一系列的字段自動(dòng)建索引,滿足豐富的查詢需求。
如下面的例子所示,書籍的 attribute 字段里包含很多熟悉,包括顏色、大小等信息,如果經(jīng)常需要根據(jù)屬性查找,可以針對(duì) 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" } } }// 沒有索引的時(shí)候,根據(jù)顏色屬性查找,走全表掃描 db.books.find({"attributes.color": "green"}).explain() {"queryPlanner" : {"queryHash" : "528C4C03","planCacheKey" : "528C4C03","winningPlan" : {"stage" : "COLLSCAN", }// 針對(duì) attributes 字段所有的子字段建立 Wildcard 索引,針對(duì) 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", }Field Level Encrytion
MongoDB 除了支持 SSL、TDE 等安全機(jī)制,在 4.2 引入「字段級(jí)加密」的支持,實(shí)現(xiàn)對(duì)用戶JSON文檔的Value 進(jìn)行自動(dòng)加密。整個(gè)過(guò)程在 Driver 層完成,傳輸、存儲(chǔ)到服務(wù)端的文檔Value都是密文,MongoDB 4.2 Drvier 支持豐富的加密策略,可以針對(duì)集合、字段維度開啟加密,加密過(guò)程對(duì)開發(fā)者完全透明。
MongoDB and Kubernetes
Kubernetes 是工業(yè)級(jí)的容器編排管理平臺(tái),可以使用 Kubernetes 管理 MongoDB 集群的整個(gè)生命周期,但隨著業(yè)務(wù)部署環(huán)境越來(lái)越復(fù)雜多樣化,有的可能是私有云部署、有的是公有云的部署,使得集群的管理難度也越來(lái)越高。
在新版本 MongoDB Atlas(公有云), MongoDB Cloud Manager(私有云企業(yè)版管理) 都集成了 Kubernetes operators 的支持,使得用戶可以使用 Kubernetes 統(tǒng)一管理 MongoDB 資源。
MongoDB Chart
MongoDB Chart 在去年的 MongoDB World 已經(jīng)介紹過(guò)了,今年有做了多方面的增強(qiáng),算得上是一個(gè)功能比較完備的 BI 分析工具了。有了 Charts,MongoDB 也無(wú)需支持 SQL 來(lái)去對(duì)接 BI 工具了。
Charts 在使用上還是有一定學(xué)習(xí)成本的,不是特別直觀,需要配合教程,了解下運(yùn)作原理,才能得到想要的圖,比如這個(gè)例子里,針對(duì)電影集合,Released 的年份做了聚合分析,得到分布圖。
MongoDB Realm
MongoDB 在4月份的時(shí)候收購(gòu)了 Realm,一個(gè)為移動(dòng)端開發(fā)而設(shè)計(jì)的新型數(shù)據(jù)庫(kù)。MongoDB 去年發(fā)布了 MongoDB Mobile 來(lái)應(yīng)對(duì)移動(dòng)端的數(shù)據(jù)存儲(chǔ)需求,在收購(gòu) Realm 后,二者會(huì)進(jìn)行深度整合,Real Core 里會(huì)借助MongoDB提供的能力,增加非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)到能力,比如 JSON、Dict、Set,讓 Realm 變得更強(qiáng)大,同時(shí)發(fā)揮 Realm 在移動(dòng)端生態(tài)以及 MongoDB 數(shù)據(jù)庫(kù)存儲(chǔ)的優(yōu)勢(shì)。
Atlas Data Lake (Beta)
在新版本 Atlas 服務(wù)里,提供了 Atlas Data Lake,能直接通過(guò) MongoDB API 訪問(wèn)存儲(chǔ)在 AWS S3 (未來(lái)支持 Azure、Google 的存儲(chǔ)服務(wù))里的數(shù)據(jù)。
?
云數(shù)據(jù)庫(kù) MongoDB 版
基于飛天分布式系統(tǒng)和高性能存儲(chǔ),提供三節(jié)點(diǎn)副本集的高可用架構(gòu),容災(zāi)切換,故障遷移完全透明化。并提供專業(yè)的數(shù)據(jù)庫(kù)在線擴(kuò)容、備份回滾、性能優(yōu)化等解決方案。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的MongoDB 4.2 新特性解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MongoDB 定位 oplog 必须全
- 下一篇: 从0到千万DAU,这5年闲鱼架构如何演进