簡體   English   中英

RDS Aurora Mysql 和 ECS 連接超時 (pymysql.err.OperationalError)(2003,“無法連接到 MySQL”)

[英]RDS Aurora Mysql and ECS connection timeouts (pymysql.err.OperationalError) (2003, "Can't connect to MySQL)

我有一個 ECS 集群,其中有兩個任務運行相同的容器/圖像。 我 terraform 集群和任務定義來啟動我的服務。 最近第一項任務開始正常,但第二項任務“卡住了”。 日志指示連接超時,因為正在調用連接池。 最終,第二個任務/容器將停止、耗盡並啟動新的任務/容器。 重復此循環,直到第二個實例連接並且一切正常。 一切似乎都在運行,第一個容器保持連接,一旦第二個容器開始運行,我就看不到進一步的超時。 這是怎么回事?

Python 非常簡單(基於 Grinberg 的 Mega 教程):

  • Flask
  • Flask-Sqlalchemy
  • pymysql
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

# This import will give me the missing MySQLdb python object
import pymysql
pymysql.install_as_MySQLdb()

# Create the DB engine object
db = SQLAlchemy()
migrate = Migrate()

def create_app(config_class=Config):
    db.init_app(discipline)
    migrate.init_app(discipline, db)

我試了一下,但沒有幫助:

    SQLALCHEMY_ENGINE_OPTIONS = {
        'connect_args': {
            'connect_timeout': 30
        }
    }

日志文件:

  File "/home/-/venv/lib/python3.9/site-packages/pymysql/connections.py", line 353, in __init__
    self.connect()
  File "/home/-/venv/lib/python3.9/site-packages/pymysql/connections.py", line 664, in connect
    raise exc
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'my.cluster-on.us-east-1.rds.amazonaws.com' (timed out)")
The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/-/venv/lib/python3.9/site-packages/pymysql/connections.py", line 613, in connect
    sock = socket.create_connection(
  File "/usr/local/lib/python3.9/socket.py", line 843, in create_connection
    raise err
  File "/usr/local/lib/python3.9/socket.py", line 831, in create_connection
    sock.connect(sa)
socket.timeout: timed out

我知道這是一個模糊的問題。 但是,在有幫助的設置或專門針對 ECS/RDS 的設置方面,有什么明顯的我忽略了嗎?

要添加的另一件事 - 使用 gunicorn 運行 - 3 名工人:

exec gunicorn -b :5000 -w 3 --log-level=warning --access-logfile - --error-logfile - my_app:"create_app()"

我終於弄明白了。 本質上它是 NACL 和安全組。 每個 ECS 任務都在特定的 su.net 中啟動,但 RDS 實例無法訪問。 運行狀況檢查終止任務並啟動另一個任務,隨機分配一個新的 su.net,一個可能有也可能沒有到 RDS 的路徑,直到最終可以建立連接並且任務保持運行。 由於對 inte.net 訪問資源的偏執,隨着時間的推移,我對 su.net 的使用、ENI 和 SG 變得有點不穩定。 整理我的 su.net/NACL/SG 配置后,一切正常。 希望這對其他人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM