【发布时间】:2016-10-07 19:24:53
【问题描述】:
背景简介:- 我们有一个包含以下主要组件的 SAAS 解决方案。 1. 我们有一个门户网站后端,管理员可以在其中编辑数据。 2. 我们有一个由移动设备调用的 Web API。移动设备跟踪或报告学生的阅读进度
到目前为止,该解决方案托管在虚拟服务器上。 现在我们正在将解决方案迁移到 Azure 框架,以便我们可以利用弹性数据库池的可伸缩性。 当帖子可以异步处理时,我们正在使用事件主题来处理来自移动设备的大量帖子, 但是有些帖子需要同步处理,我们发现 Azure 的结构在处理多个并发连接时非常慢。
问题示例:-
所以当 Azure 运行如下查询时:-
SELECT q.Category, COUNT(*)
FROM Question q
JOIN Answer a
ON a.QuestionId = q.QuestionId
GROUP BY q.Category
ORDER BY q.Category
SQL CPU 在以下所有场景中都达到 97% 以上的峰值:-
1. DTU数为50,并发呼叫不止1个。
2. DTU为1500,并发呼叫5个及以上。
3. DTU 为 4000 且有 20 个或更多并发呼叫。
因此,我们与 Microsoft 建立了支持电话。 我们花了一个多星期的时间来调查从 sql 统计数据和索引到 web api 定价层的事情。 毕竟,在上述场景中,我们仍然找到了 SQL 数据库中 CPU 达到峰值的证据。
这导致不可避免的“重写系统的大块”之类的争论。
因此,根本问题是弹性数据库池的性能似乎无法达到标准 SQL 数据库的能力。 此外,单机数据库的性能似乎无法与虚拟服务器的性能竞争。
这太令人沮丧了,因为我们推荐使用弹性数据库池是为了保持性能和增加可扩展性。 我们目前在一台虚拟服务器上运行 700 多个客户;并期望为每个客户创建一个分片数据库。 我们的想法是,我们可以从数百个客户扩展到数万个客户。 实际上,我们正在努力让 Azure 结构的性能接近我们在虚拟服务器上的性能。 所以这个问题是问是否有任何人在使 Azure 以合理的速度执行不平凡的任务方面具有丰富的经验? (最好不必重写系统的大块)
【问题讨论】:
-
没有?标记你的问题。清理它,否则它会被关闭。
-
从单个数据库实例迁移到池并不总是一种提升和转移。您必须考虑当前如何处理您的数据相关路由。然后你必须考虑你的数据库连接和连接的范围(主连接与租户连接)。如果 MS 建议重写你的应用程序的大块,他们可能已经发现了一些你可能还没有为弹性扩展做好准备的地方。如果您想将问题分解为单元,我很乐意回答如何从一个实例迁移到多个实例。
-
谢谢@ShannonLowder,我知道你是对的。我希望重构不是必需的,但我现在接受了它是不可避免的。
-
分块处理。首先查找成本最高的查询并尝试首先重构这些查询。之后,查看是否有任何与 Redis 缓存而不是 SQL Server 兼容的查询。 (想想小的可重复使用的结果集)。
标签: sql-server azure