在 Azure Cosmos DB 中,容器创建后分区键不可原地修改。若原始键导致跨分区查询或热分区,需考虑变更。本文梳理四种路径,按意图分为重新分区(移动数据)和全局二级索引(只改查询不改写入)。
重新分区(移动数据)
选项一:门户的 Change partition key 功能。最省力,由 Azure 创建目标容器并复制数据,支持在线/离线模式。适用于容器 <1,000,000 RU/s、<4 TB 的路径。
选项二:容器复制作业(CLI)。与门户同引擎但可脚本化,支持在线/离线。在线模式下写入继续,但源写入 RU 翻倍,需连续备份和 all-versions-and-deletes 更改馈送。离线模式需暂停写入。作业按尽力执行,无保证完成时间。注意 TTL 会重置,目标吞吐应设为源的两倍。
选项三:自行迁移。需在移动时做转换、容器超限或需完全控制时使用。可用 .NET v3 SDK 的批量导入、Azure Data Factory、Spark 连接器加载,配合更改馈送增量同步。预创高 RU/s 并关闭索引以降低成本。需自行处理增量同步、错误处理和切换。
不移动数据(全局二级索引)
全局二级索引(GSI)是一个只读容器,以不同分区键自动同步源容器。查询匹配 GSI 分区键时可变为单分区查询,解决读取端跨分区问题。写入端不变,不缓解写入热分区。需连续备份,最终一致,按自动缩放计费,替换和删除操作额外消耗 50-100% RU。
决策参考
- 需点选、小容器:门户功能。
- 需脚本化、精细控制:容器复制作业(CLI)。
- 需转换或超限:自行迁移。
- 只有读取跨分区:全局二级索引。
#开发者 #工具 #Azure #CosmosDB #NoSQL #分区键 #GSI
@DevToolboxHub
