docker - Dockerizing Flask Web App 后的周期性 "Lost connection to MySQL server during query"

标签 docker flask docker-compose mariadb flask-sqlalchemy

我有一个 Flask Web 应用程序,它曾经使用以下内容在独立服务器上运行:

  • flask /SQLAlchemy
  • MariaDB
  • uwsgi
  • nginx

  • 在独立服务器上,此应用程序运行良好。

    我已经在两个容器中“dockerized”了这个应用程序:
  • uwsgi-nginx-flask
  • MariaDB

  • 自从dockerizing我偶尔 得到这个错误(整个回溯发布在最后):
    Lost connection to MySQL server during query
    

    MariaDB 日志在详细日志记录中显示以下错误:
    2020-05-10 18:35:32 130 [Warning] Aborted connection 130 to db: 'flspection2' user: 'fl-server' host: '172.19.0.1' (Got an error reading communication packets)
    2020-05-10 18:45:34 128 [Warning] Aborted connection 128 to db: 'flspection2' user: 'fl-server' host: '172.19.0.1' (Got timeout reading communication packets)
    

    这是用户体验为 502 Bad Gateway .如果用户刷新页面,这通常会解决问题。这个问题是随机出现的。我无法随意重现它,但随着时间的流逝,它不可避免地会出现。

    这是什么原因造成的,我该如何解决?

    我所做的:
  • 验证 MariaDB 容器的超时时间为 28800。我已经看到在重新启动所有容器后该错误发生的时间比 28800 秒要快得多,所以我认为这实际上不是超时问题。
  • 套装pool_recycle选项 120
  • 验证 Flask-SQLAlchemy 正在使用 scoped_session这应该避免这些超时问题。
  • 已更改 network_mode默认每个评论。这并没有解决问题。

  • 我的想法是它就像flask和数据库之间的连接不可靠一样,但是作为运行在同一主机上的docker容器,这不是很可靠吗?

    相关代码:

    数据库.py
    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    

    配置文件
    class Config:
        ...
        SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://username:password@127.0.0.1/database?charset=utf8mb4'
        SQLALCHEMY_TRACK_MODIFICATIONS = False
        SQLALCHEMY_ENGINE_OPTIONS = {
            'pool_recycle': 120
        }
        ...
    

    docker-compose.yml
    version: "3.7"
    services:
      db:
        restart: "always"
        build: ./docker/db
        volumes:
          - "~/db:/var/lib/mysql"
        environment:
          MYSQL_ROOT_PASSWORD: "password"
          MYSQL_DATABASE: "database"
          MYSQL_USER: "user"
          MYSQL_PASSWORD: "password"
        ports:
          - '3306:3306'
      nginx-uwsgi-flask:
        restart: "always"
        depends_on:
          - "db"
        build:
          context: .
          dockerfile: ./docker/nginx-uwsgi-flask/Dockerfile
        volumes:
          - "~/data/fileshare:/fileshare"
        ports:
          - "80:80"
          - "443:443"
        network_mode: "host"
    

    追溯
    Traceback (most recent call last):
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
        context)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
        cursor.execute(statement, parameters)
      File "/usr/local/lib/python3.6/site-packages/pymysql/cursors.py", line 170, in execute
        result = self._query(query)
      File "/usr/local/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
        conn.query(q)
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 517, in query
        self._affected_rows = self._read_query_result(unbuffered=unbuffered)
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 732, in _read_query_result
        result.read()
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 1075, in read
        first_packet = self.connection._read_packet()
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 657, in _read_packet
        packet_header = self._read_bytes(4)
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 707, in _read_bytes
        CR.CR_SERVER_LOST, "Lost connection to MySQL server during query")
    pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
        response = self.full_dispatch_request()
      File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
        rv = self.handle_user_exception(e)
      File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
        reraise(exc_type, exc_value, tb)
      File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
        raise value
      File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
        rv = self.dispatch_request()
      File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
      File "/usr/local/lib/python3.6/site-packages/flask_user/decorators.py", line 132, in decorator
        allowed = _is_logged_in_with_confirmed_email(user_manager)
      File "/usr/local/lib/python3.6/site-packages/flask_user/decorators.py", line 17, in _is_logged_in_with_confirmed_email
        if user_manager.call_or_get(current_user.is_authenticated):
      File "/usr/local/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__
        return getattr(self._get_current_object(), name)
      File "/usr/local/lib/python3.6/site-packages/werkzeug/local.py", line 306, in _get_current_object
        return self.__local()
      File "/usr/local/lib/python3.6/site-packages/flask_login/utils.py", line 26, in <lambda>
        current_user = LocalProxy(lambda: _get_user())
      File "/usr/local/lib/python3.6/site-packages/flask_login/utils.py", line 335, in _get_user
        current_app.login_manager._load_user()
      File "/usr/local/lib/python3.6/site-packages/flask_login/login_manager.py", line 359, in _load_user
        return self.reload_user()
      File "/usr/local/lib/python3.6/site-packages/flask_login/login_manager.py", line 321, in reload_user
        user = self.user_callback(user_id)
      File "/usr/local/lib/python3.6/site-packages/flask_user/user_manager.py", line 130, in load_user_by_user_token
        user = self.db_manager.UserClass.get_user_by_token(user_token)
      File "/usr/local/lib/python3.6/site-packages/flask_user/user_mixin.py", line 51, in get_user_by_token
        user = user_manager.db_manager.get_user_by_id(user_id)
      File "/usr/local/lib/python3.6/site-packages/flask_user/db_manager.py", line 179, in get_user_by_id
        return self.db_adapter.get_object(self.UserClass, id=id)
      File "/usr/local/lib/python3.6/site-packages/flask_user/db_adapters/sql_db_adapter.py", line 48, in get_object
        return ObjectClass.query.get(id)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 924, in get
        ident, loading.load_on_pk_identity)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 1007, in _get_impl
        return db_load_fn(self, primary_key_identity)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/loading.py", line 250, in load_on_pk_identity
        return q.one()
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2954, in one
        ret = self.one_or_none()
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2924, in one_or_none
        ret = list(self)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2995, in __iter__
        return self._execute_and_instances(context)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3018, in _execute_and_instances
        result = conn.execute(querycontext.statement, self._params)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 948, in execute
        return meth(self, multiparams, params)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 269, in _execute_on_connection
        return connection._execute_clauseelement(self, multiparams, params)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1060, in _execute_clauseelement
        compiled_sql, distilled_params
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context
        context)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception
        exc_info
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause
        reraise(type(exception), exception, tb=exc_tb, cause=cause)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 248, in reraise
        raise value.with_traceback(tb)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
        context)
      File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
        cursor.execute(statement, parameters)
      File "/usr/local/lib/python3.6/site-packages/pymysql/cursors.py", line 170, in execute
        result = self._query(query)
      File "/usr/local/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query
        conn.query(q)
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 517, in query
        self._affected_rows = self._read_query_result(unbuffered=unbuffered)
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 732, in _read_query_result
        result.read()
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 1075, in read
        first_packet = self.connection._read_packet()
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 657, in _read_packet
        packet_header = self._read_bytes(4)
      File "/usr/local/lib/python3.6/site-packages/pymysql/connections.py", line 707, in _read_bytes
        CR.CR_SERVER_LOST, "Lost connection to MySQL server during query")
    sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') [SQL: 'SELECT user.is_active AS user_is_active, user.id AS user_id, user.username AS user_username, user.password AS user_password, user.reset_password_token AS user_reset_password_token, user.email AS user_email, user.email_confirmed_at AS user_email_confirmed_at, user.first_name AS user_first_name, user.last_name AS user_last_name \nFROM user \nWHERE user.id = %(param_1)s'] [parameters: {'param_1': 13}] (Background on this error at: http://sqlalche.me/e/e3q8)
    

    最佳答案

    我通过从 mariadb 迁移解决了这个问题容器到 mysql .我仍然不知道根本原因是什么。

    关于docker - Dockerizing Flask Web App 后的周期性 "Lost connection to MySQL server during query",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61665212/

    相关文章:

    python - 如何在 2 个不同的 app.route 中使用 Flask Flash 消息

    python - iOS - 如何使用没有命名空间的 flask-socketIO 连接到 flask 服务器?

    spring-boot - 从docker-compose获取端口8080已在使用中错误

    docker - docker --add-hostname不适用于Windows容器

    mongodb - Docker 与 MongoDB(和 Microsoft Azure)组合

    .net - 无法为Dotnet核心Web应用程序从Docker文件构建Docker镜像

    docker - Kubernetes、Flannel 和公开服务

    php - 为Docker启用Soap Client docker-compose php-fpm

    node.js - 碰撞 package.json 版本而不使 docker 缓存失效

    python - 在 Flask 中获取请求负载的一致方法