共用方式為


在 Azure Cosmos DB 中複製作業 (預覽)

您可以使用容器複製作業,在 Azure Cosmos DB 中執行資料複製。

如果您想要達到下列任何案例,您可能需要從 Azure Cosmos DB 帳戶複製資料:

您可以使用 Azure CLI 命令來建立和管理複製作業。

入門指南

必要條件

  1. 在來源 Azure Cosmos DB 帳戶上啟用 持續備份
  2. 在來源帳戶上啟用所有版本和刪除變更摘要模式 (預覽) 預覽功能。

啟用線上複製

若要在來源帳戶上啟用線上複製,請使用 Azure CLI 執行下列步驟。

# Set shell variables.
 $resourceGroupName = <azure_resource_group>
 $accountName = <azure_cosmos_db_account_name>
 $EnableOnlineContainerCopy = "EnableOnlineContainerCopy"

# List down existing capabilities of your account.
 $cosmosdb = az cosmosdb show \
    --resource-group $resourceGroupName \
    --name $accountName

$capabilities = (($cosmosdb | ConvertFrom-Json).capabilities)

# Append EnableOnlineContainerCopy capability in the list of capabilities.
 $capabilitiesToAdd = @()
 foreach ($item in $capabilities) {
    $capabilitiesToAdd += $item.name
 }
 $capabilitiesToAdd += $EnableOnlineContainerCopy

 # Update Cosmos DB account
 az cosmosdb update --capabilities $capabilitiesToAdd \
    -n $accountName -g $resourceGroupName

重要

來源帳戶上的所有寫入作業都會以雙倍 RU 計費,以保存容器中項目變更的過去和現在版本。 未來此 RU 收費調漲可能會有所變動。

複製容器資料

  1. 使用您想要的設定 (分割區索引鍵、吞吐量粒度、請求單位、唯一索引鍵等) 來建立目標 Azure Cosmos DB 容器。
  2. 建立容器複製作業 (部分機器翻譯)。
  3. 監視複製作業的進度。
  4. 複製所有文件之後,停止來源容器上的更新,然後呼叫完成 API 將作業標示為已完成。
  5. 如預期般將應用程式或用戶端指向來源或目標容器,以繼續作業。

容器複製如何運作?

  1. 平臺會為目的地 Azure Cosmos DB 帳戶配置伺服器端計算實例,以執行容器複製作業。
  2. 無論何時,所有執行個體上都只會執行單一作業。
  3. 線上複製作業會利用所有版本和刪除變更摘要模式來複製資料,並將增量變更從來源容器複寫至目的地容器。
  4. 作業完成後,平台會在非使用狀態 15 分鐘後解除配置這些執行個體。

您可以執行離線收集複製作業,以在相同的 Azure Cosmos DB for Mongo DB 帳戶內複製數據。

複製集合的數據

  1. 使用您想要使用的設定來建立目標 Azure Cosmos DB 集合(分割區索引鍵、輸送量粒度、要求單位、唯一索引鍵等等)。
  2. 暫停應用程式實例或任何連線至來源集合的用戶端,以停止來源集合上的作業。
  3. 創建複製任務
  4. 監視複製作業的進度 ,並等到作業完成為止。
  5. 如預期般將應用程式或用戶端指向來源或目標集合,以繼續作業。

附註

強烈建議您在開始脫機集合複製作業之前,先停止對來源集合執行任何作業。 啟動複製作業之後,在來源集合上完成的項目刪除和更新可能無法擷取。 如果您在複製作業進行時繼續對來源集合執行作業,則目標集合上可能會有重複或遺失的數據。

集合複製如何運作?

  1. 平台會為目的地 Azure Cosmos DB 帳戶配置伺服器端計算執行個體。
  2. 當該帳戶內建立了一或多個集合複製作業時,平台便會配置這些執行個體。
  3. 複製作業會在這些實例上執行。
  4. 無論何時,所有執行個體上都只會執行單一作業。
  5. 在相同帳戶內執行的所有複製作業會共用這些執行個體。
  6. 離線複製作業會利用 變更數據流 來複製數據,並將累加變更從來源集合複寫至目的地集合。
  7. 如果執行個體閒置超過 15 分鐘,則平台可能會將其取消配置。

您可以執行離線數據表複製,以將一個資料表的數據複製到相同 Azure Cosmos DB for Apache Cassandra 帳戶內的另一個數據表。

複製數據表的數據

  1. 使用您想要使用的設定選項來建立目標的 Azure Cosmos DB 資料表(分區索引鍵、輸送量粒度、請求單位等等)。
  2. 暫停應用程式實例或任何與其連線的用戶端,以停止源數據表上的作業。
  3. 創建複製任務
  4. 監視複製作業的進度 ,並等到作業完成為止。
  5. 視需要適當地將應用程式或用戶端指向來源或目標數據表,以繼續作業。

附註

強烈建議您在開始離線數據表複製作業之前,先停止對源數據表執行任何作業。 在您啟動複製作業之後,在來源資料表上完成的項目刪除和更新未必能被捕捉到。 如果在複製作業進行中時繼續對源數據表執行作業,則目標數據表上可能會有重複或遺失的數據。

資料表複製如何運作?

  1. 平台會為目的地 Azure Cosmos DB 帳戶配置伺服器端計算執行個體。
  2. 當該帳戶內建立了一或多個複製作業時,平台便會配置這些執行個體。
  3. 複製作業會在這些實例上執行。
  4. 無論何時,所有執行個體上都只會執行單一作業。
  5. 在相同帳戶內執行的所有複製作業會共用這些執行個體。
  6. 離線複製作業會利用 變更摘要 將數據複製,並將累加變更從源數據表復寫至目的地數據表。
  7. 如果執行個體閒置超過 15 分鐘,則平台可能會將其取消配置。

影響複製作業速率的因素

容器複製作業進度的速率取決於下列因素:

  • 來源容器或資料庫吞吐量設定。

  • 目標容器或資料庫的輸送量設定。

    秘訣

    至少將目標容器輸送量設定為來源容器輸送量的兩倍。

  • 配置給 Azure Cosmos DB 帳戶以執行資料傳輸的伺服器端計算執行個體。

    重要

    預設 SKU 會為每個帳戶提供兩個 4-vCPU 16 GB 伺服器端執行個體。

限制

預覽資格條件

容器複製作業不適用於已啟用下列功能的帳戶。 在執行容器複製作業之前停用這些功能:

帳戶設定

存留時間 (TTL) 設定未在目標容器中進行調整。 因此,如果文件尚未在來源容器中過期,則會在目的地容器中重新開始倒數。

常見問題

容器複製作業是否有服務等級協定?

目前以最佳方式支援容器複製作業。 我們未提供任何服務等級協定 (SLA) 來保證作業完成所需的時間。

我可以在帳戶內建立多個容器複製作業嗎?

是,您可以在相同的帳戶內建立多個作業。 作業會連續執行。 您可以列出帳戶內建立的所有作業,並監視其進度。

我可以在 Azure Cosmos DB 帳戶內複製整個資料庫嗎?

您必須針對資料庫中的每個容器創建任務。

我有一個具有多個區域的Cosmos DB帳戶。 容器複製作業會在哪個區域中執行?

容器複製作業會在寫入區域中執行。 在已設定多區域寫入的帳戶中,會在寫入區域清單中的其中一個區域中執行作業。

當帳戶的寫入區域變更時,容器複製工作的情況會如何?

帳戶的寫入區域可能會因地區中斷或手動故障切換等罕見情況而變更。 在此情況下,帳戶內所建立的不完整容器複製作業會失敗。 您需要重新建立這些失敗的作業。 接著,已重新建立的作業會在新的(當前)寫入區域中執行。

支援的區域

下列區域目前支援容器複製:

美洲 歐洲和非洲 亞太地區
巴西南部 法國中部 澳大利亞中部
加拿大中部 法國南部 澳大利亞中部 2
加拿大東部 德國北部 澳大利亞東部
美國中部 德國中西部 印度中部
美國中部 EUAP 北歐 日本東部
美國東部 挪威東部 南韓中部
美國東部 2 挪威西部 東南亞
美國東部 2 EUAP 瑞士北部 阿拉伯聯合大公國中部
美國中北部 瑞士西部 印度西部
美國中南部 英國南部 東亞
美國中西部 英國西部 馬來西亞南部
美國西部 西歐 日本西部
美國西部 2 以色列中部 澳大利亞東南部
不支援 南非北部 不支援

已知和常見問題

  • 使用在線容器複製功能時,如果 id 字段在來源容器中修改,目的地容器會儲存兩個不同的檔,分別對應至相異 id 值。

  • 將數據複製到目的地容器期間變更分割區索引鍵時,請確定新的分割區索引鍵和 id 組合在容器中是唯一的。

    例如,請考慮下列案例:

    原始分割區索引鍵:/department
    來源檔:

    {
        "id": "101",
        "employeeName": "John Doe",
        "department": "HR"
    },
    {
        "id": "101",
        "employeeName": "John Doe",
        "department": "Finance"
    }
    

    新增分區金鑰:/employeeName
    目的地容器中產生的文件:

    {
        "id": "101",
        "employeeName": "John Doe",
        "department": "HR"
    },
    {
        "id": "101",
        "employeeName": "John Doe",
        "department": "Finance"
    }
    

    在此情況下,這兩個文件現在會共用同一分割區鍵 /employeeName 和組合 id"employeeName": "John Doe", "id": "101",將造成衝突。 此衝突會導致插入錯誤。 若要避免這類問題,請確定新的分割區索引鍵和 id 組合在目的地容器中的所有檔中都是唯一的。

  • 錯誤 - 分割區索引鍵已達到 20 GB 的大小上限

    將數據複製到目的地容器期間修改分割區索引鍵時,請確定新的分割區索引鍵會保留在邏輯分割區索引鍵大小限制 20 GB 內。 如果超過此限制,作業會失敗,並出現下列錯誤:

    "code": "403",
    "message": "Response status code does not indicate success: Forbidden (403); Substatus: 1014; ActivityId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx; Reason: (Message: {"Errors":["Partition key reached maximum size of 20 GB. Learn more: https://aka.ms/CosmosDB/sql/errors/full-pk"]"
    
  • 錯誤 - 擁有者資源不存在

    如果作業建立失敗,並顯示錯誤「擁有者資源不存在」(錯誤碼 404),目標容器尚未建立,或用來建立作業的容器名稱不符合實際的容器名稱。

    在執行作業之前,請確定已建立目標容器,並確定作業中的容器名稱符合實際的容器名稱。

    "code": "404",
    "message": "Response status code does not indicate success: NotFound (404); Substatus: 1003; ActivityId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx; Reason: (Message: {\"Errors\":[\"Owner resource does not exist\"]
    
  • 錯誤 - 取得作業資源時發生錯誤

    此錯誤可能因內部伺服器問題而發生。 若要解決此問題,請在 Azure 入口網站中開啟 [新增支援要求],以連絡 Microsoft 支援服務。 針對 [問題類型],選取 [資料移轉]。 針對 [問題子類型],選取 [帳戶內部容器複製]

    "code": "500"
    "message": "Error while getting resources for job, StatusCode: 500, SubStatusCode: 0, OperationId:  xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, ActivityId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    

後續步驟