0%

记录-uwsgi+celery+psycopg2 DB连接问题排错过程

Pre:

celery的worker进程中,报错

1
2
3
4
5
6
7
8
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 106, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 412, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/usr/local/lib/python2.7/site-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
OperationalError: (psycopg2.OperationalError) could not receive data from server: Connection timed out
(Background on this error at: http://sqlalche.me/e/e3q8)

连接超时,无法取得数据.


Debug思路:

1.连接数:

看到报错 could not receive data from server: Connection timed out

一开始觉得是最大连接数的问题.

因为别的正在泡的应用会用pool_size=100的连接池去连接postgresql里的某个数据库,

查询最大连接数show max_connections;

最大连接连接数默认才100,那么pool_size=100的连接池去连接的话会全部占用了吧…

再继续查询

1
2
3
4
5
select max_conn,used,res_for_super,max_conn-used-res_for_super res_for_normal 
from
(select count(*) used from pg_stat_activity) t1,
(select setting::int res_for_super from pg_settings where name=$$superuser_reserved_connections$$) t2,
(select setting::int max_conn from pg_settings where name=$$max_connections$$) t3

实际上,并非连接数被占满了,还是有空余的连接数的.

既然还有剩余的,那我这个应用把连接池的pool_size改为10,应该能正常连接上吧.

修改之后,还是报同样的错误不行.


搜索了一下,然后根据这个链接PostgreSQL Connection Timed Out OperationalError on Django and new server

继续排错:

连接超时错误表明无法通过网络上的设置访问数据库服务器,其方式不会立即返回错误。

根据我的经验,最好的方法是分别对连接的两侧进行故障排除。这意味着首先从psql命令行测试连接的服务器端,然后在解析后测试django端。


  1. 你能从服务器ping服务器吗?如果没有,请从故障排除网络开始

ping 第一个网段的ip 发现会丢包…有点奇怪…

ping另一个网段的ip

不会丢包.难道要用另一个网段的ip来建立数据库连接?


  1. 你可以使用相同的端口,IP地址等通过psql连接到服务器吗?如果超时,您可能需要检查防火墙和postgresql配置

查看postgre 数据库所在的服务器的防火墙设置.发现也正常.

在客户端写了个简单的脚本,发现也连接正常.


真正的问题:

最终发现.用来连接数据库的内网ip冲突了…

omg…


refs: