身兼數職的Amazon DocumentDB,還有什麼不為人知的功能?

亞馬遜雲開發者發表於2022-01-04

Amazon DocumentDB(相容MongoDB)是一項快速、可擴充套件、具備高可用性的全託管文件資料庫服務,可支援MongoDB工作負載。今天,我們宣佈Amazon DocumentDB正式獲得MongoDB 4.0相容能力。通過此次升級,現在您可以使用原子性、一致性、隔離性與永續性(ACID)事務,為資料庫或叢集開啟變更流遊標等等。關於Amazon DocumentDB 4.0的完整發行版說明,請參閱MongoDB 4.0相容性

在本文中,我們將共同瞭解Amazon DocumentDB 4.0當中的新增功能,並向您展示如何在Amazon Cloud9環境之上使用Amazon DocumentDB 4.0及事務

? 想要了解更多亞馬遜雲科技最新技術釋出和實踐創新,敬請關注在上海、北京、深圳三地舉辦的2021亞馬遜雲科技中國峰會!點選圖片報名吧~

Amazon DocumentDB 4.0中的新特性

以下是Amazon DocumentDB 4.0引入的各項主要功能特性。要檢視新功能的完整列表,請參閱MongoDB 4.0相容性

ACID事務–Amazon DocumentDB現可支援跨多個文件、語句、集合及資料庫執行事務。事務支援使您能夠跨Amazon DocumentDB叢集內的一個或多個文件執行ACID操作,從而簡化應用開發流程。關於更多詳細資訊,請參閱事務

1.變更流–現在,您可以在叢集層級 (client.watch()或 mongo.watch()) 或者資料庫層級(db.watch())開啟變更流。您也可以指定一個 startAtOperationTime以開啟變更流遊標,並將變更流的保留週期延長至7天(之前最多為24小時)。關於更多詳細資訊,請參閱在Amazon DocumentDB上使用變更流

2.Amazon DMS–現在,您可以使用Amazon Database Migration Service (Amazon DMS)將MongoDB 4.0工作負載遷移至Amazon DocumentDB 4.0。Amazon DMS現可支援以MongoDB 4.0為源、以Amazon DocumentDB 4.0為目標,並可以Amazon DocumentDB 3.6為源完成由3.6版本到4.0版本的升級。關於更多詳細資訊,請參閱 將Amazon DocumentDB 作為Amazon Database Migration Service的目標

3.監控–通過新增事務,現在您可以使用五項新的Amazon CloudWatch指標:

TransactionsOpen, TransactionsOpenMax, TransactionsAborted, TransactionsStarted 以及 TransactionsCommitted, 外加 currentOp, ServerStatus與 profiler等新欄位。關於更多詳細資訊,請參閱使用Amazon CloudWatch監控Amazon DocumentDB

4.效能與索引–新版本中還包含多項效能與索引改進:可在 $lookup聚合階段使用索引、可直接由索引(所涉及查詢)提供帶有投射的find()查詢、可通過findAndModify API使用hint()、對$addToSet操作符做出效能優化,同時改進並縮小了總體索引大小。關於更多詳細資訊,請參閱釋出說明

5.操作符–我們增加了對以下新聚合操作符的支援: $ifNull, $replaceRoot, $setIsSubset, $setInstersection, $setUnion以及 $setEquals。關於更多詳細資訊,請參閱支援的MongoDB API、操作與資料型別

6.基於角色的訪問控制(RBAC)–使用ListCollection與ListDatabase命令,您現在可以選擇使用authorizedCollections與authorizedDatabases引數以允許使用者列出其有權訪問的集合與資料庫,因此不再需要為此分別使用listCollections與listDatabase角色。使用者還可以直接結束自己的遊標,無需使用KillCursor角色。關於更多詳細資訊,請參閱使用基於角色的訪問控制(內建角色)限制資料庫訪問行為

Amazon DocumentDB4.0與事務入門指南

第一步是在您的預設Amazon Virtual Private Cloud(Amazon VPC)當中建立一個Amazon Cloud9環境外加一套Amazon DocumentDB叢集。關於建立預設VPC的操作說明,請參閱Amazon VPC入門指南。本文將演示如何使用mongo shell從Amazon Cloud9環境接入Amazon DocumentDB叢集並執行事務。在建立Amazon資源時,我們建議您遵循Amazon身份與訪問管理(IAM)最佳實踐。

