Python查询Redshift报Connection reset by peer但DBeaver可正常连接
Python连接Redshift报Connection reset by peer排查
问题现象
通过Python编写的两种Redshift连接代码执行查询时,均返回Connection reset by peer错误;同网络环境下使用DBeaver连接同一集群、执行相同SQL可正常运行。
复现代码1:sqlalchemy实现
connection_string = "redshift+psycopg2://%s:%s@%s:%s/%s" % (USER, PASS, HOST, str(PORT), DATABASE) engine = sa.create_engine(connection_string) session = sessionmaker() session.configure(bind=engine) sess = session() sess.execute('SELECT * FROM MY_TABLE LIMIT 1;')
复现代码2:redshift_connector实现
conn = redshift_connector.connect( host=HOST, port=PORT, database=DATABASE, user=USER, password=PASS) cursor = conn.cursor() cursor.execute('SELECT * FROM MY_TABLE LIMIT 1;') all_results = cursor.fetchall() conn.close()
遗漏配置排查项
按出现概率从高到低排序:
- 未显式配置SSL连接
Redshift集群默认强制要求SSL加密连接,DBeaver的官方Redshift驱动默认自动开启SSL适配,但上述两段代码均未配置SSL参数,驱动会优先尝试明文连接,直接被服务端重置连接。
修复方式:- sqlalchemy连接串追加SSL参数:
connection_string = "redshift+psycopg2://%s:%s@%s:%s/%s?sslmode=require" % (USER, PASS, HOST, str(PORT), DATABASE) - redshift_connector连接参数补充
sslmode='require',如果是私有部署使用自签名证书的场景,额外增加sslrootcert参数指定根证书本地路径。
- sqlalchemy连接串追加SSL参数:
- 驱动版本过低不支持认证协议
现有Provisioned集群的新版本、Redshift Serverless均默认使用SCRAM-SHA-256认证协议,2.9以下版本的psycopg2、2.0.900以下版本的redshift_connector不支持该协议,会在握手阶段被服务端断开。直接将两个依赖升级到最新稳定版即可。 - 缺少TCP保活配置
企业内网、云环境的安全组默认会丢弃空闲超过一定时长的TCP连接,DBeaver默认内置30秒间隔的连接保活心跳,Python驱动默认无保活配置。如果是连接建立后空闲一段时间再执行查询报错,可追加保活参数:- sqlalchemy连接串追加:
&keepalives=1&keepalives_idle=30&keepalives_interval=10&keepalives_count=5 - redshift_connector连接参数补充
tcp_keepalive=True
- sqlalchemy连接串追加:
- 网络访问权限校验偏差
如果Python运行环境和DBeaver不在同一台设备,先确认Python运行环境的出口IP已加入Redshift集群安全组的5439端口入站允许列表;部分VPC端点配置会限制特定驱动的连接特征,可临时在同机器用命令行psql客户端验证连通性,排除网络层拦截。 - 参数拼写偏差
逐字段和DBeaver的连接配置比对host、port、database、用户名、密码,部分场景下参数拼写错误不会返回明确的"库不存在""鉴权失败"提示,会直接被服务端重置连接。
内容的提问来源于stack exchange,提问作者user1322801
相关产品推荐
相关产品推荐

