我遇到了从我的c ++应用程序连接到副本集的麻烦。 如果连接到单个mongo实例,一切都很好。但是,如果尝试连接到副本集,应用程序将崩溃。 “崩溃”意味着进入ScopedDbConnection :: getScopedDbConnection后进程就会消失。
以下是我的代码。它是在使用g ++编译器运行Amazon linux的EC2实例上编译的。 我来自Windows世界,不知道如何提取有关崩溃的更多信息(例如,堆栈)。
void run()
{
syslog(LOG_INFO, "Before connection");
// scoped_ptr<ScopedDbConnection> conn( ScopedDbConnection::getScopedDbConnection("54.83.49.200")); // works just fine
// next line causes a crash
scoped_ptr<ScopedDbConnection> conn( ScopedDbConnection::getScopedDbConnection("myreplset/54.83.49.200,54.83.53.241,54.83.52.158"));
DBClientBase * client = conn->get();
syslog(LOG_INFO, "After connection"); // newer happens if connecting to replica set
do_something(client);
conn->done();
}
通过10gen提供的预配置映像(AMI)安装在Amazon EC2上的MongoDB服务器,版本为2.4.9 唯一的变化是设置副本集。
从MongoDB源版本2.4.9编译的C ++驱动程序。 Boost版本是1.53。
副本集配置:
myreplset:PRIMARY> rs.status()
{
"set" : "myreplset",
"date" : ISODate("2014-03-26T22:15:11Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "54.83.49.200:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 595,
"optime" : Timestamp(1395872014, 1),
"optimeDate" : ISODate("2014-03-26T22:13:34Z"),
"self" : true
},
{
"_id" : 1,
"name" : "54.83.53.241:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 95,
"optime" : Timestamp(1395872014, 1),
"optimeDate" : ISODate("2014-03-26T22:13:34Z"),
"lastHeartbeat" : ISODate("2014-03-26T22:15:10Z"),
"lastHeartbeatRecv" : ISODate("2014-03-26T22:15:11Z"),
"pingMs" : 1,
"syncingTo" : "54.83.49.200:27017"
},
{
"_id" : 2,
"name" : "54.83.52.158:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 93,
"lastHeartbeat" : ISODate("2014-03-26T22:15:10Z"),
"lastHeartbeatRecv" : ISODate("2014-03-26T22:15:10Z"),
"pingMs" : 1
}
],
"ok" : 1
}
防火墙似乎已正确调整。
非常感谢任何帮助。
答案 0 :(得分:-1)
您可以添加端口信息并尝试:
scoped_ptr<ScopedDbConnection> conn( ScopedDbConnection::getScopedDbConnection("myreplset/54.83.49.200:27017,54.83.53.241:27017,54.83.52.158:27017"));
请参阅client / dbclientinterface.h: ConnectionString处理解析连接到mongo和确定方法的不同方法 foo / server:port,server:port SET