mongoDB3.4主从复制实现

第一种:

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

#在当前目录下创建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机后,从服务器自动切换。

#在当前目录下创建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()

#提示符变为
zheng:PRIMARY>

#添加副本集
rs.add('192.168.14.12:50002')
rs.add('192.168.14.12:50003')

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


#向主服务器中插入数据
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机后,优先级高的为新的主服务器。


#启动三个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
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值