工作中使用到了mongo,就自己研究了一下,总结了一下,会遇到的一些问题,有不对的地方还请各位牛人指导。
简单说一下
副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在
主节点挂掉了,整个集群内会自动切换
副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器
我们来看看mongoDB副本集的架构图:(注:此图是网上切下来的,比我画的好)
主服务器挂掉后的架构如下图:
如下是我的布署操作
我用的是VMware 11虚拟机
系统是CentOS-6.3-x86_64 系统
使用的数据库是 mongodb-linux-x86_64-2.0.4
用了三个虚拟系统
ip 192.168.216.128 192.168.216.129 192.168.216.130
用到的端品分别是 10001 10002 10003
192.168.216.128当副本集主节点 其它做为副本集副本节点
开始布署
1、 分别在每个系统中使用 su切换用户身份如下图:
2、切记一定要在每个系统中关闭系统防火墙,因为在后面配置副本集时,这三台系统会互相求请,如果未关防火墙,配置是通不过的,这也是我在配置时遇到的问题
命令: service iptables stop
如图:
3,把你下载的mongodb的安装程序包上传到每个系统然后解压
4. 分别在每个系统下创建副本集文件夹
如何该命令执行不了请检查权限
mkdir -p replSet/data
5.分别在每个系统上启动mongodb 并使用 ps -aux|grep mongod 命令查看是否启动
mongodb-linux-x86_64-2.0.4/bin/mongod --replSet application --dbpath replSet/data/ --port 10001 -logpath replSet/replSet.log -fork
mongodb-linux-x86_64-2.0.4/bin/mongod --replSet application --dbpath replSet/data/ --port 10002 --logpath replSet/replSet.log -fork
mongodb-linux-x86_64-2.0.4/bin/mongod --replSet application --dbpath replSet/data/ --port 10003 --logpath replSet/replSet.log -fork
如其中一个切图:
6.初始化副本集
在其中一个系统中登陆mongodb
命令 mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.128:10001
使用admin数据库
如下图:
定义副本集配置变量,这里的 _id:”application” 和上面命令参数“ –replSet application” 要保持
config ={_id:"application",members:[{_id:0,host:"192.168.216.128:10001"},{_id:1,host:"192.168.216.129:10002"},{_id:2,host:"192.168.216.130:10003"}]}
如图命令和输出
初始化副本配置
命令: rs.initiate(config);
输出结果:
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
如果输出如下:表示192.168.216.129:10002端口访问不到请检查该系统下10002端口的mongodb是否启动
rs.initiate(config);
{
"errmsg" : "couldn't initiate : need all members up to initiate, not ok : 192.168.216.129:10002",
"ok" : 0
}
查看集群节点的状态
命令:
rs.status();
输出结果如下图
此时整个副本集已经搭建成功
7.开始测试
在主节点上连接到数据库
命令:mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.128:10001
建立test 数据库。
命令: use test;
往testdb表插入数据。
命令: db.testdb.insert({"mongodb":"mongodbtest"})
在副本节点 192.168.216.129 192.168.216.130 上连接到mongodb查看数据是否复制过来。
如我在130上查看命令如下
mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.130:10003
进入后输入如下命令进入test数据库
use test
执行 db.testdb.find()查看表
报如下错:
error: { "$err" : "not master and slaveok=false", "code" : 13435 }
解决办法如下
输入 rs.slaveOk();
然后再执行如上查看表操作
#输出如下
{ "_id" : ObjectId("55bb3495ce19b28f7ea77e81"), "mongodb" : "mongodbtest" }
操作如下切图
8.测试副本集故障转移功能,也就是主节点挂掉后,副节点变为主节点
先停落主节点 128
我是直接kill 掉
在主节点系统上:
命令: ps -aux|grep mongod 查出mongodb启动的端口并杀掉
我查出的端口是 25305
命令 : kill -9 25305
如图
连接到其它两个系统进入mongodb数据库,会有其中一个变为主节点,辨认是否为主机点 如:出现primary表示为主节点
如下查看示范例子
查看整个集群的状态,可以看到128为状态不可达。
mongodb-linux-x86_64-2.0.4/bin/mongo 192.168.216.129:10002
rs.status();
输出如下
{
"set" : "application",
"date" : ISODate("2015-07-31T09:04:00Z"),
"myState" : 1,
"syncingTo" : "192.168.216.128:10001",
"members" : [
{
"_id" : 0,
"name" : "192.168.216.128:10001",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"t" : 1438332053000,
"i" : 1
},
"optimeDate" : ISODate("2015-07-31T08:40:53Z"),
"lastHeartbeat" : ISODate("2015-07-31T09:00:17Z"),
"pingMs" : 0,
"errmsg" : "socket exception"
},
{
"_id" : 1,
"name" : "192.168.216.129:10002",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"optime" : {
"t" : 1438332053000,
"i" : 1
},
"optimeDate" : ISODate("2015-07-31T08:40:53Z"),
"self" : true
},
{
"_id" : 2,
"name" : "192.168.216.130:10003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2044,
"optime" : {
"t" : 1438332053000,
"i" : 1
},
"optimeDate" : ISODate("2015-07-31T08:40:53Z"),
"lastHeartbeat" : ISODate("2015-07-31T09:03:59Z"),
"pingMs" : 0
}
],
"ok" : 1
}
再启动原主节点128 发现变为 SECONDARY
此不再录入代码自己可以试试
至此副本集搭建好了