gpt4 book ai didi

Java MongoClient 无法连接到主数据库

转载 作者:行者123 更新时间:2023-12-01 12:57:52 26 4
gpt4 key购买 nike

我有一个副本集设置,其中包含 1 个主节点 (mongo1.test.com)、1 个辅助节点 (mongo2.test.com) 和 1 个仲裁节点 (mongo3.test.com)。当我使用 MongoClient 连接到它们并打印出 ReplicaSetStatus 时,它显示 mongo1.test.com 未连接且 type=Unknown,mongo2.test.com 未连接为 type=ReplicaSetSecondary,mongo3.test.com 未连接为 type=Unknown。因为它不知道哪一个是主要的,所以我可以查找查询,但无法插入或更新。

现在我不知道是Mongo的设置问题还是驱动程序的配置问题。有什么建议吗?

蒙戈版本2.6.1Java Mongo 驱动程序版本 2.12.1Mongo 安装在 3 个独立的 Amazon EC2 Linux 服务器上。

代码如下:

MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder()
.acceptableLatencyDifference(10000)
.writeConcern(WriteConcern.REPLICA_ACKNOWLEDGED)
.readPreference(ReadPreference.secondaryPreferred())
.connectionsPerHost(10)
.connectTimeout(15000)
.maxWaitTime(30000)
.socketTimeout(60000)
.threadsAllowedToBlockForConnectionMultiplier(1500);

MongoClientOptions options = optionsBuilder.build();
MongoClient mc = new MongoClient(Arrays.asList(
new ServerAddress("mongo1.test.com",27017),
new ServerAddress("mongo2.test.com",27018),
new ServerAddress("mongo3.test.com",27019)),
Arrays.asList(MongoCredential.createMongoCRCredential(xxx, "admin", xxx.toCharArray()))), options);
System.out.println(mc.getRelicaSetStatus());

ReplicaSetStatus 打印输出:

ReplicaSetStatus {
name=eeRS1,
cluster=ClusterDescription{
type=ReplicaSet,
connectionMode=Multiple,
all=[ServerDescription{
address=PRIVATE IP:27017,
type=Unknown,
hosts=[],
passives=[],
arbiters=[],
primary='null',
maxDocumentSize=16777216,
maxMessageSize=33554432,
maxWriteBatchSize=512,
tags={}, setName='null',
setVersion='null',
averagePingTimeNanos=0,
ok=false,
state=Unconnected,
version=ServerVersion{
versionList=[0, 0, 0]
},
minWireVersion=0,
maxWireVersion=0
}, ServerDescription{
address=mongo2.test.com:27018,
type=ReplicaSetSecondary,
hosts=[PRIVATE IP:27017,
mongo2.test.com:27018],
passives=[],
arbiters=[mongo3.test.com:27019],
primary='PRIVATE IP:27017',
maxDocumentSize=16777216,
maxMessageSize=48000000,
maxWriteBatchSize=1000,
tags={},
setName='eeRS1',
setVersion='17',
averagePingTimeNanos=215754657,
ok=true,
state=Connected,
version=ServerVersion{
versionList=[2, 6, 1]
},
minWireVersion=0,
maxWireVersion=2
},
ServerDescription{
address=mongo3.test.com:27019,
type=ReplicaSetArbiter,
hosts=[PRIVATE IP:27017,
mongo2.test.com:27018],
passives=[],
arbiters=[mongo3.test.com:27019],
primary='PRIVATE IP:27017',
maxDocumentSize=16777216,
maxMessageSize=48000000,
maxWriteBatchSize=1000,
tags={},
setName='eeRS1',
setVersion='17',
averagePingTimeNanos=132660144,
ok=true,
state=Connected,
version=ServerVersion{
versionList=[2, 6, 1]
},
minWireVersion=0,
maxWireVersion=2
}]
}
}

在任何数据库上调用插入都会出现以下错误:

com.mongodb.MongoServerSelectionException: 
Unable to connect to any server that matches{

serverSelectors=[ReadPreferenceServerSelector{
readPreference=primary
},
LatencyMinimizingServerSelector{
acceptableLatencyDifference=10000 ms
}]
}

最佳答案

我认为您的问题不是 Java 驱动程序,而是 ReplSet 本身。启动 mongo shell 并执行 rs.status()。您可能会看到几乎与 Java 驱动程序为您提供的内容完全相同的输出。您的 mongo1.test.com 似乎完全离线或未启动。 SSH 到 mongo1.test.com 并查看是否可以从那里使用 mongo shell。我的赌注是“不”。跟踪 mongo 服务器日志,看看它告诉你什么。也许停止该服务并在那里启动它以获取日志,以便您对问题有一个新的了解。

好消息是,我认为你的 Java 代码实际上可以工作,你只是在 ReplSet 配置中有一个 dorked mongod。取消它,ReplSet 会自行修复,然后你就可以上路了。

关于Java MongoClient 无法连接到主数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23748868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com