【发布时间】:2014-05-19 23:44:19
【问题描述】:
我有一个副本集设置,其中包含 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 的设置还是驱动程序的配置问题。有什么建议吗?
Mongo 版本 2.6.1 Java Mongo 驱动程序版本 2.12.1 Mongo 安装在 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
}]
}
}
在任何数据库上调用 insert 都会出现以下错误:
com.mongodb.MongoServerSelectionException:
Unable to connect to any server that matches{
serverSelectors=[ReadPreferenceServerSelector{
readPreference=primary
},
LatencyMinimizingServerSelector{
acceptableLatencyDifference=10000 ms
}]
}
【问题讨论】:
-
您似乎没有主节点。你在 Unknown 中有一个节点,一个 Secondary 和一个 Arbiter。所以,是的,这是您的 Mongo 集群设置的问题。尝试查看 mongod 日志。
标签: java mongodb mongodb-java