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