【问题标题】:Connecting to MongoDB replica set results in "Expecting replica set member, but found a STANDALONE"连接到 MongoDB 副本集导致“期望副本集成员,但找到一个 STANDALONE”
【发布时间】:2022-01-25 20:26:21
【问题描述】:

我正在尝试通过在 Quarkus 上运行的应用程序连接到我的本地 MongoDB 副本集(通过 Docker Compose 配置),但是当我尝试通过应用程序访问数据库时出现以下错误:

2022-01-24 14:51:03,170 ERROR [org.mon.dri.cluster] (cluster- ClusterId{value='61eeaec706f79a375f4b4c19', description='null'}-mongo1:27017) Expecting replica set member, but found a STANDALONE.  Removing mongo1:27017 from client view of cluster.
2022-01-24 14:51:03,177 ERROR [org.mon.dri.cluster] (cluster-ClusterId{value='61eeaec706f79a375f4b4c19', description='null'}-mongo3:27017) Expecting replica set member, but found a STANDALONE.  Removing mongo3:27017 from client view of cluster.
2022-01-24 14:51:03,182 ERROR [org.mon.dri.cluster] (cluster-ClusterId{value='61eeaec706f79a375f4b4c19', description='null'}-mongo2:27017) Expecting replica set member, but found a STANDALONE.  Removing mongo2:27017 from client view of cluster.
2022-01-24 14:51:08,179 ERROR [nl.rab.kno.int.LoggingInterceptor] (executor-thread-0) LoggingInterceptor.MethodCallEvent(className=nl.rabobank.knowledge.service.PreferencesService, methodName=getLanguagesForUser, result=EXCEPTION, exception=com.mongodb.MongoTimeoutException: Timed out after 5000 ms while waiting for a server that matches com.mongodb.client.internal.MongoClientDelegate$1@31e1baef. Client view of cluster state is {type=REPLICA_SET, servers=[])

由于某种原因,它似乎将我的节点识别为独立的,而不是副本集成员,之后它们将从集群的客户端视图中删除。我想知道这里出了什么问题?

这是我在 Quarkus 应用程序中使用的连接字符串:

quarkus:
    mongodb:
        connection-string: mongodb://mongo1:27021,mongo2:27022,mongo3:27023/database?replicaSet=dbrs

我只是按照本指南使用 Docker Compose 在 MongoDB 中设置副本集:https://blog.tericcabrel.com/mongodb-replica-set-docker-compose/

这些是我的 Quarkus 应用程序(版本 2.6.2)使用的依赖项:

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-mongodb-client</artifactId>
</dependency>
<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-mongodb-panache</artifactId>
</dependency>

【问题讨论】:

  • mongod 引擎(服务器)是如何启动的?您的错误与mongod 的启动没有 --replSet dbrs 参数一致。
  • 我基本上遵循了这个教程,blog.tericcabrel.com/mongodb-replica-set-docker-compose,为每个容器定义了一个入口点:entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
  • 如果它是一个“全新的”mongod,那么在它首次启动后,您必须通过连接mongomongosh(CLI)来初始化副本集无需连接字符串中的replicaSet参数如下:mongo --host "mongodb://someMachineNameOrIP:thePort" --eval 'rs.initiate()'
  • 我也这样做了,并且在同一教程中也有介绍,其中rs.initiate(config, { force: true }); 作为./rs-init.sh 脚本的一部分执行。

标签: java mongodb quarkus replicaset mongodb-replica-set


【解决方案1】:

您忘记告诉您的节点,它们属于一个副本集! 你有两个选择,命令行:

mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>

或在配置文件内

replication:
   replSetName: "rs0"
net:
   bindIp: localhost,<hostname(s)|ip address(es)>

查看here!的更多信息

【讨论】:

  • 这已在我的 Docker Compose 脚本中进行了介绍,其中每个容器/节点定义了此入口点:入口点:[“/usr/bin/mongod”、“--bind_ip_all”、“--replSet” ,“数据库”]。我遵循了本教程blog.tericcabrel.com/mongodb-replica-set-docker-compose
【解决方案2】:

看来我找到了问题所在。在我的本地机器上删除 Mongo 后,我设法摆脱了该特定错误,导致只有 Mongo 作为我的容器化节点的一部分。

但是,我现在遇到了另一个问题,为此我创建了这篇文章:Connecting to containerised MongoDB replica set with Docker results in "Canonical address ... does not match server address."

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多