以 Linux 為基礎的模擬器 - vNext (預覽)

下一代 Azure Cosmos DB 模擬器完全基於 Linux,並以 Docker 容器形式提供。 它支援在各種不同的處理器和作系統上執行。

Important

此版本的模擬器僅支援 NoSQL API 的網閘模式,且提供部分特定功能。 如需詳細資訊,請參閱功能支援

Prerequisites

Installation

使用 docker pull 取得 Docker 容器映像。 容器映像檔會發佈到 Microsoft Artifact Registry,編號為 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

Running

若要執行容器,請使用 docker run。 之後,請使用 docker ps 來驗證容器是否正在執行。

docker run --detach --publish 8081:8081 --publish 8080:8080 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

docker ps
CONTAINER ID   IMAGE                                                             COMMAND                  CREATED         STATUS         PORTS                                                                                  NAMES
c1bb8cf53f8a   mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview  "/bin/bash -c /home/…"   5 seconds ago   Up 5 seconds   0.0.0.0:1234->1234/tcp, :::1234->1234/tcp, 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp   <container-name>

模擬器包含兩個組件:

  • Data Explorer - 互動式探索模擬器中的資料。 預設情況下,此元件運行於埠 1234口。
  • Azure Cosmos DB 模擬器 - Azure Cosmos DB 資料庫服務的本地版本。 預設情況下,此元件運行於埠 8081口。

模擬器閘道端點使用埠 8081 在位址 http://localhost:8081。 要前往Data Explorer,請在瀏覽器中使用網址 http://localhost:1234。 閘道端通常立即可用,但 Data Explorer 可能需要幾秒鐘才能啟動。

健康探測

模擬器會在埠 8080口 暴露健康探針端點。 利用此端點判斷模擬器何時已完全初始化並準備接受請求。

下列端點可供使用:

Note

舊有日誌訊息 System is now fully ready to accept requests 仍會為向下相容而發出,但未來版本可能會被移除。 請改用健康探針進行就緒檢查。

HTTPS 模式

.NET 和 Java SDK 在模擬器中不支援 HTTP 模式。 由於此版本的模擬器預設會以 HTTP 啟動,因此您需要在啟動容器時明確啟用 HTTPS (請參閱下方)。 對於 Java SDK,你還需要安裝憑證。

docker run --detach --publish 8081:8081 --publish 8080:8080 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview --protocol https

當你使用 HTTPS 搭配持久化資料卷時,模擬器會在啟動時自動重新產生 SSL 憑證,因此你不需要管理憑證續期。

Docker 命令

下表摘要說明可用於設定模擬器的 Docker 命令。 此表詳細說明了每個命令的相對應引數、環境變數、允許值、預設設定和描述。

