报表系统主备(主机、备机并不是配死的,谁先启动谁就是主机)
报表系统主备场景描述:
3台REPORT系统主备。在redis里面设了master键,为了防止并发,在数据库里面也设置了主备。
之前开发的逻辑通过IP来标识,但如果部署在通一个机器上,问题来了:3台机器同一个IP的时候,怎么区分?
后来开发修改方案,每台机器去redis注册,每次重启都新生成唯一编号(类似时间戳)
测试场景设计:
(1)3台同事并发启动,只能又1台是主2台备,只有主机会执行REPORT的定时任务。
(2)3台机器,其中1台主机,2台备机。主机DOWN后,2台备机只能一个变成主。
(3)A,B,C,按照先后顺序,慢慢启动(不并发),只有A一台机器时A是主机。第2启动的B是备机,第3启动的是C备机
然后依次从A,B,C宕机,剩下B,C机器时有1台是主机,剩下C一台机器它自己是主机
MONODB主备
开发设计:(这个方案不合理)
通过mongdb 自己的主从配置,配置谁是主,谁是备
主永远是主,备永远是备(并不是谁先启动,谁是主)
主备都OK时,先写主,同步到备(主备数据保持一致)
主备,主挂了,自动写备,主恢复补上失去的数据,程序自动写主。
主备,备挂了,备恢复后要补上失去的数据
mongodb高可用方案(一)主从复制
https://blog.csdn.net/ocean_fan/article/details/79191521
mongodb高可用方案(二)可复制集----推荐用这个实现MONGO主备
https://blog.csdn.net/ocean_fan/article/details/79191649
同步测试
- 在主库上插入数据
> use testsalve
switched to db testsalve
> db
testsalve
> db.testsalve.insert({"name" : "测试同步"})
WriteResult({ "nInserted" : 1 })
> show collections
testsalve
> db.testsalve.find().pretty()
{ "_id" : ObjectId("5ad44d090dd23b7a5c1a983f"), "name" : "测试同步" }
- 从库上查看是否同步
> rs.slaveOk();
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
testsalve 0.000GB
> use testsalve
switched to db testsalve
> db.testsalve.find().pretty()
{ "_id" : ObjectId("5ad44d090dd23b7a5c1a983f"), "name" : "测试同步" }
# 数据已同步过来
注意
salve节点默认是无法读写的,如果非要解决,方法如下:
在从库执行
> rs.slaveOk();
- MongoDB数据库备份
1、语法: mongodump -h dbhost -d dbname -o dbdirectory
参数说明:
-h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d: 需要备份的数据库实例,例如:test -o: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。
- MongoDB数据库恢复
1、语法: mongorestore -h dbhost -d dbname --dir dbdirectory
参数或名:
-h: MongoDB所在服务器地址
-d: 需要恢复的数据库实例,
例如:test,当然这个名称也可以和备份时候的不一样,
比如test2 --dir: 备份数据所在位置,
例如:/opt --drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。
就是说,恢复后,备份后添加修改的数据都会被删除。
作者:你的小白
链接:https://www.jianshu.com/p/647ddfd1f5d7
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。