在Azure中,我们有四个分片,我想移除其中两个,因为我们不再需要它们了。数据应该合并到另外两个分片中。
我使用一个带有GUID作为键的Listmap来标识分片(在我们的应用程序中,这是用户ID)。在教程中,我只找到了使用Range类型合并分片的示例。有没有一种更快速地合并这些类型的分片的方法,或者我必须编写自己的工具来完成这个任务?
如果合并是自动执行的,例如以下情况会发生什么: 用于标识分片的GUID是用户ID,现在将此数据从Shard A移动到Shard B。还有另一个名为Comments的表,它具有UserId作为ForeignKey。此表中的PrimaryKey是一个经典的数字自增值。如果将它们从Shard A移动到Shard B,它们会发生什么?它们会被插入并分配一个新的ID吗?还是根本行不通?
此外,还涉及到一些本地文件存储,它在路径中使用ID,所以我认为我仍然需要编写自己的工具。
为此,我查看了ShardMapManager,但我并没有完全理解它的工作原理。在ShardMappingsGlobal表中有一个名为MappingId的列。但这不是存储在Shard数据库中用于标识分片的Guid / UserId。如何获取实际用于标识分片的Guid,对于我的情况是UserId?
我也没有找到在分片之间移动数据的方法。现在我会使用自己的工具在分片之间传输数据,然后使用ListShardMap.UpdateMapping方法为该值设置一个新的分片。在操作结束时,我将使用ListShardMap.DeleteShard,或者有更好的方法吗?
编辑:
我编写了自己的工具来合并分片,但现在我遇到了奇怪的异常。以下是一些代码:
UpdateMapping引起了以下异常: 存储错误:错误515,级别16,状态2,过程__ShardManagement.spBulkOperationShardMappingsLocal,行98,消息:无法将NULL值插入表“__ShardManagement.ShardMappingsLocal”的列“LockOwnerId” 我不明白为什么需要插入?我在本地和全局Shardmapping表中检查了mappingId,映射已经存在,所以我认为不需要进行插入。我还查看了所提到的spBulkOperationShardMappingsLocal存储过程的代码,链接在这里:https://github.com/Azure/elastic-db-tools/blob/master/Src/ElasticScale.Client/ShardManagement/Scripts/UpgradeShardMapManagerLocalFrom1.1To1.2.sql 在Insert语句中,没有传递LockOwnerId作为参数,因此它只能失败。 目前我正在使用测试设置,因为我当然不想在生产系统上操作。也许我犯了一个错误,但在我看来一切都很好。如果有关于此错误的任何提示,我将非常感激。
我使用一个带有GUID作为键的Listmap来标识分片(在我们的应用程序中,这是用户ID)。在教程中,我只找到了使用Range类型合并分片的示例。有没有一种更快速地合并这些类型的分片的方法,或者我必须编写自己的工具来完成这个任务?
如果合并是自动执行的,例如以下情况会发生什么: 用于标识分片的GUID是用户ID,现在将此数据从Shard A移动到Shard B。还有另一个名为Comments的表,它具有UserId作为ForeignKey。此表中的PrimaryKey是一个经典的数字自增值。如果将它们从Shard A移动到Shard B,它们会发生什么?它们会被插入并分配一个新的ID吗?还是根本行不通?
此外,还涉及到一些本地文件存储,它在路径中使用ID,所以我认为我仍然需要编写自己的工具。
为此,我查看了ShardMapManager,但我并没有完全理解它的工作原理。在ShardMappingsGlobal表中有一个名为MappingId的列。但这不是存储在Shard数据库中用于标识分片的Guid / UserId。如何获取实际用于标识分片的Guid,对于我的情况是UserId?
我也没有找到在分片之间移动数据的方法。现在我会使用自己的工具在分片之间传输数据,然后使用ListShardMap.UpdateMapping方法为该值设置一个新的分片。在操作结束时,我将使用ListShardMap.DeleteShard,或者有更好的方法吗?
编辑:
我编写了自己的工具来合并分片,但现在我遇到了奇怪的异常。以下是一些代码:
Guid userKey = Guid.Parse(userId);
ListShardMap<Guid> map = GetUserShardMap<Guid>();
try
{
PointMapping<Guid> currentMapping = map.GetMappingForKey(userKey);
PointMapping<Guid> mappingOffline = map.UpdateMapping(currentMapping, new PointMappingUpdate()
{
Status = MappingStatus.Offline
});
}
UpdateMapping引起了以下异常: 存储错误:错误515,级别16,状态2,过程__ShardManagement.spBulkOperationShardMappingsLocal,行98,消息:无法将NULL值插入表“__ShardManagement.ShardMappingsLocal”的列“LockOwnerId” 我不明白为什么需要插入?我在本地和全局Shardmapping表中检查了mappingId,映射已经存在,所以我认为不需要进行插入。我还查看了所提到的spBulkOperationShardMappingsLocal存储过程的代码,链接在这里:https://github.com/Azure/elastic-db-tools/blob/master/Src/ElasticScale.Client/ShardManagement/Scripts/UpgradeShardMapManagerLocalFrom1.1To1.2.sql 在Insert语句中,没有传递LockOwnerId作为参数,因此它只能失败。 目前我正在使用测试设置,因为我当然不想在生产系统上操作。也许我犯了一个错误,但在我看来一切都很好。如果有关于此错误的任何提示,我将非常感激。