我在Google App Engine应用上有一个Django应用,它使用App Engine authentication连接到Google Cloud SQL。
大部分时间一切正常,但有时会引发以下异常:
OperationalError: (2013, "Lost connection to MySQL server at 'reading initial communication packet', system error: 38")
根据the docs,在以下情况下会返回此错误:
例如,如果Google Cloud SQL拒绝连接,因为客户端连接的IP地址未经授权。
在我的情况下这没有多大意义,因为身份验证是由App Engine服务器完成的。
可能导致这些零星错误的原因是什么?
答案 0 :(得分:15)
我遇到了类似问题,最后联系谷歌寻求帮助。他们解释说,当他们需要重启或移动实例时就会发生这种情况。如果客户端实例重新启动或被移动到另一个主机服务器(对于各种版本),则IP将不匹配并抛出该错误。他们提到服务器可能会重新启动补丁,错误和减速导致类似的行为(无论是相同的错误还是类似)。服务器也会移动以尝试更接近实例以增加响应时间。如果您在移动期间发送请求,则会抛出错误。
他们告诉我,我需要在重试捕获中编写代码,类似于处理数据存储区超时的方式。牢记建立后退机制,重启后过快发送太多请求可能会导致崩溃。
这种情况多久发生一次?
答案 1 :(得分:3)
在我们的例子中,我们在代码中错误地重命名了实例。当我们改回正确的名字时,一切正常。确保您的Cloud SQL实例在Google Cloud Console内以及用于访问它的代码中正确命名,并确保您的Cloud SQL实例允许您的Google App Engine实例连接到它{{1} }。
答案 2 :(得分:0)
在我的情况下,问题是在CloudSQL实例上导致我过期的服务器SSL证书。奇怪的是,它没有在Google云端控制台中显示,并在下载证书并使用openssl(openssl x509 -in server-ca.pem -text -noout
)对其进行解码后计算出来。
尝试连接cloud_sql_proxy后,我能够找出问题的原因;幸运的是,它提供了更有意义的错误消息couldn't connect to "...": x509: certificate has expired or is not yet valid
。
从Google云端控制台重置SSL配置后,AppEngine Standard应用程序的连接立即开始工作。我注意到重置有效日期出现在控制台上。
答案 3 :(得分:-1)
我也使用Django 1.10和GAE来解决这个问题。该应用程序在本地工作正常(通过cloud_sql_proxy连接云sql),但在使用应用程序的GAE实例时我会收到38错误。
我的问题原来是我的数据库用户。用户有一个连字符。一旦我创建了一个没有连字符的新用户并将我的应用程序更改为使用新用户,那么该应用程序的GAE实例就可用了