您的位置:首页 > 数据库 > Mongodb

mongoDB3.4主从复制实现(第一种情况亲测)

2017-11-24 16:19 267 查看

第一种:

    开启两个mongodb进程,模拟两台机器;
    一个为master主服务器,另一个为slave从服务器;
    主服务器down机后,从服务器不会成为主服务器。

[python]
view plain
copy

#在当前目录下创建mongodb的数据文件  
zheng@zheng:~$ cd ./mongodbTest/  
mkdir ./t1/db  
mkdir ./t2/db  
mkdir ./t1/log  
mkdir ./t2/log  
touch ./t1/log/mongodb.log  
touch ./t2/log/mongodb.log  
  
zheng@zheng:~/mongodbTest$ tree  
.  
├── t1  
│   ├── db  
│   └── log  
│       └── mongodb.log  
└── t2  
    ├── db  
    └── log  
        └── mongodb.log  
  
#设置主服务器,并启动服务  
mongod --dbpath ./t1/db --logpath ./t1/log/mongodb.log  --port 50001 --logappend --fork --master  
  
#设置从服务器,并启动服务。--source ip:port,设置其主服务器  
mongod --dbpath ./t2/db --logpath ./t2/log/mongodb.log  --port 50002 --logappend --fork --slave --source 127.0.0.1:50001  
  
#进入主数据库  
mongo --port 50001  
  
#在主数据库插入数据  
> use stu  
switched to db stu  
> for(i=1;i<1000;i++){  
    db.s.insert({name:'hi'+1}  
)}  
WriteResult({ "nInserted" : 1 })  
> db.s.find().count()  
999  
  
#进入从数据库  
mongo --port 50002  
  
#在从数据库查询  
> show dbs  
2017-09-14T16:54:56.790+0800 E QUERY    [main] Error: listDatabases failed:{  
    "ok" : 0,  
    "errmsg" : "not master and slaveOk=false",  
    "code" : 13435,  
    "codeName" : "NotMasterNoSlaveOk"  
} :  
#从数据库无法查看数据库,使用rs.slaveOk()  
> rs.slaveOk()  
> show dbs  
admin  0.000GB  
local  0.000GB  
stu    0.000GB  
> use stu  
switched to db stu  
> show collections  
s  
> db.s.find().count()  
999  
#从数据库无法插入数据  
> db.stu.insert({name:'hello'})  
WriteResult({ "writeError" : { "code" : 10107, "errmsg" : "not master" } })  

第二种:副本集

    主服务器down机后,从服务器自动切换。

[python]
view plain
copy

#在当前目录下创建mongodb的数据文件  
zheng@zheng:~$ cd ./mongodbTest/  
zheng@zheng:~/mongodbTest$ tree  
.  
├── t1  
│   ├── db  
│   └── log  
│       └── mongodb.log  
├── t2  
│   ├── db  
│   └── log  
│       └── mongodb.log  
└── t3  
    ├── db  
    └── log  
        └── mongodb.log  
  
#启动三个mongodb进程,--replSet name:设置三个mongodb在同一个副本下  
mongod --bind_ip 192.168.14.12 --port 50001 --dbpath ./t1/db --logpath ./t1/log/mongodb.log --logappend --fork --replSet zheng  
mongod --bind_ip 192.168.14.12 --port 50002 --dbpath ./t2/db --logpath ./t2/log/mongodb.log --logappend --fork --replSet zheng  
mongod --bind_ip 192.168.14.12 --port 50003 --dbpath ./t3/db --logpath ./t3/log/mongodb.log --logappend --fork --replSet zheng  
  
#连接主服务器,此处设置192.168.14.12:50001为主服务器  
mongo --host 192.168.14.12 --port 50001  
  
#初始化,哪个服务器先初始化就是主服务器  
rs.initiate()  
  
#初始化后,提示符变为zheng:SECONDARY>   
> rs.initiate()  
{  
    "info2" : "no configuration specified. Using a default configuration for the set",  
    "me" : "zheng:50001",  
    "ok" : 1  
}  
zheng:SECONDARY>   
  
#查看当前状态  
rs.status()  



[python]
view plain
copy

#提示符变为  
zheng:PRIMARY>  
  
#添加副本集  
rs.add('192.168.14.12:50002')  
rs.add('192.168.14.12:50003')  

[python]
view plain
copy

#副本集添加成功后,当前状态如图  





[python]
view plain
copy

#向主服务器中插入数据  
zheng:PRIMARY> db  
test  
zheng:PRIMARY> for(i=0;i<=10;i++){db.t.insert({name:'name'+i})}  
WriteResult({ "nInserted" : 1 })  
zheng:PRIMARY> db.t.find().count()  
11  
  
  
#启动从服务器  
mongo --host 192.168.14.12 --port 50002  
mongo --host 192.168.14.12 --port 50003  
  
