在 Airflow 中,如果使用 Celery 作为任务队列并且使用了 MySQL 作为元数据库,可能会出现 Celery 工人创建了太多的 MySQL 连接的问题。这可能是由于 Celery 的连接池设置不正确所导致的。
解决方法可以通过修改 Celery 的连接池配置来解决。你可以在 Airflow 的配置文件中添加以下配置来限制 Celery 工人创建的 MySQL 连接数量:
# airflow.cfg
[celery]
worker_concurrency = 1
worker_max_tasks_per_child = 1
worker_max_memory_per_child = 200000000
worker_prefetch_multiplier = 1
解释一下这些配置项的含义:
worker_concurrency
: 设置工人的并发任务数。将其设置为1可以确保每个工人只执行一个任务,从而限制了连接的数量。worker_max_tasks_per_child
: 设置每个工人可以执行的最大任务数。在每个任务之间重新创建工人可以帮助释放连接。worker_max_memory_per_child
: 设置每个工人可以使用的最大内存量。这可以帮助限制工人的资源使用。worker_prefetch_multiplier
: 设置工人获取任务的数量。将其设置为1可以确保每个工人一次只获取一个任务。设置完毕后,重启 Airflow 和 Celery 服务,这样就可以限制 Celery 工人创建的 MySQL 连接数量了。