Mongo 4.2.8 复制集搭建

环境

因资源有限,故本实验是在同一台机器上创建不同实例来完成

master:192.168.65.130  port:27018

secondary:192.168.65.130  port:27019

arbiter:192.168.65.130  port:27020

 

多实例安装

方法与单实例基本相同,参考 https://blog.csdn.net/qq_31144297/article/details/107012909

配置文件

dbpath=/mongodb/27018/data
logpath=/mongodb/27018/logs/mongodb.log
port=27018
fork=true
#auth=true
#noauth=true
#verbose=true
#vvvv=true
journal=true
maxConns=500
logappend=true
directoryperdb=true
pidfilepath=/tmp/mongo_27018.pid
#cpu=true
#nohttpinterface=false
#notablescan=false
#profile=0
#slowms=200
#quiet=true
#syncdelay=60
replSet=ty
bind_ip=127.0.0.1,192.168.65.130


ps:replSet 为复制集名称,所有实例的该值一定要相同

将其中的文件路径和端口相关的值修改为对应的实例即可。

启动实例

mongod --config /mongodb/27018/logs/mongodb.log

mongod --config /mongodb/27019/logs/mongodb.log

mongod --config /mongodb/27020/logs/mongodb.log

初始化主节点

rs.initiate({_id:'ty',members:[{_id:1,host:'192.168.65.130:27018'}]})

添加节点及仲裁节点

rs.add("192.168.65.130:27019")

rs.addArb("192.168.65.130:27020")

PS:或者以上2可以合成一步,如下:

 mongo -port 27018
> cfg={ _id:"rss", members:[ {_id:0,host:'192.168.65.130:27018',priority:2}, {_id:1,host:'192.168.65.130:27019',priority:1}, {_id:2,host:'192.168.65.130:27020',arbiterOnly:true}] };
初始化:> rs.initiate(cfg)

查看配置

rs.conf()

检查各个节点local库信息

复制集工作原理:

复制集通过local库下的oplog.rs集合进行数据同步。

oplog会包含所有对数据有修改的操作(查询操作不会记录)

mongo 192.168.65.130:27019

use local

show collections



mongo 192.168.65.130:27020

use local

show collections

检查复制集状态

rs.status()

数据验证

主库添加数据

[mongodb@ty1 ~]$ mongo --port 27018
ty:PRIMARY> db.ty.insert({age:100})
WriteResult({ "nInserted" : 1 })
ty:PRIMARY> db.ty.find()
{ "_id" : ObjectId("5ef9a99662e0d2208ccde0cc"), "ty" : 11 }
{ "_id" : ObjectId("5efa8adc3b55e73f44c6539e"), "age" : 100 }

从库查询

[mongodb@ty1 ~]$ mongo --port 27019

