1,在Ubuntu上安装MongoDB
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
2, 创建3个虚拟机,分别是wzq-mongo1, wzq-mongo2, wzq-mongo3.
其中三个虚拟机分别对应的IP如下
wzq-mongo1 - 》 192.168.0.60,
wzq-mongo2 -》 192.168.0.64,
wzq-mongo3 -》 192.168.0.69
3, 在每个虚拟机上,编辑mongodb.conf
sudo vim /etc/mongodb.conf
改变如下设置
replSet = rs0
bind_ip = 192.168.0.60
由于mongodb 3.0会通过主机名称启动,所以有时候需要修改hosts里面主机名对应的ip
将主机名对应的
127.0.1.1 wzq-mongo1
修改为
192.168.0.60 wzq-mongo1
然后重启mongodb
sudo service mongod restart
4, 在wzq-mongo1上启动mongodb
mongo 192.168.0.60
5, 初始化replication
mongo> rs.initiate()
6, 然后在这个新的rs上面添加成员,分别如下
rs0:PRIMARY> rs.add("192.168.0.60:27017")
rs0:PRIMARY> rs.add("192.168.0.64:27017")
rs0:PRIMARY> rs.add("192.168.0.69:27017")
7, 查看目前的状态
rs0:PRIMARY> rs.status()
会得到如下的结果
rs0:PRIMARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2015-03-23T14:47:56.002Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "192.168.0.60:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2303,
"optime" : Timestamp(1427121702, 1),
"optimeDate" : ISODate("2015-03-23T14:41:42Z"),
"electionTime" : Timestamp(1427121785, 1),
"electionDate" : ISODate("2015-03-23T14:43:05Z"),
"configVersion" : 89294,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.0.69:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 290,
"optime" : Timestamp(1427121702, 1),
"optimeDate" : ISODate("2015-03-23T14:41:42Z"),
"lastHeartbeat" : ISODate("2015-03-23T14:47:54.312Z"),
"lastHeartbeatRecv" : ISODate("2015-03-23T14:47:54.059Z"),
"pingMs" : 811,
"configVersion" : 89294
},
{
"_id" : 2,
"name" : "192.168.0.64:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 290,
"optime" : Timestamp(1427121702, 1),
"optimeDate" : ISODate("2015-03-23T14:41:42Z"),
"lastHeartbeat" : ISODate("2015-03-23T14:47:55.770Z"),
"lastHeartbeatRecv" : ISODate("2015-03-23T14:47:55.810Z"),
"pingMs" : 992,
"configVersion" : 89294
}
],
"ok" : 1
}
rs0:PRIMARY> db.test.insert({name:"wang",code:"w"})
这样就可以在另外两个虚拟机上查看新添加的结果
恭喜你,
在这个过程中,有可能出现如下的问题
问题一
Failed global initialization: BadValue Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly.解决办法
$ export LC_ALL=C
Error: error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
解决办法
rs.slaveOk()
问题三
一个结点一直是RECOVERING的状态
一般的解决办法是
1,从主结点上,把这个SECONDARY结点删除
rs.remove("192.168.0.64:27017")
2,关闭这个mongodb
3, 删除这个secondary结点上面的数据文件
删除/var/lib/mongodb 下面的所有的文件
4,重启这个secondary结点
5,在主结点上添加这个secondary结点
rs0:PRIMARY> rs.add("192.168.0.64:27017")
问题四, 修改replica set的配置
如果在配置文件里面修改了配置,但是在启动replica set的时候,还是使用旧的配置,
那就可以通过如下的语句在mongo里面强制使用新的配置
conf = rs.conf()
cfg.members[0].host="192.168.0.64:27018"
cfg.members[1].host="192.168.0.69:27018"
cfg.members[2].host="192.168.0.60:27018"
rs.reconfig(cfg,{force:true})