
[英]psycopg2.OperationalError: FATAL: sorry, too many clients already on heroku
[英]Airflow psycopg2.OperationalError: FATAL: sorry, too many clients already
我有一個四節點集群 Airflow 環境,幾個月來一直運行良好。
ec2-實例
最近我一直在研究一個更復雜的 DAG,與我之前處理的相對較小的任務相比,它有幾十個任務。 我不確定這是否就是我現在看到這個錯誤彈出的原因還是什么,但我會偶爾收到這個錯誤:
在任務日志下的 Airflow UI 上:
psycopg2.OperationalError: FATAL: sorry, too many clients already
在網絡服務器上(從運行的氣流 webserver輸出)我也得到同樣的錯誤:
[2018-07-23 17:43:46 -0400] [8116] [ERROR] Exception in worker process
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2158, in _wrap_pool_connect
return fn()
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 403, in connect
return _ConnectionFairy._checkout(self)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 788, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 532, in checkout
rec = pool._do_get()
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1193, in _do_get
self._dec_overflow()
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise
raise value
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 1190, in _do_get
return self._create_connection()
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 350, in _create_connection
return _ConnectionRecord(self)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 477, in __init__
self.__connect(first_connect_check=True)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line 671, in __connect
connection = pool._invoke_creator(self)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 106, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 410, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/usr/local/lib64/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL: sorry, too many clients already
我可以通過運行sudo /etc/init.d/postgresql restart
並重新啟動 DAG 來解決這個問題,但是在大約運行三遍后,我將再次開始看到錯誤。
我找不到有關 Airflow 的任何有關此問題的詳細信息,但是從我發現的其他帖子(例如此帖子)中,他們說這是因為我的客戶(我想在這種情況下是 Airflow)試圖打開更多連接到 PostgreSQL 而不是 PostgreSQL 配置為處理的內容。 我運行這個命令發現我的 PostgreSQL 可以接受 100 個連接:
[ec2-user@ip-1-2-3-4 ~]$ sudo su
root@ip-1-2-3-4
[/home/ec2-user]# psql -U postgres
psql (9.2.24)
Type "help" for help.
postgres=# show max_connections;
max_connections
-----------------
100
(1 row)
在這個解決方案中,帖子說我可以增加我的 PostgreSQL 最大連接數,但我想知道我是否應該在我的 Airflow.cfg 文件中設置一個值,以便我可以將 Airflow 允許的連接大小與我的 PoastgreSQL 最大連接大小相匹配。 有誰知道我可以在 Airflow 中的哪里設置這個值? 以下是我認為相關的領域:
# The SqlAlchemy pool size is the maximum number of database connections
# in the pool.
sql_alchemy_pool_size = 5
# The SqlAlchemy pool recycle is the number of seconds a connection
# can be idle in the pool before it is invalidated. This config does
# not apply to sqlite.
sql_alchemy_pool_recycle = 3600
# The amount of parallelism as a setting to the executor. This defines
# the max number of task instances that should run simultaneously
# on this airflow installation
parallelism = 32
# The number of task instances allowed to run concurrently by the scheduler
dag_concurrency = 32
# When not using pools, tasks are run in the "default pool",
# whose size is guided by this config element
non_pooled_task_slot_count = 128
# The maximum number of active DAG runs per DAG
max_active_runs_per_dag = 32
對解決此問題的任何建議持開放態度。 這與我的 Airflow 配置有關還是與我的 PostgreSQL 配置有關?
此外,因為我正在測試一個新的 DAG,我有時會終止正在運行的任務並重新啟動它們。 也許這樣做會導致某些進程無法正確終止,並且它們保持與 PostgreSQL 的死連接打開?
遇到類似的問題。 我將 postgres 中的max_connections
更改為10000
, sql_alchemy_pool_size
氣流配置中的sql_alchemy_pool_size
更改為1000
。 現在我能夠並行運行數百個任務。
PS:我的機器有 32 個內核和 60GB 內存。 因此,它承擔了負擔。
引用氣流文檔:
sql_alchemy_max_overflow :池的最大溢出大小。 當檢出的連接數達到 pool_size 中設置的大小時,將返回額外的連接,直至達到此限制。 當這些額外的連接返回到池中時,它們會斷開連接並被丟棄。 因此,池允許的同時連接總數是 pool_size + max_overflow,池允許的“休眠”連接總數是 pool_size。 max_overflow 可以設置為 -1 表示沒有溢出限制; 並發連接總數沒有限制。 默認為 10。
似乎您要在airflow.cfg
上設置的變量都是sql_alchemy_pool_size
和sql_alchemy_max_overflow
。 您的 PostgreSQL max_connections
必須等於或大於這兩個 Airflow 配置變量的總和,因為 Airflow 最多可以有sql_alchemy_pool_size + sql_alchemy_max_overflow
打開與您的數據庫的連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.