MongoDB 4.2 新特性解讀

雲數據庫 MongoDB 版數據庫

基於飛天分佈式系統和高性能存儲,提供三節點副本集的高可用架構,容災切換,故障遷移徹底透明化。並提供專業的數據庫在線擴容、備份回滾、性能優化等解決方案。後端

瞭解更多安全

MongoDB World 2019 上發佈新版本 MongoDB 4.2 Beta,包含多項數據庫新特性,本文嘗試從技術角度解讀。性能優化

Full Text Search

MongoDB 4.2 以前,全文搜索(Full Text Search)的能力是靠 Text Index 來支持的,在 MongoDB-4.2 裏,MongoDB 直接與 Lucene 等引擎整合,在 Atlas 服務裏提供全文建索的能力。網絡

MongoDB FTS 原理

  1. 用戶能夠在 Atlas 上,對集合開啓全文索引,後臺會開起 Lucene 索引引擎(索引引擎、查詢引擎都可配置),對存量數據創建索引。
  2. 對於開啓全文建索的集合,新寫入到 MongoDB 的數據, 後臺的服務會經過 Change Stream 的方式訂閱,並更新到 Lucene 索引引擎裏。
  3. 索引的查詢直接以 MongoDB Query 的方式提供,Mongod 收到請求會把請求轉發到 Lucene 引擎,收到建索結果後回覆給客戶端。

Full Text Search 示例

下面是一個 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." }

Distributed Transaction

MongoDB 4.0 支持副本集事務,極大的豐富了應用場景;4.0 的事務存在最大修改 16MB、事務執行時間不能過長的限制,在 4.2 支持分佈式事務的這些問題都解決了。分佈式事務的支持也意味用戶修改分片key的內容成爲可能,由於修改分片key的內容,可能會致使key要遷移到其餘shard,而在4.2以前,沒法保證這個遷移動做(目標上新寫、源上刪掉)的原子性,而藉助分佈式事務,這個問題也就迎刃而解。工具

4.2 支持的分佈式事務是硬核技術,目前具有這個能力的開源數據庫自己也很少,MongoDB 採用二階段提交的方式(細節之後再分析),實如今多個 Shard 間發生的修改,要麼同時發生,要麼都不發生,保證事務的 ACID 特性。

在使用上,4.2 的分佈式事務跟 4.0 副本集事務使用方式徹底同樣,用戶無需關心後端數據如何分佈。

High Availablity

MongoDB 在保證數據庫服務可用性方面持續努力,在 4.0 提供了 Retryable Write 功能,在新的 4.2 版本,MongoDB 增長了 Retryable Read 功能,對於一些臨時的網絡問題,用戶無需本身實現重試邏輯,MongoDB 會自動重試處理,保證用戶業務的連續性。

Improved Query Language

MongoDB 4.2 在查詢語言的表達能力上進一步加強,update、aggregation、index 等方面都有巨大的提高,具體細節等 4.2 正式版文檔發出能夠詳細瞭解。

Update 能力加強

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,把當次分析結果寫到某個集合)。

Index 能力加強(Wildcard Index)

使用 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",
}

Field Level Encrytion

MongoDB 除了支持 SSL、TDE 等安全機制,在 4.2 引入「字段級加密」的支持,實現對用戶JSON文檔的Value 進行自動加密。整個過程在 Driver 層完成,傳輸、存儲到服務端的文檔Value都是密文,MongoDB 4.2 Drvier 支持豐富的加密策略,能夠針對集合、字段維度開啓加密,加密過程對開發者徹底透明。

MongoDB and Kubernetes

Kubernetes 是工業級的容器編排管理平臺,可使用 Kubernetes 管理 MongoDB 集羣的整個生命週期,但隨着業務部署環境愈來愈複雜多樣化,有的多是私有云部署、有的是公有云的部署,使得集羣的管理難度也愈來愈高。

在新版本 MongoDB Atlas(公有云), MongoDB Cloud Manager(私有云企業版管理) 都集成了 Kubernetes operators 的支持,使得用戶可使用 Kubernetes 統一管理 MongoDB 資源。

MongoDB Chart

MongoDB Chart 在去年的 MongoDB World 已經介紹過了,今年有作了多方面的加強,算得上是一個功能比較完備的 BI 分析工具了。有了 Charts,MongoDB 也無需支持 SQL 來去對接 BI 工具了。

Charts 在使用上仍是有必定學習成本的,不是特別直觀,須要配合教程,瞭解下運做原理,才能獲得想要的圖,好比這個例子裏,針對電影集合,Released 的年份作了聚合分析,獲得分佈圖。

MongoDB Realm

MongoDB 在4月份的時候收購了 Realm,一個爲移動端開發而設計的新型數據庫。MongoDB 去年發佈了 MongoDB Mobile 來應對移動端的數據存儲需求,在收購 Realm 後,兩者會進行深度整合,Real Core 裏會藉助MongoDB提供的能力,增長非結構化數據存儲到能力,好比 JSON、Dict、Set,讓 Realm 變得更強大,同時發揮 Realm 在移動端生態以及 MongoDB 數據庫存儲的優點。

Atlas Data Lake (Beta)

在新版本 Atlas 服務裏,提供了 Atlas Data Lake,能直接經過 MongoDB API 訪問存儲在 AWS S3 (將來支持 Azure、Google 的存儲服務)裏的數據。

雲數據庫 MongoDB 版

基於飛天分佈式系統和高性能存儲,提供三節點副本集的高可用架構,容災切換,故障遷移徹底透明化。並提供專業的數據庫在線擴容、備份回滾、性能優化等解決方案。

瞭解更多



本文做者:張友東

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索