双机热备:
我们模拟最简单的:三台服务器,一台主、一台副、一台仲裁。
主机宕了,仲裁机会发心跳请求,然后切到副机,等主机起了仲裁回自动把新增的数据备份到主机上。
本机模拟:
在 /ust/local/mongo目录下新建三个文件夹,
1、新建目录
$ cd /ust/local/mongo
$ sudo mkdir -m 777 -R 1 2 3
$ ls
# 1 2 3,用这三个文件夹模拟三台服务器
# 每个文件夹中新建:
bin data/db mongodb.conf
# bin :存放mongodb的所有文件
# data/db :mongodb数据的存储位置。
# mongodb.conf
2、配置 mongodb.conf
###############################
1:主机,端口:27001
2:副机,端口:27002
3:仲裁机,端口:27003
## 1 中 mongodb.conf:
dbpath=/usr/local/mongo/1/data/db
port=27001
replSet=datamip/127.0.0.1:27002 #指向备机
## 2 中 mongodb.conf:
dbpath=/usr/local/mongo/2/data/db
port=27002
replSet=datamip/127.0.0.1:27001 #指向主机
## 3 中 mongodb.conf:
dbpath=/usr/local/mongo/3/data/db
port=27003
replSet=datamip/127.0.0.1:27001 #指向主机
3、 分别开启三台机器
## 开启 主机
$ cd /usr/local/mongo/1/bin
$ ./mongod --config /usr/local/mongo/1/mongodb.conf
## 开启 备机
$ cd /usr/local/mongo/2/bin
$ ./mongod --config /usr/local/mongo/2/mongodb.conf
## 开启 仲裁机
$ cd /usr/local/mongo/3/bin
$ ./mongod --config /usr/local/mongo/3/mongodb.conf
4、 配置主从关系
# 1、 连接到主机并设置 repleSet
$ cd /usr/local/mongo/1/bin
$ ./mongo 127.0.0.1/admin
# MongoDB shell version v3.4.2
# connecting to: mongodb://127.0.0.1:27001/admin
//设置 replSet
db.runCommand({
... "replSetInitiate":{
... "_id":"datamip", //此 replSet 的名字
... "members":[ //此 replSet 的主备成员,不包含仲裁机
... {
... "_id":1,"host":"127.0.0.1:27001"
... },
... {
... "_id":2,"host":"127.0.0.1:27002"
... }
... ]}})
{ "ok" : 1 }
## 注意此时的命令行头已改变:datamip:SECONDARY>
# 2、添加仲裁机
datamip:SECONDARY> rs.addArb("127.0.0.1:27003")
{ "ok" : 1 }
## 此时主机变为PRIMARY,主机。
datamip:PRIMARY> rs.status()
#{
"set" : "datamip", //replSet的名字
"date" : ISODate("2017-03-15T14:18:50.112Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1489587520, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1489587520, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1489587520, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 1,
"name" : "127.0.0.1:27001",
"health" : 1, //健康状态,服务是否在运行,若宕了,值为0
"state" : 1,
"stateStr" : "PRIMARY", ## 状态码:主机
"uptime" : 771,
"optime" : {
"ts" : Timestamp(1489587520, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-03-15T14:18:40Z"),
"electionTime" : Timestamp(1489587380, 1),
"electionDate" : ISODate("2017-03-15T14:16:20Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 2,
"name" : "127.0.0.1:27002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", ## 状态码:备机
"uptime" : 160,
"optime" : {
"ts" : Timestamp(1489587520, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1489587520, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-03-15T14:18:40Z"),
"optimeDurableDate" : ISODate("2017-03-15T14:18:40Z"),
"lastHeartbeat" : ISODate("2017-03-15T14:18:49.918Z"),
"lastHeartbeatRecv" : ISODate("2017-03-15T14:18:49.917Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "127.0.0.1:27001",
"configVersion" : 2
},
{
"_id" : 3,
"name" : "127.0.0.1:27003",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER", ##状态码:仲裁机
"uptime" : 44,
"lastHeartbeat" : ISODate("2017-03-15T14:18:49.938Z"),
"lastHeartbeatRecv" : ISODate("2017-03-15T14:18:45.977Z"),
"pingMs" : NumberLong(0),
"configVersion" : 2
}
],
"ok" : 1
}
5、Nodejs + mongoose 驱动
var mongoose = require('mongoose');
mongoose.connect(
// 此处配置你的多台mongoDB服务器
"mongodb://localhost:27001/mongoswarm,localhost:27002/mongoswarm",
//此处配置mongodb连接的一些细节
{
replset: { rs_name: 'datamip' } //刚才配置的replSet的名称
// mongos : true
},
function (err,data) {
if(err)
return console.log('链接失败');
return console.log('链接成功');
});
到此MongoDB双机热备replSet已完成。
可以测试一下:
默认主机、备机、仲裁机 都开着,程序默认连 主机 。
向数据库中存一条数据, 主机、备机 会同时存入。
此时关掉 主机,然后查询该记录,仍能得到数据。
现在继续向数据库中插入数据,因为 主机 是关闭的,所以数据存到 备机 中。
然后重新开启 主机,并关闭 备机,查询数据,仍能得到我们新插入的第二条数据,这说明 仲裁机 会自动把新数据在 主机 重启以后从 备机 导入进去。
最后感谢:http://blog.csdn.net/xyw591238/article/details/51749739 此文作者。