谷歌云SQL无响应

5
我们在Google容器引擎上运行一个Sails.js API,并使用Cloud SQL数据库。最近,我们发现一些端点一直停滞不前,从未发送响应。我设置了一个健康检查来监测 /v1/status,当我得到以下简单响应时它显示100%的正常运行时间;
status: function( req, res ){
    res.ok('Welcome to the API');       
}

一旦我们添加了一个数据库查询,端点就开始超时。这并不总是发生,但似乎在随机的时间间隔内,有时会持续数小时。这是我们将查询更改为的内容;

status: function( req, res ){
    Email.findOne({ value: "someone@example.com" }).then(function( email ){
        res.ok('Welcome to the API');
    }).fail(function(err){
        res.serverError(err);
    });
}

这一切在我们的测试和开发环境中都可以正常工作,但只有当代码部署到生产环境时才会出现超时,并且有时只会出现超时。在测试和生产环境之间唯一改变的是我们连接的数据库和服务器的负载。

如我之前所提到的,我们正在使用Google Cloud SQLSails-MySQL适配器。我们从生产服务器获得了以下错误堆栈信息;

AdapterError: Invalid connection name specified
at getConnectionObject (/app/node_modules/sails-mysql/lib/adapter.js:1182:35)
at spawnConnection (/app/node_modules/sails-mysql/lib/adapter.js:1097:7)
at Object.module.exports.adapter.find (/app/node_modules/sails-mysql/lib/adapter.js:801:16)
at module.exports.find (/app/node_modules/sails/node_modules/waterline/lib/waterline/adapter/dql.js:120:13)
at module.exports.findOne (/app/node_modules/sails/node_modules/waterline/lib/waterline/adapter/dql.js:163:10)
at _runOperation (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/finders/operations.js:408:29)
at run (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/finders/operations.js:69:8)
at bound.module.exports.findOne (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/finders/basic.js:78:16)
at bound [as findOne] (/app/node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
at Deferred.exec (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/deferred.js:501:16)
at tryCatcher (/app/node_modules/sails/node_modules/waterline/node_modules/bluebird/js/main/util.js:26:23)
at ret (eval at <anonymous> (/app/node_modules/sails/node_modules/waterline/node_modules/bluebird/js/main/promisify.js:163:12), <anonymous>:13:39)
at Deferred.toPromise (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/deferred.js:510:61)
at Deferred.then (/app/node_modules/sails/node_modules/waterline/lib/waterline/query/deferred.js:521:15)
at Strategy._verify (/app/api/services/passport.js:31:7)
at Strategy.authenticate (/app/node_modules/passport-local/lib/strategy.js:90:12)
at attempt (/app/node_modules/passport/lib/middleware/authenticate.js:341:16)
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:342:7)
at Object.AuthController.login (/app/api/controllers/AuthController.js:119:5)
at bound (/app/node_modules/sails/node_modules/lodash/dist/lodash.js:729:21)
at routeTargetFnWrapper (/app/node_modules/sails/lib/router/bind.js:179:5)
at callbacks (/app/node_modules/sails/node_modules/express/lib/router/index.js:164:37)

Error (E_UNKNOWN) :: Encountered an unexpected error : 
Could not connect to MySQL: Error: Pool is closed.
at afterwards (/app/node_modules/sails-mysql/lib/connections/spawn.js:72:13)
at /app/node_modules/sails-mysql/lib/connections/spawn.js:40:7
at process._tickDomainCallback (node.js:381:11)

看到这些错误,我很容易就会说我们的配置有问题。但是它有时候可以正常工作(而且以前一直正常工作!),这让我相信还有其他黑魔法在起作用。我们的Cloud SQL实例是D0(虽然我们已经尝试将其升级到D4),激活策略是“始终开启”。
编辑:我曾看到其他人抱怨Google Cloud SQL,例如this SO post,我很怀疑,但我们已经将数据库迁移到Amazon RDS,仍然遇到同样的问题,所以这肯定是sails和mysql适配器的问题。
这个问题导致每天数小时的停机时间,我们需要解决它,非常感谢任何帮助!
3个回答

2
这似乎是一个关于 帆板问题,并不一定与 Cloud SQL 相关的问题。

谢谢Nick!我们将整个数据库迁移到了Amazon RDS进行测试,但仍然遇到了相同的问题。正如你所说,一定是Sails的问题,尽管这个问题很旧了。可能是同样的问题,至少现在我们有东西可以测试了! - Ryan Loader

1

在链接中解释说没有 QPS 限制,而是最大并发连接限制。我们正在使用 D0 实例,它有 250 个并发连接的限制,我们最多使用了 12 个。不过还是感谢您的建议! - Ryan Loader

1
有时我的数据库实例为什么会反应缓慢?
为了最大限度地减少按使用计费计划收取实例的金额,如果未访问实例15分钟,则默认情况下实例会变为被动状态。下次访问时,激活实例时会有短暂的延迟。您可以通过配置实例的激活策略来更改此行为。例如,请参见使用Cloud SDK编辑实例。
这可能与您的策略设置有关。如果将其设置为ON_DEMAND,则实例会休眠以节省预算,因此第一个查询以激活实例会很慢。这可能会导致超时。

https://cloud.google.com/sql/faq?hl=en


谢谢建议,但是我们使用“始终开启”激活策略,我会将这个信息添加到我的问题中。 - Ryan Loader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接