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作爲測試,但我們仍然看到相同的問題。正如你所說,必須是風帆,儘管這個問題是相當古老的。這可能是一回事,至少我們現在有一些東西要測試! –