V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
hvboekml
V2EX  ›  MongoDB

百思不得其解的 MongoDB 问题:服务正常,但连接不上

  •  
  •   hvboekml · 82 天前 · 3717 次点击
    这是一个创建于 82 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有个网站用的是 MongoDB 数据库,搞不懂的地方在于网站正常,但是 mongo 连不上。

    最近没动过配置,不敢贸然重启服务,求教下各位

    第 1 条附言  ·  81 天前
    感谢各位,重启服务后解决了
    25 条回复    2021-09-17 20:22:31 +08:00
    Jooooooooo
        1
    Jooooooooo  
       82 天前   ❤️ 1
    网站正常说明 db 没问题, 那就是你的链接方式有问题

    看下是不是密码 /端口写错了, client 不兼容之类的
    hvboekml
        2
    hvboekml  
    OP
       82 天前
    @Jooooooooo 早前是正常的
    ElmerZhang
        3
    ElmerZhang  
       82 天前   ❤️ 1
    用什么连的?软件还是命令行的 mongo ?
    mongo 部署在哪里?你是从哪里连过去的?家里还是同一内网中的服务器?
    是报错还是卡住不动?报错的话把错误信息贴一下。
    qinxi
        4
    qinxi  
       82 天前   ❤️ 1
    原本正常,现在不行,如果没动数据库配置和代码连接配置的话, 先看看防火墙?
    hvboekml
        5
    hvboekml  
    OP
       82 天前
    @ElmerZhang
    @qinxi

    ```
    # bindIp: 127.0.0.1

    $ mongo
    MongoDB shell version v4.4.4
    connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
    ```
    用 `mongo` 卡住不动,用 `mongodump` 的话报错 `Failed: can't create session: could not connect to server: server selection error: server selection timeout, current topology`
    hvboekml
        6
    hvboekml  
    OP
       82 天前
    `mongodump` 报错:Failed: can't create session: could not connect to server: server selection error: server selection timeout, current topology: { Type: Single, Servers: [{ Addr: 127.0.0.1:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: connection() : connection(127.0.0.1:27017[-13]) incomplete read of message header: read tcp 127.0.0.1:54658->127.0.0.1:27017: i/o timeout }, ] }
    fkdtz
        7
    fkdtz  
       82 天前   ❤️ 1
    端口允许外网连接么,看看防火墙安全组之类的
    ila
        8
    ila  
       82 天前 via Android   ❤️ 1
    在 docker 容器内吗
    cathiabi
        9
    cathiabi  
       82 天前 via Android   ❤️ 1
    之前 mysql 遇到类似问题,后来发现需要用 root 权限运行客户端。安全升级的缘故只让用 socket 连。。。
    hvboekml
        10
    hvboekml  
    OP
       82 天前
    @fkdtz
    @ila
    @cathiabi 本地连的,不是 docker,试了 sudo 一样,前几天是正常的
    ElmerZhang
        11
    ElmerZhang  
       82 天前   ❤️ 1
    @hvboekml
    卡住的话首先怀疑是防火墙,但是你连的是 127.0.0.1,可以排除防火墙的原因。
    `sudo netstat -nltp` 看下端口是否正常,不过你没有报 'Connection refused' 八成是开着的。

    连接的时候 tail 一下 mongodb 日志和系统日志( /var/log/syslog 或者 /var/log/message ),看看有没有什么 warning, error 之类的日志吧。
    ila
        12
    ila  
       82 天前   ❤️ 1
    关闭掉 mongo server,在 27017 端口开启个 web 服务,能访问,排除了端口映射。
    mongo 能够进入 mongodb 的 shell 。排除了 mongodb 的问题。

    接下来可以锁定是网络配置了。
    你在 host 这栏填写主机名,非 ip 名。
    如果可以进入,那就是这个问题了。
    hvboekml
        13
    hvboekml  
    OP
       82 天前
    @ElmerZhang /var/log/syslog 没看到有报错,mongodb 的日志停留在几天前,停留的那天,我部署了基于 redis 的频率限制,我在想,难道是系统问题
    cathiabi
        14
    cathiabi  
       82 天前   ❤️ 1
    @hvboekml 用 telnet 连一下 27017 端口看看通不通,如果不通的话,服务是否有正常运行呢?网站正常的话不会是因为缓存了吧。
    cathiabi
        15
    cathiabi  
       82 天前   ❤️ 1
    还有一个很罕见的问题是 lo 本地回环有问题
    hvboekml
        16
    hvboekml  
    OP
       82 天前
    @ila 似乎只能重启了,准备今晚试试
    ElmerZhang
        17
    ElmerZhang  
       82 天前   ❤️ 1
    @hvboekml
    `sudo netstat -nltp` 还是看一下端口吧
    `ps aux | grep mongod` 看一下进程状态
    ila
        18
    ila  
       82 天前   ❤️ 1
    @hvboekml 你试了连接这个吗?
    mongodb://<服务器主机名>:27017
    hvboekml
        19
    hvboekml  
    OP
       82 天前
    @cathiabi 网站试了可以读写
    ```
    $ telnet 127.0.0.1 27017
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    ```
    hvboekml
        20
    hvboekml  
    OP
       82 天前
    @ElmerZhang
    ```
    $ sudo netstat -nltp
    tcp 2088 0 127.0.0.1:27017 0.0.0.0:* LISTEN 3204/mongod

    $ ps aux | grep mongod
    mongodb 3204 0.5 13.2 2073556 532464 ? Ssl Mar22 1412:17 /usr/bin/mongod --config /etc/mongod.conf
    ```
    hvboekml
        21
    hvboekml  
    OP
       82 天前
    @ila 试了 mongo,一样
    ElmerZhang
        22
    ElmerZhang  
       82 天前   ❤️ 1
    @hvboekml
    我记得 mongo 连上 mongod 之后,会先执行一些初始化 shell 的命令,比如 listDb 之类的,很可能是卡在这里了。
    你会不会写脚本?用 nodejs/php/python 之类的写个简单的连接脚本,看能不能连上去。
    如果能连上去的话,给脚本中加一个 currentOp 的输出。然后执行 mongo 去连接,趁它卡住时,执行一下脚本看看当前都有什么 op 在执行。
    cathiabi
        23
    cathiabi  
       82 天前   ❤️ 1
    python2,确认装了 pymongo,执行这几条看看

    from pymongo import MongoClient
    client = MongoClient(host="127.0.0.1")
    db = client.mydb
    print db.current_op(True)
    vanlink
        24
    vanlink  
       82 天前   ❤️ 1
    查查防火墙,wireshark 抓包看看
    hvboekml
        25
    hvboekml  
    OP
       82 天前
    @ElmerZhang
    @cathiabi
    @vanlink
    `Server selection timed out after 30000 ms`
    感觉免不了要中断服务,我准备先试下关掉新功能
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1126 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 22:38 · PVG 06:38 · LAX 14:38 · JFK 17:38
    ♥ Do have faith in what you're doing.