问题标签 [azure-elastic-scale]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
73 浏览

azure - Elastic Sc​​ale 拆分/合并工具意外失败

我正在使用 Azure Elastic Sc​​ale Split Merge 工具将一个 shardlet 移动到另一个 shard。一切似乎都按计划进行,但最终它失败了,没有告诉我原因。

这是日志的完整输出

有没有办法询问更详细的信息,以便我知道为什么会出错?

0 投票
1 回答
58 浏览

powershell - ShardManagement Binary ShardingKey 最大值

我目前正在通过此处提供的脚本设置我的shardmap经理、分片映射...。PowerShell

虽然该示例使用 int 作为ShardingKey类型,但我有一个 binary(16) ShardingKey,有谁知道如何确定并将 max binary(16) 的高键传递给Add-RangeMapping

0 投票
1 回答
427 浏览

c# - Azure 弹性数据库合并 GUI 密钥分片

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

我使用带有 GUID 的 Listmap 作为 Key 来识别 Shard(在我们的应用程序中,这是 UserId)。在教程中,我只找到了将 Shards 与 Range 类型合并的示例。有没有办法以更快的方式合并这些类型的分片,还是我必须为此编写自己的工具?

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

还有一些本地 FileStorage invloved 在路径中使用 ID,所以无论如何我都必须编写自己的工具。

为此,我查看了 ShardMapManager,但并没有完全理解它是如何工作的。ShardMappingsGlobal 表中有一个名为 MappingId 的列。但这不是存储在分片数据库中的 Guid/UserId。我如何获得用于识别分片的实际 Guid,在我的情况下是 UserId?我也没有找到在分片之间移动数据的方法。我现在要做的是自己使用工具在分片之间传输数据,然后使用 ListShardMap.UpdateMapping 方法为该值设置一个新的分片。在操作结束时我会使用 ListShardMap.DeleteShard 还是有更好的方法来做到这一点?

编辑:

我编写了自己的工具来合并碎片,但现在我遇到了一个奇怪的异常。这里有一些代码:

UpdateMapping 导致以下异常:

存储错误:错误 515,级别 16,状态 2,过程 __ShardManagement.spBulkOperationShardMappingsLocal,第 98 行,消息:无法将值 NULL 插入 'LockOwnerId' 列,表 __ShardManagement.ShardMappingsLocal

我不明白为什么还有一个插入?我检查了本地和全局 Shardmapping 表中的 mappingId,并且映射在那里,所以我认为不需要插入。我还在这里查看了提到的存储过程 spBulkOperationShardMappingsLocal 的代码:https://github.com/Azure/elastic-db-tools/blob/master/Src/ElasticScale.Client/ShardManagement/Scripts/UpgradeShardMapManagerLocalFrom1.1To1。 2.sql 在Insert 语句中,LockOwnerId 没有作为参数传递,所以只能失败。目前我使用测试设置,因为我当然不想在生产系统上玩。也许我在那里犯了一个错误,但对我来说一切看起来都很好。对于有关此错误的任何提示,我将不胜感激。

0 投票
2 回答
1214 浏览

c# - 找不到存储过程“__ShardManagement.spBulkOperationShardMappingsLocal”

我将 azure Elastic 数据库模式与 Entity Framework Code First 一起使用。

当我创建一个新的分片数据库时,当我尝试创建PointShard地图时会引发以下异常

找不到存储过程“__ShardManagement.spBulkOperationShardMappingsLocal”

正在创建 EF 架构,但未生成分片架构和存储过程。

如何确保DbContext生成 my 的分片组件?

0 投票
1 回答
938 浏览

c# - 使用 ElasticContext EF 进行连接池管理

在遵循 Microsoft 的一些示例之后,我实现了 DbContext 的 Elastic 版本,它从 Elastic ShardMapManager 获取其连接字符串,具体取决于当前用户的租户(或客户)ID。

这在技术上可行,我已将其部署到我的 Azure 帐户。我现在关心的是连接池管理,因为我已经覆盖了默认的上下文连接创建机制。此外,我不确定shardMap.OpenConnectionForKey每次请求时如何管理连接(请参阅下面的我的 ninject 设置)。

昨天经过一些简单的测试后,我的网络应用程序失败并显示以下消息:

