天天看點

深度幹貨 | MongoDB 4.2新特性解讀

作者:張友東(花名:林青),阿裡雲進階技術專家

MongoDB World 2019 上釋出新版本 MongoDB 4.2 Beta,包含多項資料庫新特性,本文将從技術角度進行深入解讀。

深度幹貨 | MongoDB 4.2新特性解讀

Full Text Search

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

深度幹貨 | MongoDB 4.2新特性解讀

MongoDB FTS 原理

使用者可以在 Atlas 上,對集合開啟全文索引,背景會開起 Lucene 索引引擎(索引引擎、查詢引擎均可配置),對存量資料建立索引。

對于開啟全文建索的集合,新寫入到 MongoDB 的資料, 背景的服務會通過 Change Stream 的方式訂閱,并更新到 Lucene 索引引擎裡。

索引的查詢直接以 MongoDB Query 的方式提供,Mongod 收到請求會把請求轉發到 Lucene 引擎,收到建索結果後回複給用戶端。

Full Text Search 示例

下面是一個 Full Text Search 使用的簡單示例,整個使用體驗非常簡單,除了需要在 Atlas 控制台上建索引,其他跟正常使用 MongoDB 毫無差别,随着這塊能力的完善,能覆寫很多 Elastic Search 的場景。

Step1: 準備資料

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 索引

深度幹貨 | MongoDB 4.2新特性解讀

Step3: 使用 MongoDB 用戶端做搜尋,支援 Wildcard、Prefix 等多種搜尋能力

// 簡單查詢

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 特性。

深度幹貨 | MongoDB 4.2新特性解讀

在使用上,4.2 的分布式事務跟 4.0 副本集事務使用方式完全一樣,使用者無需關心後端資料如何分布。

深度幹貨 | MongoDB 4.2新特性解讀

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 也做了大量的改進,來更好的支援業務分析場景;比如增加merge操作符,能不斷的将增量分析結果與原來的結果進行彙總(老的版本隻支援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 4.2新特性解讀

MongoDB and Kubernetes

深度幹貨 | MongoDB 4.2新特性解讀

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 4.2新特性解讀

MongoDB Realm

MongoDB 在4月份的時候收購了 Realm,一個為移動端開發而設計的新型資料庫。MongoDB 去年釋出了 MongoDB Mobile 來應對移動端的資料存儲需求,在收購 Realm 後,二者會進行深度整合,Real Core 裡會借助MongoDB提供的能力,增加非結構化資料存儲到能力,比如 JSON、Dict、Set,讓 Realm 變得更強大,同時發揮 Realm 在移動端生态以及 MongoDB 資料庫存儲的優勢。

深度幹貨 | MongoDB 4.2新特性解讀
深度幹貨 | MongoDB 4.2新特性解讀

Atlas Data Lake (Beta)

在新版本 Atlas 服務裡,提供了 Atlas Data Lake,能直接通過 MongoDB API 通路存儲在 AWS S3 (未來支援 Azure、Google 的存儲服務)裡的資料。

深度幹貨 | MongoDB 4.2新特性解讀

雲資料庫 MongoDB 版

阿裡雲雲資料庫MongoDB基于飛天分布式系統和高性能存儲,提供三節點副本集的高可用架構,容災切換,故障遷移完全透明化。并提供專業的資料庫線上擴容、備份復原、性能優化等解決方案。