ty:SECONDARY> db.ty.find()
Error: error: {
    "operationTime" : Timestamp(1593477663, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1593477663, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}
如果出现上面的提示:not master and slaveOkfalse

则执行 db.getMongo().setSlaveOk()

然后在查询

ty:SECONDARY> db.ty.find()
{ "_id" : ObjectId("5ef9a99662e0d2208ccde0cc"), "ty" : 11 }
{ "_id" : ObjectId("5efa8adc3b55e73f44c6539e"), "age" : 100 }

故障转移

1.记录故障转移之前的状态

"members" : [
		{
			"_id" : 1,
			"name" : "192.168.65.130:27018",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 58483,
			"optime" : {
				"ts" : Timestamp(1593478263, 1),
				"t" : NumberLong(2)
			},
			"optimeDate" : ISODate("2020-06-30T00:51:03Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1593419794, 1),
			"electionDate" : ISODate("2020-06-29T08:36:34Z"),
			"configVersion" : 3,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 2,
			"name" : "192.168.65.130:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 58377,
			"optime" : {
				"ts" : Timestamp(1593478263, 1),
				"t" : NumberLong(2)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1593478263, 1),
				"t" : NumberLong(2)
			},
			"optimeDate" : ISODate("2020-06-30T00:51:03Z"),
			"optimeDurableDate" : ISODate("2020-06-30T00:51:03Z"),
			"lastHeartbeat" : ISODate("2020-06-30T00:51:11.969Z"),
			"lastHeartbeatRecv" : ISODate("2020-06-30T00:51:11.969Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "192.168.65.130:27018",
			"syncSourceHost" : "192.168.65.130:27018",
			"syncSourceId" : 1,
			"infoMessage" : "",
			"configVersion" : 3
		},
		{
			"_id" : 3,
			"name" : "192.168.65.130:27020",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 58370,
			"lastHeartbeat" : ISODate("2020-06-30T00:51:12.334Z"),
			"lastHeartbeatRecv" : ISODate("2020-06-30T00:51:12.055Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 3
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1593478263, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1593478263, 1)
}

2.手动停止27018(主服务)

ty:PRIMARY> use admin
switched to db admin
ty:PRIMARY> db.shutdownServer()
[mongodb@ty1 ~]$ ps -ef|grep mongo
mongodb   12563      1  1 Jun29 ?        00:11:02 mongod --config /mongodb/27019/mongodb_27019.conf
mongodb   12605      1  0 Jun29 ?        00:07:27 mongod --config /mongodb/27020/mongodb_27020.conf
mongodb   22114  12839  0 08:42 pts/2    00:00:00 mongo --port 27019

 3.连入其他节点

[mongodb@ty1 ~]$ mongo --port 27019

ty:PRIMARY> 

当连入27019 对应的实例时,提示符已经显示的是 Primary 。

4.检查复制集状态

"members" : [
		{
			"_id" : 1,
			"name" : "192.168.65.130:27018",
			"health" : 0,
			"state" : 8,
			"stateStr" : "(not reachable/healthy)",
			"uptime" : 0,
			"optime" : {
				"ts" : Timestamp(0, 0),
				"t" : NumberLong(-1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(0, 0),
				"t" : NumberLong(-1)
			},
			"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
			"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
			"lastHeartbeat" : ISODate("2020-06-30T00:56:30.323Z"),
			"lastHeartbeatRecv" : ISODate("2020-06-30T00:53:02.027Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "Error connecting to 192.168.65.130:27018 :: caused by :: Connection refused",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : -1
		},
		{
			"_id" : 2,
			"name" : "192.168.65.130:27019",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 58787,
			"optime" : {
				"ts" : Timestamp(1593478582, 1),
				"t" : NumberLong(3)
			},
			"optimeDate" : ISODate("2020-06-30T00:56:22Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1593478382, 1),
			"electionDate" : ISODate("2020-06-30T00:53:02Z"),
			"configVersion" : 3,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 3,
			"name" : "192.168.65.130:27020",
			"health" : 1,
			"state" : 7,
			"stateStr" : "ARBITER",
			"uptime" : 58688,
			"lastHeartbeat" : ISODate("2020-06-30T00:56:30.229Z"),
			"lastHeartbeatRecv" : ISODate("2020-06-30T00:56:30.208Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 3
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1593478582, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1593478582, 1)
}

可以看到状态信息中stateStr栏位,主节点的从 primary 变成了 (not reachable/healthy) , SECONDARY 节点从 SECONDARY 变成了 primary,说明完成自动切换任务

5.写入测试

ty:PRIMARY> db.ty.insert({age:1000})
WriteResult({ "nInserted" : 1 })
ty:PRIMARY> db.ty.find()
{ "_id" : ObjectId("5ef9a99662e0d2208ccde0cc"), "ty" : 11 }
{ "_id" : ObjectId("5efa8adc3b55e73f44c6539e"), "age" : 100 }
{ "_id" : ObjectId("5efa8ed6d009f8bab0438011"), "age" : 1000 }

读写正常

6.故障节点重新启动

[mongodb@ty1 ~]$ mongod --config /mongodb/27018/mongodb_27018.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 22362
child process started successfully, parent exiting
[mongodb@ty1 ~]$ mongo --port 27018
则该节点角色将变为secondary,且自动复制最新的数据到本节点
ty:SECONDARY> db.getMongo().setSlaveOk()
ty:SECONDARY> db.ty.find();
{ "_id" : ObjectId("5ef9a99662e0d2208ccde0cc"), "ty" : 11 }
{ "_id" : ObjectId("5efa8adc3b55e73f44c6539e"), "age" : 100 }
{ "_id" : ObjectId("5efa8ed6d009f8bab0438011"), "age" : 1000 }

添加节点

1.配置新实例
2.添加新实例
    a.连接主节点
    b.添加节点
    rs.add("192.168.65.130:27021")
3.查看配置
4.数据验证
        

删除节点

rs.remove("192.168.65.130:27021")

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ty_FFTQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值