gpt4 book ai didi

python - 使用 HAproxy 时 Flask-SQLAlchemy "MySQL server has gone away"

转载 作者:行者123 更新时间:2023-11-28 22:46:00 33 4
gpt4 key购买 nike

我已经使用 Flask 构建了一个小型 python REST 服务,使用 Flask-SQLAlchemy 与 MySQL 数据库通信。

如果我直接连接到 MySQL 服务器,一切都很好,完全没有问题。如果我使用 HAproxy(处理 HA/故障转移,尽管在这个开发环境中只有一个数据库服务器)然后如果应用程序不经常与数据库通信,我会不断收到 MySQL server has gone away 错误够了。

我的 HAproxy 客户端超时设置为 50 秒,所以我认为发生的情况是它切断了流,但应用程序并不知道并尝试使用无效连接。

在使用像 HAproxy 这样的服务时,我应该使用什么设置?

它似乎也不会自动重新连接,但如果我手动发出请求,我会得到 Can't reconnect until invalid transaction is rolled back,这很奇怪,因为它只是一个 select() 我正在调用,所以我不认为这是我遗漏的 commit() - 或者我应该在每个基于 ORM 之后调用 commit()查询?

最佳答案

为了用答案整理这个问题,我将发布我(认为我)为解决问题所做的工作。

问题一:HAproxy

  • 将 HAproxy 客户端超时值(全局或在前端定义中)增加到比 MySQL 设置的重置时间更长的值(参见 interesting and related SF 问题)
  • 或者在 Flask 的 app.config 中设置 SQLALCHEMY_POOL_RECYCLE = 30(在我的例子中,30 小于 HAproxy 客户端超时),这样当数据库初始化时,它将在 HAproxy 之前提取这些设置并回收连接自己切割。类似于 this issue on SO .

问题 2:在回滚无效事务之前无法重新连接

我相信我通过调整数据库初始化和导入不同模块的方式解决了这个问题。我现在基本上有一个模块,它只包含:

  from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()

然后在我的主application factory我只是:

  from common.database import db
db.init_app(app)

此外,因为我想轻松地自动加载表结构,所以我在应用程序上下文中初始化了元数据绑定(bind),我认为正是它干净地处理了我遇到的 commit() 问题/错误,因为我相信数据库 session 现在会在每次请求后正确终止。

 with app.app_context():
# Setup DB binding
db.metadata.bind = db.engine

关于python - 使用 HAproxy 时 Flask-SQLAlchemy "MySQL server has gone away",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972676/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com