需求 引數 環境 允許的值 預設值 Description
從容器將設定列印至 stdout --help-h N/A N/A N/A 顯示可用設定的相關資訊
設定 Cosmos 端點的連接埠 --port [INT] PORT INT 8081 容器上 Cosmos 端點的連接埠。 您仍然需要發佈此連接埠 (例如 -p 8081:8081)。
指定 Cosmos 端點所使用的通訊協定 --protocol 通訊協定 httpshttphttps-insecure http 容器上 Cosmos 端點的通訊協定。
啟用資料總管 --enable-explorer ENABLE_EXPLORER truefalse true 啟用 Cosmos Data Explorer 在同一容器上運行。
設定資料總管所使用的連接埠 --explorer-port EXPLORER_PORT INT 1234 貨櫃上的 Cosmos Data Explorer 端口。 您仍然需要發佈此連接埠 (例如 -p 1234:1234)。
指定資料探索器所使用的協定 --explorer-protocol EXPLORER_PROTOCOL httpshttphttps-insecure <the value of --protocol> 容器上的 Cosmos Data Explorer 協定。 預設為 Cosmos 端點上的通訊協定設定。
自訂閘道的公開端點 --gateway-endpoint GATEWAY_PUBLIC_ENDPOINT N/A localhost 公共網關端點。 預設為 localhost
透過以下檔案指定金鑰: --key-file [PATH] KEY_FILE 路徑 <default secret> 使用檔案中指定的金鑰覆寫預設金鑰。 您需要將此檔案掛接至容器 (例如,如果 KEY_FILE=/mykey,您會將如下所示的選項新增至 docker run:--mount type=bind,source=./myKey,target=/myKey)
設定資料路徑 --data-path [PATH] DATA_PATH 路徑 /data 指定資料的目錄。 經常搭配 docker run --mount 選項使用 (例如,如果 DATA_PATH=/usr/cosmos/data,則您需要在 docker run 中新增類似下面的選項:--mount type=bind,source=./.local/data,target=/usr/cosmos/data)
指定要用於 https 的憑證路徑 --cert-path [PATH] CERT_PATH 路徑 <default cert> 指定用於保護流量之憑證的路徑。 您需要將此檔案掛接至容器中 (例如,如果 CERT_PATH=/mycert.pfx,則您需要在 docker run 中新增類似下面的選項:--mount type=bind,source=./mycert.pfx,target=/mycert.pfx)
指定要用於 https 的憑證祕密 N/A CERT_SECRET 字串 <default secret> CERT_PATH 上指定之憑證的秘密。
設定記錄層級 --log-level [LEVEL] LOG_LEVEL quieterrorwarninfodebugtrace info 模擬器與資料探索器所發出的日誌冗長程度。
啟用 OpenTelemetry OTLP 匯出器 --enable-otlp ENABLE_OTLP_EXPORTER truefalse false 啟用 OpenTelemetry 整合。
啟用主控台匯出器 --enable-console 啟用主控台匯出器 truefalse false 啟用遙測資料的主控台輸出(對除錯很有用)。
啟用冗長模式 --verbose 冗長 truefalse false 啟用 verbose 模式以將 PostgreSQL 日誌(pglog)列印到主控台。 對除錯很有用。
設定查詢緩衝區大小 --query-buffer-size QUERY_BUFFER_SIZE_KB INT 4096(4 MB),最大 65536(64 MB) 查詢結果緩衝區的最大大小(KB)。 如果在大型查詢中遇到 HTTP 500 錯誤,請增加這個比例。
啟用傳送給 Microsoft 的診斷資訊 --enable-telemetry ENABLE_TELEMETRY truefalse true 啟用傳送使用資料給 Microsoft,幫助我們改進模擬器。

功能支援

此模擬器處於作用中的開發和預覽狀態。 因此,並非所有 Azure Cosmos DB 功能都被支援。 某些功能未來也將不受支援。 此表包括各種功能的狀態及其支援層級。

