使用C++连接MongoDB集群

来源:互联网 发布:矿用u型钢支架数据 编辑:程序博客网 时间:2024/06/02 01:19

项目中用到了MongoDB,由于担心将来接口请求量过大后,单服务会出现宕机。所以研究了下mongo的集群,但发现了好多问题,在这里记录下。

我的编译环境:Centos 6.8、mongodb3.0+、mongodbC++ driver 2.6。

以SYNC方式连接mongodb

先上代码:

/* * 连接mongodb集群使用案例 * */#include <mongo/client/dbclient.h>#include <mongo/client/syncclusterconnection.h>#include "json/json.h"#include <iostream>#include <string>#include <list>using namespace std;int main(int argc, char **argv){    char *ip[3] = {"xxx.xxx.xxx.xxx", "xxx.xxx.xxx.xxx", "xxx.xxx.xxx.xxx"};    int port = 27020;    //构建mongodb服务器地址列表    list<mongo::HostAndPort> servers;    for(int i = 0; i < 3; i++)    {        mongo::HostAndPort host(ip[i], port);        servers.push_back(host);    }    //初始化对象    mongo::SyncClusterConnection sync(servers);    while(1)    {        try        {            string errmsg;            if(!sync.prepare(errmsg)) //准备对mongodb的连接            {                cout << "prepare error: " << errmsg << endl;            }            errmsg = "";            if(!sync.fsync(errmsg)) //连接mongodb集群            {                cout << "fsync error: " << errmsg << endl;            }                        cout << sync.getServerAddress() << endl;            //mongo::BSONObjBuilder rule;            //Json::Value json_reply;            //生成查询规则            //rule.appendNumber("_id", 400000);            //mongo::Query query(rule.obj());            //auto_ptr<mongo::DBClientCursor> p_corsr;            //do            //{            //    //执行查询            //    p_corsr = sync.query("test.table1", query, 0, 0, NULL, 0, 0);            //}            //while(p_corsr->more()); //判断是否查询到数据            if(argc >= 2) //启动时提供参数则读取数据            {                mongo::BSONObjBuilder rule;                Json::Value json_reply;                //生成查询规则                rule.appendNumber("age", 25);                mongo::Query query(rule.obj());                auto_ptr<mongo::DBClientCursor> p_corsr;                cout << "query start:" << endl;                do                {                    //执行查询                    p_corsr = sync.query("test.test", query, 0, 0, NULL, 0, 0);                }                while(p_corsr->more()); //判断是否查询到数据                cout << "query over" << endl;            }            else            {                int _id = 0;                srand(time(NULL));                cout << "insert start:" << endl;                while(1)                {                    mongo::BSONObjBuilder rule;                    string name;                    for(int i = 0; i < 5; i++)                    {                        name += (char) ((rand() % 26)) + 97;                    }                    //生成查询规则                    rule.appendNumber("_id", _id++);                    rule.appendNumber("age", (rand() % 99) + 1);                    rule.append("name", name);                    auto_ptr<mongo::DBClientCursor> p_corsr;                    //执行插入数据                    sync.insert("test.test", rule.obj());                    sleep(1);                }                cout << "insert end" << endl;            }        }        catch(exception &e)        {            cout << "Error:"<< e.what() << endl;        }    }    return 0;;}


这个方法可以连接,但是存在如下问题:

  1. 连接后读取和插入会对第一个IP的mongo进行操作,这时宕掉其他两台的服务后,读取可以正常读取,写入在宕掉任何一台都会报错,但当其他两台在正常运行的状态下宕掉第个IP的服务后读取和写入操作都会报错,在重新启动服务后连接可以恢复正常。那么问题来了:如果这样要集群有个毛用?是我的操作不对,还是大家都会遇到这样的问题?


0 0
原创粉丝点击