运行多个Airflow Scheduler实例触发Postgres锁问题的问询
问题根因
你遇到的SELECT slot_pool ... FOR UPDATE NOWAIT报错是多个Scheduler实例同时抢占资源行锁导致的,Airflow 2.1.4版本默认未开启分布式调度的锁优化配置,同时缺失部分多实例必备的公共配置,才会触发该错误。
需补充的配置项
1. Airflow公共环境变量配置
在&airflow-common的environment块中新增以下参数:
# 开启行级锁特性,优化分布式调度场景的锁冲突逻辑 AIRFLOW__SCHEDULER__USE_ROW_LEVEL_LOCKING: 'true' # 配置锁抢占失败后的重试次数,避免单次抢锁失败直接抛错 AIRFLOW__SCHEDULER__POOL_LOCK_RETRIES: 3 # 多实例部署必须使用统一的Fernet Key,否则加密信息会解密失败 # 可通过命令 `python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"` 生成有效Key AIRFLOW__CORE__FERNET_KEY: '替换为你生成的固定Fernet Key'
2. Postgres数据库配置调整
Airflow多实例运行要求数据库事务隔离级别为读已提交,需在docker-compose的postgres服务块中新增以下配置:
postgres: image: postgres:13 # 调整默认事务隔离级别 command: postgres -c default_transaction_isolation='read committed' # 其余原有配置(端口、 volumes、环境变量等)保持不变即可
版本优化建议
2.1.4版本存在多个分布式调度相关的已知缺陷,如果完成上述配置后仍存在偶发锁报错,建议将Airflow镜像版本升级到2.2.5及以上的LTS稳定版本,官方在后续版本中做了大量锁逻辑优化,可大幅降低多Scheduler场景的锁冲突概率。
内容的提问来源于stack exchange,提问作者Bran
相关产品推荐
相关产品推荐

