mongodb简单主从复制和主从自动切换

为了节省资源,我这里在同一台电脑的不同目录来进行主从复制,这里至少需要建立一台主服务器,两台从服务器,这样在主服务器故障的时候,从服务器才能自动选举新的主服务器完成主从切换,如果只有一台主服务器和一台从服务器是无法实现主从切换的

1主数据库目录:D:\data,我在下面添加了log(日志)目录,还有db(数据库)目录,然后添加了配置文件.cfg文件

配置文件内容mongod.cfg,使用27018端口,然后分别设置了日志文件和数据文件的存放目录

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: D:\data\db
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  D:\data\log\mongod.log

# network interfaces
net:
  port: 27018
  bindIp: 127.0.0.1


#processManagement:

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

2从数据库目录:D:\data1和D:\data2,我在下面添加了log(日志)目录,还有db(数据库)目录,然后添加了配置文件.cfg文件

两台从服务器配置文件内容mongod.cfg,分别使用27019和27020端口,然后分别设置了日志文件和数据文件的存放目录

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: D:\data1\db
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  D:\data1\log\mongod.log

# network interfaces
net:
  port: 27019
  bindIp: 127.0.0.1


#processManagement:

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: D:\data2\db
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  D:\data2\log\mongod.log

# network interfaces
net:
  port: 27020
  bindIp: 127.0.0.1


#processManagement:

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

3主数据库启动并且注册服务

mongod --confg  "D:\data\mongod.cfg"   --replSet rs0 --install

4从数据库启动并且注册服务

mongod --confg  "D:\data1\mongod.cfg"   --replSet rs0 --serviceName mongodb1 --serviceDisplayName mongodb1 --install

mongod --confg  "D:\data1\mongod.cfg"   --replSet rs0 --serviceName mongodb2 --serviceDisplayName mongodb2 --install

(注意)主数据库默认启动的服务名是mongodb,由于我是在同一台电脑上面建服务,所以从数据库的服务名要与主数据库服务名区分开来,这里从数据库的服务名是mongodb1和mongodb2

5登录数据库

在cmd命令窗口登录到其中一台数据库服务器,这里登录到27018端口的这台服务器

C:\Users\Administrator>mongo --port 27018

然后初始化,添加3台数据服务器成员

> rs.initiate({_id:"rs0",members:[{_id:0,host:"127.0.0.1:27018"},{_
id:1,host:"127.0.0.1:27019"},{_id:2,host:"127.0.0.1:27020"}]})

查看状态,这里关注里面的"stateStr"这个状态,决定着对应服务器成员是主状态还是从状态,这里可以看出当前端口27019这台数据库服务器是主服务器,其余两台都是从服务器

rs0:SECONDARY> rs.status()
{
        "set" : "rs0",
        "date" : ISODate("2019-01-15T03:09:20.366Z"),
        "myState" : 2,
        "term" : NumberLong(1),
        "syncingTo" : "127.0.0.1:27019",
        "syncSourceHost" : "127.0.0.1:27019",
        "syncSourceId" : 1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1547521744, 1),
                        "t" : NumberLong(1)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1547521744, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1547521744, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1547521744, 1),
                        "t" : NumberLong(1)
                }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1547521730, 

1),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "127.0.0.1:27018",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 282,
                        "optime" : {
                                "ts" : Timestamp(1547521744, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2019-01-

15T03:09:04Z"),
                        "syncingTo" : "127.0.0.1:27019",
                        "syncSourceHost" : "127.0.0.1:27019",
                        "syncSourceId" : 1,
                        "infoMessage" : "",
                        "configVersion" : 1,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 1,
                        "name" : "127.0.0.1:27019",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 29,
                        "optime" : {
                                "ts" : Timestamp(1547521744, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1547521744, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2019-01-

15T03:09:04Z"),
                        "optimeDurableDate" : ISODate("2019-01-

15T03:09:04Z"),
                        "lastHeartbeat" : ISODate("2019-01-

15T03:09:18.656Z"),
                        "lastHeartbeatRecv" : ISODate("2019-01-

15T03:09:19.856Z"
),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "",
                        "electionTime" : Timestamp(1547521741, 

1),
                        "electionDate" : ISODate("2019-01-

15T03:09:01Z"),
                        "configVersion" : 1
                },
                {
                        "_id" : 2,
                        "name" : "127.0.0.1:27020",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 29,
                        "optime" : {
                                "ts" : Timestamp(1547521744, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1547521744, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2019-01-

15T03:09:04Z"),
                        "optimeDurableDate" : ISODate("2019-01-

15T03:09:04Z"),
                        "lastHeartbeat" : ISODate("2019-01-

15T03:09:18.650Z"),
                        "lastHeartbeatRecv" : ISODate("2019-01-

15T03:09:18.632Z"
),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "127.0.0.1:27019",
                        "syncSourceHost" : "127.0.0.1:27019",
                        "syncSourceId" : 1,
                        "infoMessage" : "",
                        "configVersion" : 1
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1547521744, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1547521744, 1),
                "signature" : {
                        "hash" : BinData

(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

6插入数据测试同步

登录并在端口为27019(主服务器)的数据库服务器中插入一条数据

rs0:PRIMARY> db.test.insert({name:"xie",age:25})

然后分别在另外两台从服务器(端口为27018和27020)中查看同步情况。下面以27018端口这台从服务器为例

首先将从数据库服务器设置为可读

rs0:SECONDARY> rs.slaveOk()

然后读取刚才主服务器插入的数据

rs0:SECONDARY> db.test.find()
{ "_id" : ObjectId("5c3d4f86169f1cfe5a17276d"), "name" : "xie", "age" : 25 }

可以看到已经同步过去

7测试主服务器故障,从从服务器自动选举主数据库服务器

cmd窗口下输入net stop mongodb1命令关闭端口为27019(主服务器)的数据库服务器的服务

查看其余两台从数据库服务器状态,可以看到端口为27020的从服务器被自动选举成新的主服务器

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值