我有一个小网站,我使用Play框架构建,我试图在EC2服务器上针对Amazon RDS实例运行.我可以在我的机器上运行应用程序对抗RDS实例,一切正常.但是当我将它部署到我的EC2服务器时,它会收到以下错误:
The last packet successfully received from the server was 1,282,977,731,085 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
at play.db.DBPlugin.onApplicationStart(DBPlugin.java:87)
at play.Play.start(Play.java:381)
at play.Play.init(Play.java:247)
at play.server.Server.main(Server.java:85)
Caused by: java.net.ConnectException: Connection refused
我的第一个想法是它是某种安全设置,但我有一个基于Spring的应用程序在Tomcat上运行,在相同的EC2服务器上使用相同的用户名和密码连接到相同的RDS实例,它工作得很好.只有Play应用有连接问题.
我似乎无法解释为什么会发生这种情况,或者如何解决它的想法.
以前见过这样的人吗?
如何使用create-environment或其他子命令创建RDS实例aws elasticbeanstalk?我尝试了几种参数组合无济于事.以下是一个例子.
APP_NAME="randall-railsapp"
aws s3api create-bucket --bucket "$APP_NAME"
APP_VERSION="$(git describe --always)"
APP_FILE="deploy-$APP_NAME-$APP_VERSION.zip"
git archive -o "$APP_FILE" HEAD
aws s3 cp "$APP_FILE" "s3://$APP_NAME/$APP_FILE"
aws --region us-east-1 elasticbeanstalk create-application-version \
--auto-create-application \
--application-name "$APP_NAME" \
--version-label "$APP_VERSION" \
--source-bundle S3Bucket="$APP_NAME",S3Key="$APP_FILE"
aws --region us-east-1 elasticbeanstalk create-environment \
--application-name "$APP_NAME" \
--version-label "$APP_VERSION" \
--environment-name "$APP_NAME-env" \
--description "randall's rails app environment" \
--solution-stack-name "64bit Amazon Linux 2014.03 v1.0.0 running Ruby 2.1 (Puma)" \
--cname-prefix "$APP_NAME-test" \
--option-settings file://test.json
Run Code Online (Sandbox Code Playgroud)
以及内容 …
amazon-web-services amazon-rds aws-cli amazon-elastic-beanstalk
我正在开发一个类似社交的应用程序,目前使用AWS服务进行部署.特别是,DB使用MYSQL在RDS上运行.到目前为止,我们使用有限数量的用户(主要是朋友)测试应用程序,平均每秒写入10次写入IOPS.
真正的问题与db的非常高的写入延迟有关,它始终高于100ms.RDS实例是db.m3.xlarge,远远超出我们的需要.
我试图在一个单独的实例(DB和EC2的相同配置)中执行负载测试,但即使我发送了更多的请求,我也无法重现如此高的延迟.所以我认为这可能是由于表碎片,但我还没有运行表优化,因为在此过程中无法访问db.
你对这个问题有经验吗?
更多信息
最大的表(称为Message)有大约790k行.关于此表,以下查询
insert into Message (user_id, creationDate, talk_id, text, id)
values (2015, '2015-02-01 16:40:06.737', 18312, 'Some text ', 904870)
Run Code Online (Sandbox Code Playgroud)
花了11秒才被执行.
更糟糕的是,查询
insert into Comment (anonymous, user_id, creationDate, deleted, post_id, text, id)
values (1, 107347, '2015-02-01 16:40:01.849', 0, 124888, 'Comment text', 265742)
Run Code Online (Sandbox Code Playgroud)
花了14秒,但表评论约有160k.
这两个表是由以下生成的:
CREATE TABLE `comment` (
`id` bigint(20) NOT NULL,
`anonymous` bit(1) NOT NULL,
`creationDate` datetime NOT NULL,
`deleted` bit(1) NOT NULL,
`text` varchar(1000) COLLATE utf8mb4_unicode_ci NOT NULL,
`user_id` bigint(20) NOT …Run Code Online (Sandbox Code Playgroud) 首次在Django上使用AWS服务.
想知道如何将在EC2实例中运行的Django应用程序配置为RDS中的Postgres数据库?
EC2正在运行ubuntu 14.04
需要什么特殊配置?
是否可以/建议创建只能访问 RDS MySQL 只读副本而不是主数据库服务器的用户?我有许多高级用户我想授予访问权限,以便他们可以运行运行缓慢的查询,但不想让他们访问主生产数据库本身。尝试直接在服务器上执行此操作,我得到ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement,因此猜测我必须在 db 参数组或类似的地方执行此操作。无论如何,想法?
我在尝试将无服务器Aurora数据库用作应用程序的一部分时遇到问题。
问题本质上是,当数据库处于冷态时,建立连接的时间可能大于30秒(由于db spinup)-这似乎比Sequelize中的默认超时(使用mysql)长,并且据我所知可以看到我找不到其他方法来增加此超时,或者我需要某种重新尝试连接的方法吗?
这是我当前的配置:
const sequelize = new Sequelize(DATABASE, DB_USER, DB_PASSWORD, {
host: DB_ENDPOINT,
dialect: "mysql",
operatorsAliases: false,
pool: {
max: 2,
min: 0,
acquire: 120000, // This needs to be fairly high to account for a
serverless db spinup
idle: 120000,
evict: 120000
}
});
Run Code Online (Sandbox Code Playgroud)
还有几点要点:一旦数据库变热,那么一切都会正常运行。在技术上可行的情况下,保持数据库“热”状态会破坏将其作为无服务器db的意义(成本原因)。如果超时是连接错误,我愿意让我的客户端重试API调用。
这是日志,以防万一。
{
"name": "SequelizeConnectionError",
"parent": {
"errorno": "ETIMEDOUT",
"code": "ETIMEDOUT",
"syscall": "connect",
"fatal": true
},
"original": {
"errorno": "ETIMEDOUT",
"code": "ETIMEDOUT",
"syscall": "connect",
"fatal": true
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过 kinesis 数据流传输 rds,但它给了我这个错误:
botocore.exceptions.ClientError:调用 PutRecord 操作时发生错误 (ValidationException):检测到 1 个验证错误:值 'arn:aws:kinesis:us-west-2:xxxxxxxxxx:stream/rds-temp-leads-stream' at 'streamName' 未能满足约束:成员必须满足正则表达式模式:[a-zA-Z0-9_.-]+
我能做些什么来解决这个问题?
import json
import boto3
from datetime import datetime
from pymysqlreplication import BinLogStreamReader
from pymysqlreplication.row_event import (
DeleteRowsEvent,
UpdateRowsEvent,
WriteRowsEvent,
)
class DateTimeEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, datetime):
return o.isoformat()
return json.JSONEncoder.default(self, o)
def main():
mysql = {
"host": "",
"port":,
"user": "",
"passwd": "",
"db": ""}
kinesis = boto3.client("kinesis", region_name = 'us-west-2')
stream = BinLogStreamReader(
connection_settings = mysql,
server_id=100,
blocking = True,
log_file='mysql-bin.000003',
resume_stream=True, …Run Code Online (Sandbox Code Playgroud) 使用 AWS RDS,控制台和 CLI/API 都有一个开关,使数据库可公开访问,但我找不到使用提供的构造使用新的 aws-cdk 执行此操作的方法。在 Cloud Formation 类(例如 CfnDBInstance)中有一个用于此的布尔值,但我找不到有关如何将其与构造结合使用的文档。CDK 非常了不起,它只用几行代码就完美地设置了一切,除了这一部分。
在我的公司,我们的应用程序在 NodeJS 上运行,并通过多个 EC2 实例和一个 RDS 数据库运行。
我们的应用程序需要一些升级,因为一些依赖项已经很旧了,我们所做的引起我们注意的升级之一是更新我们的数据库库:mysql(从 2.16.0 到 2.17.0)、knex(从 0.12.2 到 0.19 .1) 和书架(0.10.2 至 0.15.1)。
检查更改日志后,不需要更改代码,因此我们很快设法将其上传到我们的临时服务器。
突然,我们的应用程序变得太慢了。加载所有数据需要几秒钟,而我们的主要用户的仪表板在几毫秒内加载到同一台服务器上,需要大约 30 秒。几分钟后,整个应用程序完全没有响应。
为了检查问题是否仅与依赖项升级有关,我们设法将这些降级到工作版本,并且应用程序恢复到正常速度。又升级了,又慢了。
我们已经开始通过 New Relic 分析 RDS 方面是否有问题。什么都没有。没有高峰,没有高 CPU 使用率,没有慢查询或其他任何事情。然后我们来检查连接池,发现适合我们的knex版本使用“generic-pool”,而新版本使用“tarn”。
所以我们开始调试池,发现它被一个指定的查询填满,完全冻结了一段时间,然后开始抛出“TimeoutError: Knex: 获取连接超时。池可能已满”错误。
但是关于填充所有池并冻结的查询最有趣的是它根本不应该生成(并且在使用不存在此问题的过时版本时不会生成)。
在我们的应用程序中,我们只在两种情况下对联系人表执行 SELECT 请求:
首先,很明显,当用户想要列出他们的联系人时:
let contacts = await Contacts.forge({ 'list_owner': udata.id }).fetchAll()
Run Code Online (Sandbox Code Playgroud)
其次,在检查联系人匹配以判断某些信息是否应该对指定用户可见时,取决于信息所有者的隐私设置:
let checkContact = await Contacts.where({
list_owner: target_user,
contact: udata.id
}).fetch()
Run Code Online (Sandbox Code Playgroud)
经过几次 grepping,我可以保证我们的代码库中没有其他地方可以从联系人表中进行 SELECTS。在我们的调试中,我们没有发现未定义的值,并且我们的调查显示查询在之前的代码运行时运行。但是正如您在屏幕截图中看到的,查询 knex 运行没有条件:
select `contacts`.* from `contacts`
Run Code Online (Sandbox Code Playgroud)
我们相信这就是它填满池的原因(因为请求每个用户的联系人是一项相当大的工作),但与此同时,我们看不出为什么 knex 运行这样的查询,如:
amazon-rds ×10
mysql ×5
amazon-ec2 ×2
node.js ×2
aws-aurora ×1
aws-cdk ×1
aws-cli ×1
bookshelf.js ×1
django ×1
java ×1
knex.js ×1
python ×1
serverless ×1