使用 Docker 部署 Mongodb 集群后项目中的连接问题

本贴最后更新于 1288 天前,其中的信息可能已经事过景迁

问题

CentOS 7 + docker + mongodb 4.4.4 部署了一个 mongodb 集群,然后在项目(Java-springboot)中去连接 mongodb 进行数据的读写,出现如下提示:

2021-05-12 13:42:33.003  INFO 17864 --- [io-8084-exec-10] org.mongodb.driver.cluster               : Cluster created with settings {hosts=[121.*.*.56:27017], mode=MULTIPLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=1500000}
2021-05-12 13:42:33.003  INFO 17864 --- [io-8084-exec-10] org.mongodb.driver.cluster               : Adding discovered server 121.*.*.56:27017 to client view of cluster
2021-05-12 13:42:33.006  INFO 17864 --- [io-8084-exec-10] org.mongodb.driver.cluster               : No server chosen by WritableServerSelector from cluster description ClusterDescription{type=UNKNOWN, connectionMode=MULTIPLE, serverDescriptions=[ServerDescription{address=121.36.16.56:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
2021-05-12 13:42:33.108  INFO 17864 --- [.*.*.56:27017] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:985, serverValue:377}] to 121.*.*.56:27017
2021-05-12 13:42:33.133  INFO 17864 --- [.*.*.56:27017] org.mongodb.driver.cluster               : Monitor thread successfully connected to server with description ServerDescription{address=121.*.*.56:27017, type=REPLICA_SET_PRIMARY, state=CONNECTED, ok=true, version=ServerVersion{versionList=[4, 4, 4]}, minWireVersion=0, maxWireVersion=9, maxDocumentSize=16777216, roundTripTimeNanos=25262872, setName='mongoreplset', canonicalAddress=172.17.0.4:27017, hosts=[172.17.0.4:27017, 121.*.*.103:27017, 172.17.0.6:27017], passives=[], arbiters=[], primary='172.17.0.4:27017', tagSet=TagSet{[]}, electionId=7fffffff0000000000000024, setVersion=2, lastWriteDate=Wed May 12 13:42:42 CST 2021, lastUpdateTimeNanos=533944664886564}
2021-05-12 13:42:33.134  INFO 17864 --- [.*.*.56:27017] org.mongodb.driver.cluster               : Discovered cluster type of REPLICA_SET
2021-05-12 13:42:33.134  INFO 17864 --- [.*.*.56:27017] org.mongodb.driver.cluster               : Adding discovered server 172.17.0.4:27017 to client view of cluster
2021-05-12 13:42:33.135  INFO 17864 --- [.*.*.56:27017] org.mongodb.driver.cluster               : Adding discovered server 121.*.*.103:27017 to client view of cluster
2021-05-12 13:42:33.136  INFO 17864 --- [.*.*.56:27017] org.mongodb.driver.cluster               : Adding discovered server 172.17.0.6:27017 to client view of cluster
2021-05-12 13:42:33.137  INFO 17864 --- [.*.*.56:27017] org.mongodb.driver.cluster               : Server 121.*.*.56:27017 is no longer a member of the replica set.  Removing from client view of cluster.
2021-05-12 13:42:33.137  INFO 17864 --- [.*.*.56:27017] org.mongodb.driver.cluster               : Canonical address 172.17.0.4:27017 does not match server address.  Removing 121.36.16.56:27017 from client view of cluster
2021-05-12 13:42:34.212  INFO 17864 --- [*.*.103:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server 121.*.*.103:27017

进入 mongodb 容器中,查看当前 rs.conf()

mongoreplset:PRIMARY> rs.conf()
{
        "_id" : "mongoreplset",
        "version" : 2,
        "term" : 36,
        "protocolVersion" : NumberLong(1),
        "writeConcernMajorityJournalDefault" : true,
        "members" : [
                {
                        "_id" : 0,
                        "host" : "172.17.0.4:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {
                      
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 1,
                        "host" : "172.17.0.6:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {
                      
                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
		...

可以看到现在的复制集中使用的是非外网 IP 配置的,此时,在项目中连接时就会出现上面的连接不通问题。

后来重新部署,然后将其中的 host 换为服务器 IP:port 后,就可以正常连接读写数据了。

问题:

是否只能如此配置外网 ip?

如果配置宿主机内的 ip ,应该如何配置才能不报错,是不是需要配置 宿主机上的 hosts 映射到内网 ip ?

  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 1 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8112 引用 • 37001 回帖 • 160 关注

相关帖子

被采纳的回答
  • MingGH 1 1 赞同

    虽然没有配置过 mongodb 集群,但是碰到过类似问题给你参考参考。
    我搭建的是 redis 集群,3 主 3 从 6 个 container 通过 docker 的 bridge 中进行通信,也就是这样

    docker network create -d bridge  --subnet=192.168.1.0/24 localBr
    

    然后问题来了,当我用项目去连接的时候,返回给我的是 docker 中的 bridge 指定的 ip,因为我创建 redis container 的命令大概是这样的,带了指定的 bridge 以及 ip

    docker run --network localBr --ip 192.168.1.102 --name redis -p 6379:6379 -d --restart=always redis:latest redis-server --appendonly yes --requirepass "123456"
    

    所以除非我的项目也能连接到我创建的 bridge,不然肯定连接不上集群
    所以把 docker 创建 redis 的命令改了一下,不走 bridge,而是 host 模式 --net=host
    然后确实可以了,但是这样每个 redis 容器都要占用一个宿主机的端口

    如果有更好的办法提醒我一下

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • MingGH 1 赞同 3 评论
    学到了学到了。。👍
    PeterChu
    不过还是用了 3 个端口
    PeterChu
  • 其他回帖
  • MingGH 1 1 赞同

    虽然没有配置过 mongodb 集群,但是碰到过类似问题给你参考参考。
    我搭建的是 redis 集群,3 主 3 从 6 个 container 通过 docker 的 bridge 中进行通信,也就是这样

    docker network create -d bridge  --subnet=192.168.1.0/24 localBr
    

    然后问题来了,当我用项目去连接的时候,返回给我的是 docker 中的 bridge 指定的 ip,因为我创建 redis container 的命令大概是这样的,带了指定的 bridge 以及 ip

    docker run --network localBr --ip 192.168.1.102 --name redis -p 6379:6379 -d --restart=always redis:latest redis-server --appendonly yes --requirepass "123456"
    

    所以除非我的项目也能连接到我创建的 bridge,不然肯定连接不上集群
    所以把 docker 创建 redis 的命令改了一下,不走 bridge,而是 host 模式 --net=host
    然后确实可以了,但是这样每个 redis 容器都要占用一个宿主机的端口

    如果有更好的办法提醒我一下

    1 回复
  • Gakkiyomi2019 1 评论

    胡说

    😂 来嘛,你说说
    PeterChu
  • hjljy 1 评论

    数据库我都是直接装在物理机上的,感觉放在 docker 里面不是很好

    1 回复
    嗯有点道理,现在用 docker 起 mongodb 但是还要做一下数据持久化
    PeterChu
  • 查看全部回帖
PeterChu
人生是场修行,求知是种信仰 ! 北京

推荐标签 标签

  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 1 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    286 引用 • 729 回帖
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 816 回帖 • 1 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    105 引用 • 127 回帖 • 382 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 654 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    85 引用 • 139 回帖 • 1 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 700 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 173 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 709 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 65 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    543 引用 • 672 回帖 • 1 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    266 引用 • 665 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 19 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    287 引用 • 4484 回帖 • 669 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 664 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 165 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 595 关注