首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >操作错误:致命:对不起,太多客户了

操作错误:致命:对不起,太多客户了
EN

Stack Overflow用户
提问于 2018-07-23 21:58:37
回答 2查看 9.9K关注 0票数 7

我有一个四个节点的集群气流环境,已经为我工作了几个月。

EC2-实例

  • 服务器1: Webserver,Scheduler,Redis队列,PostgreSQL数据库
  • 服务器2: Webserver
  • 服务器3:工人
  • 服务器4:工人

最近,我一直在研究一个更复杂的DAG,它有几十个任务,而我以前做过的相对较小的任务。我不知道这是否是我刚才看到这个错误弹出的原因,但是我会偶尔得到这个错误:

在任务日志下的气流UI上:

代码语言:javascript
运行
复制
psycopg2.OperationalError: FATAL: sorry, too many clients already

在get服务器(运行气流get服务器的输出)上,我也得到了相同的错误:

代码语言:javascript
运行
复制
[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来修复这个问题,但是在大约三次运行之后,我将再次看到错误。

我在这个问题上找不到任何关于气流的细节,但是他们从其他我找到的帖子,比如这个上说,这是因为我的客户(我想在这个例子中是气流)试图打开更多的PostgreSQL连接,而不是PostgreSQL配置来处理的。我运行这个命令以发现我的PostgreSQL可以接受100个连接:

代码语言:javascript
运行
复制
[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的最大连接,但是我想知道是否应该在PostgreSQL文件中设置一个值,这样我就可以将允许的气流连接大小与我的PoastgreSQL最大连接大小相匹配。有谁知道我在哪里可以在气流中设定这个数值吗?以下是我认为相关的领域:

代码语言:javascript
运行
复制
# 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

对解决这一问题的任何建议持开放态度。这是否与我的气流配置有关,还是与我的PostgreSQL配置有关?

另外,由于我正在测试一个新的DAG,所以有时我会终止正在运行的任务并重新启动它们。也许这样做会导致某些进程不正确地死掉,并且它们将死连接保持为PostgreSQL打开?

EN

回答 2

Stack Overflow用户

发布于 2018-09-20 11:59:36

也遇到了类似的问题。我将postgres中的max_connections更改为10000,在气流配置中将sql_alchemy_pool_size更改为1000。现在,我能够并行运行数百个任务。

PS:我的机器有32核和60 32内存。因此,它承担了负担。

票数 4
EN

Stack Overflow用户

发布于 2021-02-18 18:05:58

引用气流文件

sql_alchemy_max_overflow:池的最大溢出大小。当签出连接的数量达到pool_size中设置的大小时,将返回不超过此限制的其他连接。当这些附加连接返回到池时,它们将被断开并丢弃。因此,池将允许的同时连接的总数为pool_size + max_overflow,而池将允许的“休眠”连接的总数为pool_size。可以将max_overflow设置为-1以表示没有溢出限制;对并发连接的总数没有限制。默认为10。

您想在airflow.cfg上设置的变量似乎都是sql_alchemy_pool_sizesql_alchemy_max_overflow。您的PostgreSQL max_connections必须等于或大于这两个气流配置变量的之和,因为气流最多可以打开与数据库的sql_alchemy_pool_size + sql_alchemy_max_overflow连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51487740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档