5

我们在Google Container Engine上运行带有Cloud SQL数据库的Sails.js API,最近我们发现我们的一些端点一直在拖延,从未发送任何响应。Google Cloud SQL没有回复

我有一个健康检查监测/ v1 /状态,并且当我有如下简单的响应时,它记录了100%的正常运行时间;

status: function(req, res){ 
    res.ok('Welcome to the API');  
} 

只要我们添加了数据库查询,端点就开始超时。它不是一直发生,而是看似随机间隔,有时几个小时结束。这就是我们已经改变了查询;

status: function(req, res){ 
    Email.findOne({ value: "[email protected]" }).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) 

望着单独的错误,我会忍不住地说,我们有一些错误配置。但事实上,它在某些时候起作用(并且以前一直工作正常!)让我相信在这里工作还有其他一些黑魔法。我们的云端SQL实例是D0(尽管我们已经尝试将大小增加到D4),并且我们的激活策略是“始终开启”。

编辑:我看到其他人抱怨谷歌云SQL例如。 this SO post并且我很怀疑,但是我们之后将数据库移到了Amazon RDS,而且我们仍然看到相同的问题,所以它必须是sails和mysql适配器的问题。

这个问题每天都会导致数小时的停机,我们需要它解决,任何帮助都非常感谢!

回答

1

是否有任何方式可以达到Google Cloud SQL的QPS限制?看到这里:https://cloud.google.com/sql/faq#sizeqps

+0

在链接它解释说没有QPS上限,而是一个最大并发连接数限制。我们正在使用一个D0实例,它具有250个并发连接的限制,我们使用过的最多的是12个。感谢您的建议! –

1

为什么我的数据库实例有时响应缓慢? 为了最大限度地减少每次使用计费计划实例的费用,默认情况下,如果实例在15分钟内未被访问,则该实例将变为被动模式。下一次访问时,激活时会有短暂的延迟。您可以通过配置实例的激活策略来更改此行为。有关示例,请参阅使用Cloud SDK编辑实例。

它可能与您的策略设置有关。如果将其设置为ON_DEMAND,实例将进入睡眠状态以节省预算,以便激活实例的第一个查询很慢。这可能会导致超时。

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

+0

感谢您的建议,但没有我们使用“永远在线”激活政策,我会将这些信息添加到我的问题中。 –

2

这似乎是一个sails issue,并没有必然的关系的Cloud SQL。

+0

谢谢尼克!我们启动并将整个数据库移动到Amazon RDS作为测试,但我们仍然看到相同的问题。正如你所说,必须是风帆,尽管这个问题是相当古老的。这可能是一回事,至少我们现在有一些东西要测试! –