环境版本: mongoDB 3.6 pymongo 2.5
原因分析:
mongoDB 2.x的版本,是使用 MONGODB-CR的身份验证机制 ,mongoDB 3.0版本后,身份验证机制换成了SCRAM-SHA-1。
而pymongo 2.5的版本默认使用的身份验证机制是MONGODB-CR,造成认证机制不统一认证失败。
代码追溯:
上面通过mongoDB账号密码认证
(上面是监控脚本中的代码块)
(下面是pymongo源代码)
mechanism默认使用的是 MONGODB-CR
pymongo2.5版本仅支持 MONGODB-CR,GSSAPI 两种验证机制,而mongoDB3.6版本使用的验证机制是 SCRAM方式(根据版本不同可能使用 SCRAM-SHA-1或者 SCRAM-SHA-256)
后具体在mongoDB官方文档中查询到一条:
pymongo3.9官方文档中查询到:
MONGODB-CR验证机制在mongoDB 3.6版本已弃用
原因总结:
mongoDB 3.6版本弃用 MONGODB-CR,而pymongo2.5仅支持 MONGODB-CR,GSSAPI 两种验证机制,不支持mongoDB 3.6版本用的 SCRAM-SHA-1验证机制
版本不兼容,验证机制不同,经测试mongoDB 3.6 部分功能最低需要使用pymongo2.9版本及以上
最终解决办法:
用 venv 或其他虚拟环境工具搭建一个环境,监控脚本使用虚拟环境中pymongo的高版本对mongoDB的兼容,这样可以不限制生产环境mongoDB版本,减少版本兼容问题引发代码异常带来的业务风险。