使用C++连接MongoDB集群

1 篇文章 0 订阅
1 篇文章 0 订阅

项目中用到了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的服务后读取和写入操作都会报错,在重新启动服务后连接可以恢复正常。那么问题来了:如果这样要集群有个毛用?是我的操作不对,还是大家都会遇到这样的问题?


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值