MongoDB + Nodejs + Mongoose 双机热备

双机热备:
我们模拟最简单的:三台服务器,一台主、一台副、一台仲裁。
主机宕了,仲裁机会发心跳请求,然后切到副机,等主机起了仲裁回自动把新增的数据备份到主机上。

本机模拟:
在 /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
MongoDB + Nodejs + Mongoose 双机热备_第1张图片
贴张windows下的图片,比较直观

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 此文作者。

你可能感兴趣的:(MongoDB + Nodejs + Mongoose 双机热备)