下圖所示,為本演練中的最終架構。

在本演練中,請使用特定區域內的預設VPC。關於更多詳細資訊,請參閱建立Virtual Private Cloud (VPC)

建立Amazon Cloud9環境

要建立Amazon Cloud9環境,請完成以下操作步驟:

1.在Amazon Cloud9控制檯上,選擇 Create environment。

2.在Environment name and description之下的 Name部分,為環境輸入名稱。本文將環境命名為Amazon DocumentDB Cloud9。

3.選擇Next step。

4.在Configure settings部分,直接使用全部預設選項。

5.選擇Next step。

6.在Review部分, 選擇Create environment。

Amazon Cloud9環境的置備最多可能需要3分鐘。在完成之後,您會看到以下命令提示符。

您將被重新定向至命令提示符,在這裡安裝mongo shell並接入Amazon DocumentDB叢集。

建立安全組

在此步驟中,您將使用Amazon Elastic Compute Cloud(Amazon EC2)建立一個新的安全組,藉此從Amazon Cloud9環境中的埠27017(Amazon DocumentDB的預設埠)連線至Amazon DocumentDB叢集。

1.在Amazon EC2控制檯的Network & Security之下, 選擇Security groups。

2.選擇Create security group。

3.在Security group name部分,輸入demoDocDB。

4.在 VPC部分,接受使用您的預設VPC。

5.在Description部分,輸入相應描述。

6.在Inbound rules部分, 選擇Add rule。

7.在Type部分, 選擇Custom TCP Rule。

8.在Port Range部分,輸入27017。源安全組為您剛剛為Amazon Cloud9環境建立的安全組。

9.要檢視可用安全組列表,請在目標欄位內輸入cloud9。

10.選擇名稱為amazon-cloud9-的安全組。

11.接受所有預設選項,而後選擇Create security group。

下圖所示,為您在此步驟中建立的安全組,以及在建立Amazon Cloud9環境時建立的Amazon Cloud9安全組。

建立一套 Amazon DocumentDB 4.0叢集

要建立您的Amazon DocumentDB 4.0叢集,請完成以下操作步驟:

1.在Amazon DocumentDB控制檯上的Clusters頁面中,選擇Create。

2.在Engine version部分, 選擇預設版本 (4.0.0)。

3.在Create Amazon DocumentDB cluster頁面的Instance class部分, 選擇 t3.medium。

4.在Number of instances部分, 選擇1。用於將成本控制在最低水平。

5.其他設定全部保留為預設選項。

6.在Authentication部分,輸入使用者名稱與密碼。

7.開啟Show advanced settings。

8.在Network settings部分的VPC security groups當中, 選擇demoDocDB。

9.選擇Create cluster。

Amazon DocumentDB現在開始配置您的叢集,這可能需要幾分鐘才能完成。當叢集與例項狀態皆顯示為Available時,您即可接入該叢集。在Amazon DocumentDB設定叢集的過程中,請完成剩餘步驟以接入Amazon DocumentDB叢集。

安裝4.0 mongo shell

現在,您可以安裝mongo shell,並使用這款命令列實用工具接入並查詢您的Amazon DocumentDB叢集。

1.在Amazon Cloud9r控制檯的Your environments之下, 選擇Amazon DocumentDBCloud9。選擇Open IDE。