超时已过。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。`

这可能是一次性的,因为我今天无法重新创建它,我想确保有效地使用连接池,因为我最不想看到的是当真正的用户开始敲击系统时发生这种情况。

它失败的代码在我的 ElasticScaleContext 的完整代码中注释如下:

我正在使用 Ninject 和 ShardMapManager 作为单例注入:

上下文是根据请求创建的:

所以有几个问题:

  1. 我在上下文中创建的连接是否应该正常处理?

  2. 有谁知道如何ShardMapManger管理连接?

  3. 下面的代码(由于我的Model First EF 方法是必需的)是否可以打开然后不关闭连接?

更新- 在 @Evk 的建议(见评论)之后,我修改了对 EntityConnection 的构造函数调用以传递 true ,entityConnectionOwnsStoreConnection这应该允许它在使用后正确关闭存储连接,见下文。我真的需要一种监控连接池的方法,看看这是否有任何影响:

最后,我有什么方法可以监控和查看 Azure 弹性 SQL 池上连接的当前状态吗?

我意识到这是很多问题,但我正在寻找有关该领域的任何信息 - 网络上确实没有那么多现有信息。

附加信息:该解决方案使用EF6、SQL Server 2014、MVC 5.0

0 投票
1 回答
135 浏览

entity-framework - 使用 EF 进行弹性缩放查询:可空对象必须有一个值

在 Azure 上,我设置了几个分片数据库和一个弹性查询数据库,其中外部表镜像分片上的表。我使用的两个主要表是:

  1. 渠道:
    • [名称] nvarchar 非空,
    • [Id] [uniqueidentifier] 非空,
    • [外部参考] nvarchar NULL
  2. 用户:
    • [电子邮件] nvarchar 不为空,
    • [名字] nvarchar 非空,
    • [姓氏] nvarchar 非空,
    • [ChannelId] [uniqueidentifier] 非空,
    • [状态] [int] 非空,
    • [AvatarId] [uniqueidentifier] NULL,
    • [Id] [uniqueidentifier] 非空

当我通过 EF 和 linq 查询时:

var user = db.Users.Include("Channel").FirstOrDefault(u => u.Email == "tony@soprano.com");

我收到一个错误:

执行 GlobalQuery 操作时出错:可空对象必须有值。

这是 User 类的样子:

直接通过 T-SQL 查询:

SELECT * FROM Users INNER JOIN Channels ON Users.ChannelId = Channels.Id

给我同样的错误。

进一步的调查表明,将 Id 转换为 uniqueidentifiers(它们已经是)可以解决问题:

SELECT * FROM Users INNER JOIN Channels ON CAST(Users.ChannelId as uniqueidentifier) = CAST(Channels.Id as uniqueidentifier)

ChannelId 和 Id 列已经是不可为空的唯一标识符。分片内的数据也是有效的,不为空,那么这里到底有什么问题呢?

另一个问题:如何在 linq 中强制“转换为 uniqueidentifier”?

0 投票
1 回答
369 浏览

azure - 'New-ShardMapManager' 未被识别为尝试通过 powershell 访问的 cmdlet 的名称

我使用的步骤:Login-AzureRmAccount——登录后我在 Powershell 中以管理员模式运行了这个 cmdlet 我在下面的查询中运行了这个

我收到以下错误:

我正在使用 Powershell 4 版本

0 投票
0 回答
46 浏览

sql - Azure Elastic DB 迁移:如何处理标识列?

我有一个带有自动增量标识列 CustomerID 的现有分片表。它以弹性比例显示,在插入记录之前您需要一个 ID。如何从分片表中获取下一个 ID?

0 投票
2 回答
1023 浏览

sql-server - 性能 Azure 弹性池数据库

我们遇到了Azure hits database cpu limits too easy中提到的类似问题。我们还在使用 Azure 弹性池,并正在为每个客户创建一个新数据库。我们使用 EF6-code-first 来处理 SQL 内容。

使用 Web 前端,用户可以创建客户。他们每周这样做几次,有时(不总是,但肯定是每周一次)数据库只是部分创建,我们会Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement出错。当我们删除此客户端/数据库并再次创建时,它工作正常。当然,这很烦人。我们现在正在努力捕捉这个错误,删除数据库并重新开始在代码中创建。这有人有类似的经验,希望有更好的解决方案吗?

同样创建数据库需要很长时间:3-5 分钟。我们每个数据库只有 18 个表。我们可以加快速度吗?

工作流的下一步是解析用户上传的 XML 文件。我们使用 EF6 填充我们的模型并将其保存到数据库中。这真的很慢。XML 文件包含我们需要填充到几个表(大约 15 个表)中的员工数据。例如,我们有一个 9.7MB 的 XML 文件,其中包含 4416 名员工,“.save()”步骤大约需要 12 分钟。考虑到一个客户每年大约有 25 个 XML 文件,而用户一次上传 5 年,这种保存时间太长了。

我们已经查看了代码,并且在 EF6 的边界内,我们认为我们无法对其进行更多优化。我们现在正在查看我们的 Azure 订阅的配置,但文档很吓人,我们无法弄清楚要更改什么以获得更好的性能。

非常感谢任何指导。

0 投票
1 回答
159 浏览

asp.net - Azure Elastic Sc​​ale:MarkMappingOffline 不会阻止搜索分片

只是想更清楚地了解当 RangeShardMappings 标记为离线时会发生什么。

我了解需要将映射设置为离线以更新和删除分片和映射。

我想保留映射但阻止 Azure Map Manager 在任何特定时间使用特定映射,我希望只需将它们标记为脱机就可以做到这一点,但它似乎对搜索结果没有影响。

根据 MS Docs ( https://docs.microsoft.com/en-us/azure/sql-database/sql-database-elastic-scale-shard-map-management )

仅当映射处于“离线”状态时才允许对分片映射进行某些操作,包括 UpdateMapping 和 DeleteMapping。当映射离线时,基于该映射中包含的键的数据相关请求将返回错误。此外,当一个范围首次脱机时,所有与受影响分片的连接都会自动终止,以防止针对更改范围的查询的不一致或不完整的结果。

然而,这不是我正在经历的行为。离线地图仍在返回结果集。这些映射是否存储在缓存中?