功能 Support
批次 API ✅ 支援
大量 API ✅ 支援
變更摘要 ✅ 支援
使用 utf 資料建立和讀取文件 ✅ 支援
建立集合 ✅ 支援
建立集合兩次衝突 ✅ 支援
使用自訂索引原則建立集合 ⚠️ No-op
建立具有 ttl 到期的集合 ✅ 支援
建立資料庫 ✅ 支援
建立資料庫兩次衝突 ✅ 支援
建立文件 ✅ 支援
建立分割的集合 ✅ 支援
刪除集合 ✅ 支援
刪除資料庫 ✅ 支援
刪除文件 ✅ 支援
取得和變更集合效能 ⚠️ 尚未實作
插入大型文件 ✅ 支援
修補文件 ✅ 支援
平行查詢分割集合 ⚠️ 尚未實作
使用彙總進行查詢 ✅ 支援
使用 AND 篩選條件進行查詢 ✅ 支援
使用 AND 篩選條件和投影進行查詢 ✅ 支援
使用相等進行查詢 ✅ 支援
使用識別碼相等進行查詢 ✅ 支援
使用聯結進行查詢 ✅ 支援
使用排序依據進行查詢 ✅ 支援
使用分割集合的排序依據進行查詢 ✅ 支援
使用按數字排序進行查詢 ✅ 支援
使用按字串排序進行查詢 ✅ 支援
使用分頁進行查詢 ✅ 支援
使用範圍運算子日期時間進行查詢 ✅ 支援
使用針對數字的範圍運算子進行查詢 ✅ 支援
使用針對字串的範圍運算子進行查詢 ✅ 支援
使用單一聯結進行查詢 ✅ 支援
使用字串、數學和陣列運算子進行查詢 ✅ 支援
使用子文件進行查詢 ✅ 支援
使用兩個聯結進行查詢 ✅ 支援
使用兩個聯結 AND 篩選條件進行查詢 ✅ 支援
讀取集合 ✅ 支援
讀取集合摘要 ⚠️ 尚未實作
讀取資料庫 ✅ 支援
讀取資料庫摘要 ⚠️ 尚未實作
讀取文件 ✅ 支援
讀取文件摘要 ✅ 支援
取代文件 ✅ 支援
要求單位 ⚠️ 尚未實作
預存程序 ❌ 未規劃
觸發程序 ❌ 未規劃
UDF ❌ 未規劃
更新集合 ⚠️ No-op
更新文件 ✅ 支援
提供端點 ⚠️ No-op
使用者端點 ⚠️ No-op
權限端點 ⚠️ No-op
用戶端加密金鑰(CEK) ⚠️ No-op

Note

標示 為 No-op 的功能會接受請求並回傳有效的 HTTP 狀態碼,但不會執行底層操作。 你的程式碼不會壞掉,但不要依賴這些功能來維持功能性。 為了相容性,我們接受自訂索引政策和集合更新,但查詢不會因自訂索引而優化。

局限性

除了尚未支援或尚未規劃的功能之外,下列清單還包含模擬器目前的限制。

  • Azure Cosmos DB 的 .NET SDK 在模擬器中不支援批量執行。
  • 如果大型查詢結果出現 HTTP 500 錯誤,請用旗標或--query-buffer-size環境變數增加查詢緩衝區大小QUERY_BUFFER_SIZE_KB。 預設值為 4096 KB4 (MB),最大值為 65536 KB64 (MB)。

安裝 Java SDK 憑證

當使用 Java SDK for Azure Cosmos DB 並以 https 模式進行此版本模擬器時,必須將其憑證安裝到本地的 Java trust store。

取得憑證

bash 視窗中,執行下列命令:

# If the emulator was started with /AllowNetworkAccess, replace localhost with the actual IP address of it:
EMULATOR_HOST=localhost
EMULATOR_PORT=8081
EMULATOR_CERT_PATH=/tmp/cosmos_emulator.cert
openssl s_client -connect ${EMULATOR_HOST}:${EMULATOR_PORT} </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > $EMULATOR_CERT_PATH

安裝憑證

瀏覽至 cacerts 檔案所在的 Java 安裝目錄 (以正確的目錄取代以下內容):

cd "C:/Program Files/Eclipse Adoptium/jdk-17.0.10.7-hotspot/bin"

匯入憑證 (系統可能會要求您輸入密碼,預設值為 "changeit"):

keytool -cacerts -importcert -alias cosmos_emulator -file $EMULATOR_CERT_PATH

如果您因為別名已經存在而收到錯誤,請將其刪除,然後再次執行上述動作:

keytool -cacerts -delete -alias cosmos_emulator

OpenTelemetry 支援

OpenTelemetry 是一個開源的可觀察性框架,提供一系列工具、API 與 SDK,用於進行遙測資料的儀器化、產生、收集及匯出。 OpenTelemetry 協定(OTLP)是 OpenTelemetry 用來在元件間傳輸遙測資料的協定。