2.要安裝4.0 mongo shell,請在命令提示符中使用以下命令建立repo檔案:echo -e “[mongodb-org-4.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/...\ngpgcheck=1 \nenabled=1 \ngpgkey=https://www.mongodb.org/stati...” | sudo tee /etc/yum.repos.d/mongodb-org-4.0.repo

3.完成之後,使用以下命令安裝mongo shell:sudo yum install-y mongodb-org-shell

傳輸層安全(TLS)協議將在Amazon DocumentDB叢集上預設啟用。關於更多詳細資訊,請參閱管理Amazon DocumentDB Cluster TLS設定

要加密傳輸資料,請為Amazon DocumentDB下載CA證照,具體程式碼如下:

wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

接入您的Amazon DocumentDB叢集

現在,您可以接入自己的Amazon DocumentDB叢集了。

1.在Amazon DocumentDB控制檯的Clusters page上找到您的叢集。本文中使用 docdb-2020-10-09-21-45-11叢集。

2.選擇您所建立的叢集。

3.複製其對應的連線字串。請忽略掉<insertYourPassword>部分,以便在接入時由mongo shell提示您輸入密碼。這樣,您就不必以明文形式輸入密碼。

您的連線字串應類似於以下截圖所示。

4.在輸入密碼時,您會看到rs0:PRIMARY> 提示,代表您已成功接入Amazon DocumentDB叢集。

關於故障排查的更多詳細資訊,請參閱Amazon DocumentDB故障排查

在接入mongo shell之後,您可以使用以下命令確認當前版本(4.0.0):

db.version()

輸出結果如下:

4.0.0

使用事務

現在,您已經使用mongo shell成功接入叢集了,接下來即可使用事務。這裡我們使用典型的事務用例,即某人的賬戶中借錢,並將這筆錢存入另一人的賬戶當中。由於此用例需要使用資料庫內的兩項單獨操作,因此我們希望兩項操作在同一事務內完成並遵循ACID原則。在本演練中,我們從Bob的銀行賬戶向Alice的銀行賬戶轉賬400美元。兩個賬戶的初始餘額都為500美元。

  • 為了從空集合開始,我們首先將賬戶集合刪除:

db.account.drop()

您將得到以下輸出結果:

{true, false}

  • 將資料插入集合以代表Bob的賬戶:
db.account.insert({"_id": 1, "name": "Bob", "balance": 500.00});

您將得到以下輸出結果:

WriteResult({ "nInserted" : 1 })

  • 將資料插入集合以代表Alice的賬戶:
db.account.insert({“_id”: 2, “name”: “Alice”, “balance”: 500.00});

您將得到以下輸出結果:

WriteResult({ “nInserted” : 1 })

  • 要啟動一項事務,請為賬戶建立會話與會話物件:
var mySession =getMongo().startSession();6. var mySessionObject = mySession.getDatabase('test').getCollection('account');

mySession.startTransaction({readConcern: {level: 'snapshot'}, writeConcern: {w: 'majority'}});
  • 在此事務中,從Bob賬戶處借取400美元:
mySessionObject.updateOne({"_id": 2}, {"$inc": {"balance": 400}}); 

您將得到以下輸出結果:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
  • 同樣的,向Alice賬戶中增加400美元:
mySessionObject.updateOne({"_id": 1}, {"$inc": {"balance": -400}});

您將得到以下輸出結果:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
  • 在此事務中,您可以使用以下程式碼檢視兩個賬戶的更新狀態:
    mySessionObject.find()

您將得到以下輸出結果:

{ "_id" : 2, "name" : "Alice", "balance" : 900 }

{ "_id" : 1, "name" : "Bob", "balance" : 100 }
  • 如果您在事務之外檢視,則會發現更新結果尚未顯示:

db.account.find()

您將得到以下輸出結果:

{ "_id" : 1, "name" : "Alice", "balance" : 500 }

{ "_id" : 2, "name" : "Bob", "balance" : 500 }
  • 提交事務並關閉會話:
  • 要檢視更新結果,請使用以下程式碼:

db.account.find()

您將得到以下輸出結果:

{ "_id" : 2, "name" : "Alice", "balance" : 900 }

{ "_id" : 1, "name" : "Bob", "balance" : 100 }

資源清理

在完成演練之後,您應停止Amazon DocumentDB叢集或將其刪除以降低成本。在預設情況下,經過30分鐘的閒置週期,您的Amazon Cloud9環境將停止執行基礎EC2例項以幫助節約成本。

總結

本文向您介紹了Amazon DocumentDB中的MongoDB 4.0相容性,同時展示瞭如何通過建立Amazon Cloud9環境、安裝mongo 4.0 shell、建立Amazon DocumentDB叢集、接入叢集並通過簡單用例使用Amazon DocumentDB 4.0與事務。關於更多詳細資訊,請參閱MongoDB 4.0相容性與事務。關於最新發布內容與博文的詳細資訊,請參閱Amazon DocumentDB (相容MongoDB )資源

本篇作者


Joseph Idziorek
亞馬遜雲科技首席產品經理

相關文章