Percona MongoDB分片环境TLS连接报错:Socket异常求助
错误核心定位
从报错信息可以直接锁定问题:
"ctx":"js","msg":"Asio socket.set_option failed with std::system_error","attr":{"note":"connect (sync) TCP fast open","option":{"level":6,"name":30,"data":"01 00 00 00"},"error":{"what":"set_option: Protocol not available","message":"Protocol not available","category":"asio.system","value":92}}}
错误码92对应ENOPROTOOPT,本质是系统不支持TCP Fast Open(TFO)协议选项,而MongoDB在TLS连接流程中尝试启用TFO,导致连接失败。
分步排查与解决
1. 检查并开启系统TCP Fast Open支持
先确认系统是否开启TFO:
# 查看当前TFO配置 sysctl net.ipv4.tcp_fastopen # 或者查看proc文件 cat /proc/sys/net/ipv4/tcp_fastopen
- 正常支持TFO的系统值应为
3(客户端+服务器均允许) - 值为
0则完全禁用了TFO
如果是0,临时启用:
sysctl -w net.ipv4.tcp_fastopen=3
永久生效的话,编辑/etc/sysctl.conf添加一行:
net.ipv4.tcp_fastopen=3
然后执行sysctl -p加载配置。
2. 直接禁用MongoDB的TCP Fast Open功能
如果系统内核版本过低(低于Linux 3.7)无法支持TFO,或者不想修改系统配置,可以直接让MongoDB禁用TFO:
编辑MongoDB配置文件/etc/mongodb-config/mongod.conf,添加以下配置:
net: tcpFastOpenDisabled: true
修改后重启MongoDB进程:
# 根据你的环境选择重启方式,比如systemd systemctl restart mongod
3. 清理连接字符串中的冗余参数
你的连接字符串里包含了tlsClusterFile,这个参数是集群内部节点间通信使用的,客户端连接不需要指定,去掉后简化连接字符串:
mongodb://backup:backup123456@mdb-app-psmdb-db-mongos.percona-mongodb-operator.svc.cluster.local:27017/?tls=true&authSource=admin&tlsCAFile=/etc/mongodb-ssl/ca.crt&tlsCertificateKeyFile=/tmp/tls.pem
同时确认:
/etc/mongodb-ssl/ca.crt是客户端信任的CA证书,能正确验证mongos的服务端证书/tmp/tls.pem是客户端的证书+密钥组合,格式为PEM,包含完整的私钥和证书链- mongos服务端证书的CN或SAN字段包含其域名
mdb-app-psmdb-db-mongos.percona-mongodb-operator.svc.cluster.local
4. 版本兼容性检查
- 确认Linux内核版本≥3.7(TFO的最低要求),低于此版本建议直接禁用MongoDB的TFO(步骤2)
- 检查Percona MongoDB版本是否存在TFO+TLS的已知bug,必要时升级到最新稳定版
验证测试
完成上述步骤后,用修正后的连接字符串重新尝试连接:
mongo "mongodb://backup:backup123456@mdb-app-psmdb-db-mongos.percona-mongodb-operator.svc.cluster.local:27017/?tls=true&authSource=admin&tlsCAFile=/etc/mongodb-ssl/ca.crt&tlsCertificateKeyFile=/tmp/tls.pem"
内容的提问来源于stack exchange,提问作者Karthiknathan.C

