mongodb c ++ replica set getScopedDbConnection崩溃

时间:2014-03-27 09:07:24

标签: mongodb amazon-ec2 mongodb-c

我遇到了从我的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
}

防火墙似乎已正确调整。

非常感谢任何帮助。

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