你可以用 OpenTelemetry 搭配模擬器來監控和追蹤你的應用程式。 模擬器支援遙測選項,可透過環境變數或命令列旗標在 Docker 容器中設定。

模擬器匯出以下指標。 這些指標可以透過任何支援 OpenTelemetry 協議 (OTLP) 的後端取得,該後端提供有關資料庫效能和健康狀況的寶貴洞見:

  • 請求速率:顯示不同操作類型的流量模式
  • 查詢執行時間:衡量執行不同查詢所花費的時間
  • 資源利用率:CPU、記憶體使用率與連線池指標
  • 錯誤率:依類型與端點追蹤錯誤

Note

模擬器支援條件式 TLS 作為 OTLP 匯出器,因此你可以與需要安全連線的可觀測性平台整合。

詳細說明與範例 可在 GitHub 倉庫中找到

在持續整合工作流程中使用

在 CI/CD 管線中使用 Docker 容器有很多好處,尤其是像資料庫這類有狀態系統。 這可能就測試套件的成本效益、效能、可靠性和一致性而言。

模擬器可以併入為 CI/CD 管線的一部分。 您可以參考此 GitHub 存放庫,其中提供範例,展示如何在 .NET、Python、Java 和 Go 應用程式的 GitHub Actions CI 工作流程中使用模擬器,適用於 x64ARM64 架構(使用 ubuntu 的 Linux 執行器進行示範)。

以下是 GitHub Actions CI 工作流程的範例,示範如何將模擬器設定為 GitHub Actions 服務容器 ,作為工作流程中作業的一部分。 GitHub 負責啟動 Docker 容器,並在工作完成後銷毀容器,無需手動介入(例如使用 docker run 指令)。

name: CI demo app

on:
  push:
    branches: [main]
    paths:
      - 'java-app/**'
  pull_request:
    branches: [main]
    paths:
      - 'java-app/**'

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    services:
      cosmosdb:
        image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
        ports:
          - 8081:8081
        env:
          PROTOCOL: https
        
    env:
      COSMOSDB_CONNECTION_STRING: ${{ secrets.COSMOSDB_CONNECTION_STRING }}
      COSMOSDB_DATABASE_NAME: ${{ vars.COSMOSDB_DATABASE_NAME }}
      COSMOSDB_CONTAINER_NAME: ${{ vars.COSMOSDB_CONTAINER_NAME }}

    steps:

      - name: Set up Java
        uses: actions/setup-java@v3
        with:
          distribution: 'microsoft'
          java-version: '21.0.0'

      - name: Export Cosmos DB Emulator Certificate
        run: |

          sudo apt update && sudo apt install -y openssl

          openssl s_client -connect localhost:8081 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cosmos_emulator.cert

          cat cosmos_emulator.cert

          $JAVA_HOME/bin/keytool -cacerts -importcert -alias cosmos_emulator -file cosmos_emulator.cert -storepass changeit -noprompt
      
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Run tests
        run: cd java-app && mvn test

此作業會在Ubuntu執行器上執行,並使用 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview Docker 映射作為服務容器。 它會使用環境變數來設定連接字串、資料庫名稱和容器名稱。 因為在此情況下,作業會直接在 GitHub Actions 執行器電腦上執行,因此作業中的執行測試步驟可以透過localhost:8081端口存取模擬器(8081是模擬器公開的端口)。

Export Cosmos DB 模擬器憑證步驟是針對Java應用程式的,因為 Azure Cosmos DB Java SDK 目前不支援模擬器中的 HTTP 模式。 PROTOCOL 環境變數在 https 區塊中設定為 services,此步驟會匯出模擬器憑證並匯入 Java 金鑰庫。 同樣適用於 .NET。

報告問題

如果你在使用這個版本模擬器時遇到問題,可以在GitHub倉庫(https://github.com/Azure/azure-cosmos-db-emulator-docker)中開啟一個問題,並標註為 cosmosEmulatorVnextPreview