这是一组问题,而不是一个非常具体的问题.在过去的几周/几天里,我一起困惑地了解了如何在"云端"正确托管JAVA PLAY应用程序,因为很多这些信息分散在不同的服务上,我觉得要将所有这些小块收集到一个,因为在完整的背景下,很多事情都很重要.但是,我把我的考虑转移到问题的底部,因为它们主要是我的意见和主观发现,我不想对此负责.如果我弄错了,请不要犹豫,指出这一点.
我们的场景:我们在Java PLAY框架(https://www.playframework.com/)中编写了一个非常简单的应用程序,在iOS和Android以及后端系统上工作(用于管理,内容管理和API) ),将数据存储在MySQL DB中.虽然大多数用户与服务器的交互快速简便(登录,同步一些数据),但还有一些数据密集型任务(将一些<100mb数据拉链下载到手机上,将几mb上传到服务器).因此,我们正在寻找一种解决方案,以合理的方式为用户提供远离我们服务器的合理响应时间.明显的下一步是在云端托管.
水平缩放:首先,我们的app只有1个EC2实例将在eu-1a中运行.如果需要更多实例,并且更多实例实际上有利于更快的响应时间,我们将需要评估一个实例实际需要多少资源.
跨区域的水平扩展:一旦应用程序从另一个区域生成大量用户负载,整个EC2实例应该被复制并放到另一个区域,运行db read副本(请参阅在amazon Web服务和https 上设置全局可用的Web应用程序: //aws.amazon.com/de/blogs/aws/cross-region-read-replicas-for-amazon-rds-for-mysql/).
EC2实例的垂直扩展:在最近的旧主机设置测试中,数据库被证明是瓶颈而不是播放应用程序及其服务器的硬件规格.因此,尚不完全清楚垂直缩放会对响应时间产生多大影响.如果t2.micro实例与m3.xlarge实例一样好,当然我们宁愿从这里向上攀爬.
RDS的垂直扩展:我们需要估计有多少流量到达DB服务器以及需要什么CPU/RAM /等.也许我们也会在这里努力工作.
全局重定向:使用Amazon Route 53(?)完成.来自Tokio的用户应该被重定向到在亚洲运行的EC2实例; 从罗马到欧洲EC2实例的用户.这不仅会影响应用内的API调用,还会影响内容传送(双向).
我非常感谢各种想法(!),也有关于下面写的背景信息.如果你能指点我进一步阅读以自己解决我的问题,我也非常感激 - 关于这一点只有大量的信息,但这使得很难缩小答案.我确实有托管/服务器的知识,但我很确定有真正的专家在那里等着用知识打击我.:)
当前主机设置:负载均衡器在2个根Linux服务器上分配流量,两个服务器都运行PLAY应用程序,其中一个也持有MySQL安装.
目前的托管设置有三大缺陷:
Java PLAY的托管选项: 关于此,有很多不同的博客文章.简而言之:
很多选择和可能的设置/价格.特别是在发现使用boxfuse(https://boxfuse.com/)进行部署之后,我选择了AWS,因为它提供了我们所需要的1个来源.Boxfuse每月的成本很低,但完全集成到AWS中.支持缩放以及3种常见环境(dev/test/prod).支持非常出色.
问题概述 我们的AWS RDS实例在大约7-14天后开始减速,这是一个相当大的因素(特定查询集的加载时间约为400%).RDS监测没有显示出资源短缺的迹象.(有关详细问题说明,请参阅下面的问题更新)
因此,经过一个多月的调查和AWS的一些开发人员支持,我并不完全接近解决方案.
以下是我检查列表的几个步骤,或多或少没有任何进一步的问题提示:
为了解释,使用过的PlayFramework(2.3.8)有BoneCP,我们使用eBeans来选择我们的数据.所以基本上我正在运行一个嵌套对象和所有这些子对象,这为所讨论的API调用产生了几百个准备好的SELECT.对于使用过的硬件,这基本上也应该没问题,这些操作都不会广泛使用CPU和RAM.
我还包括NewRelic以获得有关此问题的更多见解,并进行了一些JVM概要分析.显然,大部分时间都是由NETTY/eBeans消耗的?

有人能理解这个吗?
原始问题:问题大纲
我们的AWS RDS实例在大约7-14天后开始放慢一个相当大的因素(特定查询集的加载时间约为400%).RDS监测没有显示出资源短缺的迹象.
基础设施
我们为AWS EC2实例上的移动应用程序运行PlayFramework后端,连接到AWS RDS MySQL实例,一个PROD环境,一个DEV环境.通常PROD EC2实例指向PROD RDS实例,而DEV EC2指向DEV RDS(来自队长的嗨明显!); 但有时我们也会让DEV EC2指向PROD DB进行某些测试.正在使用的PlayFramework正在与BoneCP合作.
详细问题描述
在一个非常重要的同步过程中,我们的应用程序每个用户每天多次进行一次API调用.我在这个SO问题中讨论了功能的背景,感谢评论,我可以将问题归结为某种类型的MySQL问题.
简而言之,API调用正在加载一组数据,最大约为1MB的json数据,目前大约需要18s才能加载.当事情运行得非常好时,这需要大约4秒才能加载.
很奇怪,上次"解决"问题的是将RDS实例升级到另一个实例类型(从db.m3.large到db.m4.large,这只是一个非常小的步骤).现在,大约2-3周后,RDS实例再次像以前一样缓慢运行.重新启动RDS实例显示无效.同样重新启动EC2实例也没有效果.
我还检查了受影响的mySQL表的索引是否设置正确,情况就是这样.API调用本身不是急于加载任何BLOB字段或类似的,我仔细检查了这一点.在大多数情况下,RDS实例的CPU使用率低于1%,当我用100个同时API调用对其进行压力测试时,它达到了约5%,因此这不是瓶颈.内存也很好,所以我猜RDS实例没有开始交换,这可能会减慢整个过程.
提供确凿的证据,DEV环境上的(较小的)公共API调用目前需要2.30秒负载,在PROD环境中需要4.86秒.这很有趣,因为DEV环境在EC2和RDS中都有一个小得多的实例类型.所以基本上乌龟在这里赢得比赛.(如果您对此API调用感兴趣,我很乐意通过PN与您分享,但我真的不想发布API调用的链接,即使它们基本上是公开的.)
结论
最后,感觉(我有点说'感觉')就像数据库在使用x天后/在一定量的API调用之后被阻塞了.不确定这是否是特定于RDS的问题,一旦我"通过更改实例类型"重置数据库实例,事情就会快速而平稳地运行.但是,每两周从快照重新创建我的数据库实例不是一种选择,特别是如果我不明白为什么会发生这种情况.
您有什么想法可以采取哪些进一步措施来调查此事吗?
简短说明:我有一个表格,其中包含在特定时间段内更新的数据.现在的问题是,根据发送数据的传感器的性质,在这段时间内可能有50个数据集或50.000个数据集.由于我想要显示这些数据(使用ASP.NET/c#),对于第一个预览,我想从表中仅选择1000个值.
我已经有了这样做的方法:我计算感兴趣的时间段中的行,使用简单的"where"子句来指定sensor-id,将其保存为SQL中的变量,然后将count()除以1000我已经在MS Access中尝试过了,它运行得很好:
set @divider = select count(*) from table where [...]
SELECT (Int([RowNumber]/@divider)), First(Value)
FROM myTable
GROUP BY (Int([RowNumber]/@divider));
Run Code Online (Sandbox Code Playgroud)
Access的技巧是,我只有一个数据字段("RowNumber"),这是我的PK/ID,从0开始.我尝试使用该ROW_NUMBER()方法在SQL Server中实现这一点,该方法或多或少有效.我有方法的正确语法,但我不能使用该GROUP BY语句
窗口函数只能出现在SELECT或ORDER BY子句中.
意思ROW_NUMBER()不能在GROUP BY声明中.
现在我有点卡住了.我试图将ROW_NUMBER值保存到char或单独的列中,GROUP BY稍后会将其保存,但我无法完成它.不知怎的,我开始想,我的策略可能有它的弱点......?:/
再次澄清:我不需要SELECT TOP 1000从我的表中,因为这只是意味着我选择前1000个值(取决于排序).我需要SELECT每个x值,而我可以计算x(我甚至可以将它舍入到INT,如果这有助于完成它).我希望我能够形容这个问题是可以理解的......
这是我在StackOverflow上的第一篇文章,我希望我没有忘记任何重要或重要的内容,如果您需要任何进一步的信息(表结构,我的查询到目前为止,......)请不要犹豫.任何帮助或提示都非常感谢 - 提前感谢!:)
更新:解决方案!非常感谢/sf/users/3681891/ !!!
这是我最终如何做到的:
我声明了2个变量 - 我计算我的行并将其设置为第一个var.然后我在刚分配的变量上使用ROUND(),并将其除以1000(因为最后我想要大约1000个值!).我将此操作拆分为2个变量,因为如果我使用COUNT函数中的值作为我的ROUND操作的基础,则会出现一些错误.
declare @myvar decimal(10,2)
declare @myvar2 decimal(10,2)
set @myvar = (select COUNT(*)
from value_table
where channelid=135 and myDate >= '2011-01-14 22:00:00.000' and myDate …Run Code Online (Sandbox Code Playgroud) amazon-rds ×1
cloud ×1
cloudcaptain ×1
database ×1
mysql ×1
netty ×1
scala ×1
select ×1
sql ×1
sql-server ×1