当前位置: 首页 > 知识库问答 >
问题:

Azure弹性数据库合并GUI关键碎片

林英武
2023-03-14

在Azure中,我们有四个碎片,我想移除其中两个,因为我们不再需要它们了。数据应该合并到其他两个碎片中。

我使用带有GUID的Listmap作为键来标识碎片(在我们的应用程序中,这是用户ID)。在教程中,我只找到了将碎片与范围类型合并的示例。有没有一种方法可以更快地合并这些类型的碎片,或者我必须为此编写自己的工具?

如果合并是自动执行的,例如在以下情况下会发生什么:标识分片的GUID是用户ID,现在该数据从分片A移动到分片B。还有一个名为Comments的表,该表的用户ID为ForeignKey。此表中的PrimaryKey是一个经典的数字自动递增值。如果将这些值从碎片A移动到碎片B,会发生什么情况?它们是否会被插入并分配一个新的ID,或者根本不起作用?

此外,还有一些本地文件存储,它在路径中使用ID,因此无论如何我都必须编写自己的工具。

为此,我看了一下ShardMapManager,但并不完全理解它是如何工作的。在ShardMappingsGlobal表中有一个名为MappingId的列。但这不是存储在碎片数据库中的Guid/UserId。如何获得用于识别碎片的实际Guid,在我的情况下是UserId?我也没有找到在碎片之间移动数据的方法。我现在要做的是用自己的工具在碎片之间传输数据,然后使用ListShardMap。更新映射方法,为该值设置一个新的碎片。在操作结束时,我会使用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
            });  
         }

更新映射导致以下异常:

存储错误:错误515,级别16,状态2,过程__ShardManagement.spBulkoperationShardMappings本地,第98行,消息:无法将值NULL插入到列'LockOwnerId',表__ShardManagement。分片映射

我不明白为什么还有插入?我在本地和全局Shard映射表中检查了mappingId,映射是存在的,所以在我看来不需要插入。我还看了一下上面提到的存储过程的代码spBulkoperationShardMappings本地:https://github.com/Azure/elastic-db-tools/blob/master/Src/ElasticScale.Client/ShardManagement/Scripts/UpgradeShardMapManagerLocalFrom1.1To1.2.sql在插入语句中,LockOwnerId不会作为参数传递,因此只能失败。目前我的工作与一个测试设置,因为我不想发挥生产系统当然。也许我在那里犯了一个错误,但对我来说一切看起来都很好。

共有1个答案

葛奇
2023-03-14

在教程中,我只找到了将碎片与范围类型合并的示例。有没有一种方法可以更快地合并这些类型的碎片,或者我必须为此编写自己的工具?

是的,拆分合并工具可以从范围和列表碎片贴图中移动数据。对于列表碎片映射,可以为每个键发出碎片移动请求。不幸的是,分割合并工具有一些复杂的设置,上次我花了大约一个小时来配置。我知道这不太好,我将让您决定是否需要更多或更少的时间来编写自己的自定义版本。

还有另一个名为注释的表,其UserId为ForeignKey。此表中的PrimaryKey是一个经典的数字自动增量值。如果这些值从碎片A移动到碎片B,会发生什么?它们会被插入并被分配一个新的ID给它们吗?还是这根本不起作用?

不会复制自动增量列的值,它们将在目标处重新生成。因此,将为这些行分配新的ID。

为此,我看了一下ShardMapManager,但并不完全理解它是如何工作的。在ShardMappingsGlobal表中有一个名为MappingId的列。但这不是存储在碎片数据库中的Guid/UserId。如何获得用于识别碎片的实际Guid,在我的情况下是UserId?

我强烈建议不要试图自己编辑ShardMapManager表,这很容易搞糟。编辑ShardMapManager表正是弹性数据库工具库的设计目的。

您可以使用ListShardMap更新映射的元数据。UpdatePointMapping方法。需要明确的是,这只会更新ShardMapManager表关于键的数据应该在哪里的知识。实际上,移动贴图必须由更高的层完成。

这是拆分合并服务的高级摘要:

  1. 锁定映射以防止来自另一个分片映射管理操作的并发更新
  2. 使用ListShardMap标记脱机映射。更新点映射。这将防止使用OpenConnectionForKey的数据定向路由被允许使用该密钥访问数据。它还会杀死分片上的所有当前会话,以迫使它们重新连接,这将确保没有使用现在离线键对数据进行操作的活动连接
  3. 移动基础数据,使用Shard Map的SchemaInfo来确定需要移动哪些表
  4. 更新映射并用ListShardMap在线标记它。更新点映射
  5. 解锁映射

 类似资料:
  • 我有两个数据帧,都有一个键列,可能有重复项,但数据帧大部分都有相同的重复键。我希望在该键上合并这些数据帧,但这样做的方式是,当两者具有相同的副本时,这些副本将分别合并。此外,如果一个数据帧的键的副本比另一个多,我希望它的值填充为NaN。例如: 我正在尝试获得以下输出 所以基本上,我想把复制的K2键当作K2_1,K2_2。。。然后在数据帧上进行how='outer'合并。你知道我怎样才能做到这一点吗

  • 问题内容: 我试图让我的页面列表功能在带有Access数据库的ASP中工作,但是我不知道Microsoft SQL中LIMIT的替代方法。我尝试过TOP,但这似乎不起作用。 这是MySQL正在使用的语句: 如何将其转换为可与Access数据库一起使用? 问题答案: 根据ms-access视图: 将获取错误“ SELECT语句包含保留字”, 正确的语法是: (请注意括号)。

  • 问题内容: 我有2个数据框,两个数据框都有一个可能有重复的键列,但这些数据框大多具有相同的重复键。我想将这些数据帧合并到该键上,但是以这样的方式,当两个数据帧具有相同的重复项时,这些重复项将分别合并。另外,如果一个数据框比另一个数据框具有更多的重复键,我希望将其值填充为NaN。例如: 我正在尝试获得以下输出 因此,基本上,我想将重复的K2键视为K2_1,K2_2 …,然后在数据帧上进行how =’

  • 假设在创建索引时,我没有为此设置任何副本,如果我使用update settings API进行更新,并且将副本状态更改为1。如果我有2个节点,那么应该在第二个节点上创建副本,因为在主节点侧,由于集群状态显示黄色,碎片没有分配给node2,所以不会创建副本,即使我们将副本启用为1。 请分享为什么副本碎片没有分配到Node2? 但在集群启动时,节点显示它们检测到并相互连接。

  • 在学习ElasticSearch的过程中,我偶然发现并没有得出最终结论。 ElasticSearch的最大碎片大小是多少

  • 行动时刻-在FreeRADIUS中加入MySQL数据库 我们假设在尚未部署FreeRADIUS的系统上尚未安装MySQL。 我们将首先安装然后配置MySQL,以便它可用于FreeRADIUS。 安装MySQL 确保Linux服务器上安装了MySQL服务器。 下表可用作在本书中讨论的三种发行版中的每一种上安装MySQL的指南: 发行版 用于安装MySQL服务器的命令 CentOS yum insta