#查看数据  
zheng:SECONDARY> rs.slaveOk()  
zheng:SECONDARY> db.t.find()  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e89"), "name" : "name0" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e8a"), "name" : "name1" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e8b"), "name" : "name2" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e8d"), "name" : "name4" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e8c"), "name" : "name3" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e8e"), "name" : "name5" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e8f"), "name" : "name6" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e90"), "name" : "name7" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e91"), "name" : "name8" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e92"), "name" : "name9" }  
{ "_id" : ObjectId("59ba7f2060170e82e7b65e93"), "name" : "name10"}  
  
#删除从服务器  
rs.remove('192.168.14.12:50002')  

#注意

关闭主服务器后,再重新启动,会发现原来的从服务器变为了从服务器,新启动的服务器(原来的从服务器)变为了从服务器

第三种:

可设置优先级,优先级最高的就先为主服务器;
主服务器down机后,优先级高的为新的主服务器。

[python]
view plain
copy

#启动三个mongodb进程,--replSet name:设置三个mongodb在同一个副本下  
和上面一样......  
  
#启动mongo服务器  
mongo --host 192.168.14.12 --port 50001  
  
#设置主从服务器  
use admin  
db.runCommand({"replSetInitiate":{"_id":"zheng","members":[{"_id":1,"host":"192.168.14.12:50001","priority":3},{"_id":2,"host":"192.168.14.12:50002","priority":2},{"_id":3,"host":"192.168.14.12:50003","priority":1}]}})  
  
#查看当前状态  
zheng:OTHER> rs.status()  
{  
    "set" : "zheng",  
    "date" : ISODate("2017-09-14T13:43:58.663Z"),  
    "myState" : 1,  
    "term" : NumberLong(1),  
    "heartbeatIntervalMillis" : NumberLong(2000),  
    "optimes" : {  
        "lastCommittedOpTime" : {  
            "ts" : Timestamp(1505396636, 2),  
            "t" : NumberLong(1)  
        },  
        "appliedOpTime" : {  
            "ts" : Timestamp(1505396636, 2),  
            "t" : NumberLong(1)  
        },  
        "durableOpTime" : {  
            "ts" : Timestamp(1505396636, 2),  
            "t" : NumberLong(1)  
        }  
    },  
    "members" : [  
        {  
            "_id" : 1,  
            "name" : "192.168.14.12:50001",  
            "health" : 1,  
            "state" : 1,  
            "stateStr" : "PRIMARY",  
            "uptime" : 347,  
            "optime" : {  
                "ts" : Timestamp(1505396636, 2),  
                "t" : NumberLong(1)  
            },  
            "optimeDate" : ISODate("2017-09-14T13:43:56Z"),  
            "infoMessage" : "could not find member to sync from",  
            "electionTime" : Timestamp(1505396636, 1),  
            "electionDate" : ISODate("2017-09-14T13:43:56Z"),  
            "configVersion" : 1,  
            "self" : true  
        },  
        {  
            "_id" : 2,  
            "name" : "192.168.14.12:50002",  
            "health" : 1,  
            "state" : 2,  
            "stateStr" : "SECONDARY",  
            "uptime" : 12,  
            "optime" : {  
                "ts" : Timestamp(1505396636, 2),  
                "t" : NumberLong(1)  
            },  
            "optimeDurable" : {  
                "ts" : Timestamp(1505396636, 2),  
                "t" : NumberLong(1)  
            },  
            "optimeDate" : ISODate("2017-09-14T13:43:56Z"),  
            "optimeDurableDate" : ISODate("2017-09-14T13:43:56Z"),  
            "lastHeartbeat" : ISODate("2017-09-14T13:43:58.317Z"),  
            "lastHeartbeatRecv" : ISODate("2017-09-14T13:43:58.153Z"),  
            "pingMs" : NumberLong(0),  
            "syncingTo" : "192.168.14.12:50001",  
            "configVersion" : 1  
        },  
        {  
            "_id" : 3,  
            "name" : "192.168.14.12:50003",  
            "health" : 1,  
            "state" : 2,  
            "stateStr" : "SECONDARY",  
            "uptime" : 12,  
            "optime" : {  
                "ts" : Timestamp(1505396636, 2),  
                "t" : NumberLong(1)  
            },  
            "optimeDurable" : {  
                "ts" : Timestamp(1505396636, 2),  
                "t" : NumberLong(1)  
            },  
            "optimeDate" : ISODate("2017-09-14T13:43:56Z"),  
            "optimeDurableDate" : ISODate("2017-09-14T13:43:56Z"),  
            "lastHeartbeat" : ISODate("2017-09-14T13:43:58.317Z"),  
            "lastHeartbeatRecv" : ISODate("2017-09-14T13:43:58.152Z"),  
            "pingMs" : NumberLong(0),  
            "syncingTo" : "192.168.14.12:50001",  
            "configVersion" : 1  
        }  
    ],  
    "ok" : 1  


来源:http://blog.csdn.net/zheng_lan_fang/article/details/77986007
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: