MongoDB 主从自动切换,读写分离

1    设置主从库
    

[root@dghost mongodb]# mongod --dbpath /data/mongodb --replSet set1 --fork --syslog --keyFile /etc/monkey 
about to fork child process, waiting until server is ready for connections.
forked process: 2099
child process started successfully, parent exiting

主库启动完成

> rs.isMaster()
{
	"ismaster" : false,
	"secondary" : false,
	"info" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)",
	"isreplicaset" : true,
	"maxBsonObjectSize" : 16777216,
	"maxMessageSizeBytes" : 48000000,
	"maxWriteBatchSize" : 1000,
	"localTime" : ISODate("2017-04-18T14:23:59.298Z"),
	"maxWireVersion" : 2,
	"minWireVersion" : 0,
	

当前它既不是主又不是从,下面需要告诉它的身份

> config_set={_id:"set1",members:[{_id:0,host:"192.168.0.116:27017"}]}
{
	"_id" : "set1",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.0.116:27017"
		}
	]
}

# 设置一个参数这个参数名称可以自定义,但那时里面的set1 就是启动命令中的set1
> rs.initiate(config_set)
{
	"info" : "Config now saved locally.  Should come online in about a minute.",
	"ok" : 1
}
# 把这个参数设置到主库中
[root@dghost mongodb]# mongo
MongoDB shell version: 2.6.4
connecting to: test
set1:PRIMARY> 
# 重新登陆就看到身份已经是primary 主库了
set1:PRIMARY> rs.isMaster()
{
	"setName" : "set1",
	"setVersion" : 1,
	"ismaster" : true,
	"secondary" : false,
	"hosts" : [
		"192.168.0.116:27017"
	],
	"primary" : "192.168.0.116:27017",
	"me" : "192.168.0.116:27017",
	"maxBsonObjectSize" : 16777216,
	"maxMessageSizeBytes" : 48000000,
	"maxWriteBatchSize" : 1000,
	"localTime" : ISODate("2017-04-18T14:31:46.425Z"),
	"maxWireVersion" : 2,
	"minWireVersion" : 0,
	"ok" : 1
}
[root@dgstandby ~]# mongod --dbpath /data/mongodb --replSet set1 --fork --syslog --keyFile /etc/monkey
about to fork child process, waiting until server is ready for connections.
forked process: 2104
child process started successfully, parent exiting
# 和主库启动方式一样启动从库1
[root@other ~]#  mongod --dbpath /data/mongodb --replSet set1 --fork --syslog --keyFile /etc/monkey
about to fork child process, waiting until server is ready for connections.
forked process: 2058
child process started successfully, parent exiting
# 和主库启动方式一样启动从库2

在主库中添加从库1和2

set1:PRIMARY> rs.add("192.168.0.117:27017")
{ "ok" : 1 }
set1:PRIMARY> rs.add("192.168.0.118:27017")
{ "ok" : 1 }
# 添加两个从库成功
set1:PRIMARY> rs.isMaster()
{
	"setName" : "set1",
	"setVersion" : 3,
	"ismaster" : true,
	"secondary" : false,
	"hosts" : [
		"192.168.0.116:27017",
		"192.168.0.118:27017",
		"192.168.0.117:27017"
	],
	"primary" : "192.168.0.116:27017",
	"me" : "192.168.0.116:27017",
	"maxBsonObjectSize" : 16777216,
	"maxMessageSizeBytes" : 48000000,
	"maxWriteBatchSize" : 1000,
	"localTime" : ISODate("2017-04-18T14:36:03.525Z"),
	"maxWireVersion" : 2,
	"minWireVersion" : 0,
	"ok" : 1
}
# 现在主库上已经知道谁是主库,谁是从库
[root@dgstandby ~]# mongo
MongoDB shell version: 2.6.4
connecting to: test
set1:SECONDARY> 
# 从库1 也知道自己从库
[root@other ~]# mongo
MongoDB shell version: 2.6.4
connecting to: test
set1:SECONDARY> 
# 从库2 也知道自己从库

2    验证主从是否同步

set1:PRIMARY> show dbs
admin  (empty)
local  1.078GB
set1:PRIMARY> use www
switched to db www
set1:PRIMARY> db.scott.insert({name:"scott"})
WriteResult({ "nInserted" : 1 })
set1:PRIMARY> show dbs
admin  (empty)
local  1.078GB
www    0.078GB
set1:PRIMARY> use www
switched to db www
set1:PRIMARY> db.scott.find()
{ "_id" : ObjectId("58f6251804dade85b64c28d9"), "name" : "scott" }
# 主库中建库,建表,插入数据
set1:SECONDARY> show collections;
2017-04-18T23:02:17.806+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131
# 从库1 把www已经同步成功了,但是不能访问,这个是正常的。
set1:SECONDARY> show collections;
2017-04-18T23:04:27.430+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131
# 从库2 把www已经同步成功了,但是不能访问,这个是正常的。

3    验证主从自动切换

把主库shutdown 看看两个从库会怎么样

set1:PRIMARY> db.shutdownServer()
2017-04-18T22:46:23.544+0800 DBClientCursor::init call() failed
server should be down...
2017-04-18T22:46:23.566+0800 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2017-04-18T22:46:23.571+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2017-04-18T22:46:23.574+0800 reconnect 127.0.0.1:27017 (127.0.0.1) failed failed couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed
2017-04-18T22:46:23.580+0800 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2017-04-18T22:46:23.582+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2017-04-18T22:46:23.582+0800 reconnect 127.0.0.1:27017 (127.0.0.1) failed failed couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed
> exit
bye
[root@dghost mongodb]# /etc/init.d/mongod status
mongod dead but subsys locked
# 主库已经关闭
[root@other ~]# mongo
MongoDB shell version: 2.6.4
connecting to: test
set1:PRIMARY>
# 看从库2 已经自动变成了primary主库
set1:PRIMARY> rs.isMaster()
{
	"setName" : "set1",
	"setVersion" : 3,
	"ismaster" : true,
	"secondary" : false,
	"hosts" : [
		"192.168.0.118:27017",
		"192.168.0.117:27017",
		"192.168.0.116:27017"
	],
	"primary" : "192.168.0.118:27017",
	"me" : "192.168.0.118:27017",
	"maxBsonObjectSize" : 16777216,
	"maxMessageSizeBytes" : 48000000,
	"maxWriteBatchSize" : 1000,
	"localTime" : ISODate("2017-04-18T15:07:36.060Z"),
	"maxWireVersion" : 2,
	"minWireVersion" : 0,
	"ok" : 1
}
# 瞧,主从的顺序都变了 主库已经从原来的192.168.0.116 变成现在的192.168.0.118

验证成功

4    设置读写分离

在从库上敲命令rs.slaveOk() 就可以了,非常简单

set1:SECONDARY> rs.slaveOk()
set1:SECONDARY> use www
switched to db www
set1:SECONDARY> show collections;
scott
system.indexes

5   删除节点rs.remove("IP:PORT")

转载于:https://my.oschina.net/wangzilong/blog/882398

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值