Mongodb 5节点异地两中心故障转移恢复测试案例
Mongodb5节点异地两中心故障转移恢复测试案例
架构方式:5节点,主中心(2数据1仲裁),备中心(1数据1仲裁)
1基本情况
操作系统:Red Hat Enterprise Linux Server release 6.3 (Santiago)
Mongodb版本:db version v3.6.3
Mongodb架构:
Ip,端口规划
"hosts" : [##数据节点
"*114:28001",#主中心
"*114:28002",#主中心
"*114:28004"#备份中心
],
"arbiters" : [##仲裁节点
"*114:28003",#主中心
"*114:28005"#备份中心
],
2 mongodb
配置文件,其他配置文件28001替换为28002~28007
注意相应的data,log等数据目录要存在,记住,所有的mongodb里面执行的命令,都要有返回ok为1才成功。
[root@mysqlt1 ~]# cat /data/mongodb/conf/28001.conf
port=28001
bind_ip=*
logpath=/data/mongodb/log/28001.log
dbpath=/data/mongodb/data/28001/
logappend=true
pidfilepath=/data/mongodb/28001.pid
fork=true
oplogSize=1024
replSet=MyMongo
[root@mysqlt1 conf]# ll /data/mongodb/conf/
total 32
-rw-r--r-- 1 root root 192 Oct 16 02:48 28001.conf
-rw-r--r-- 1 root root 225 Oct 16 07:21 28002.conf
-rw-r--r-- 1 root root 192 Oct 16 02:48 28003.conf
-rw-r--r-- 1 root root 192 Oct 11 03:37 28004.conf
-rw-r--r-- 1 root root 192 Oct 11 03:38 28005.conf
-rw-r--r-- 1 root root 192 Oct 16 07:18 28006.conf
-rw-r--r-- 1 root root 192 Oct 16 08:15 28007.conf
启动5个节点
[root@mysqlt1 data]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28001.conf
[root@mysqlt1 data]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28002.conf
[root@mysqlt1 data]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28003.conf
[root@mysqlt1 data]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28004.conf
[root@mysqlt1 data]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28005.conf
3 测试主中心全部宕机的情况
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/28001.conf
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/28002.conf
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/28003.conf
只剩备份中心的2个节点,这时候变为secondry,备份中心只能读取,不能写入
两种解决方案
1 把备份中心的secondry节点,作为单节点,去掉参数replSet重新启动,可以继续使用,但是由于单节点缺少oplog,后面主中心恢复,备份中心的数据不能恢复到整个副本集中,可以考虑备份方式(复杂,这里还有第二种方式)。
2 在备份中心,启动2个新的仲裁节点,强制加入副本集,使secondry节点变为primary节点,详细的操作方式
一:启动备份中心的2个新节点(28006,28007)
二:在备份中心的secondry节点,重新配置副本集,加入2个仲裁节点
MyMongo:SECONDARY> use admin
MyMongo:SECONDARY> config = {
"_id":"MyMongo",
members:[
{"_id":0,host:"*:28001"},
{"_id":1,host:"*:28002"},
{"_id":2,host:"*:28003", arbiterOnly: true},
{"_id":3,host:"*:28004"},
{"_id":4,host:"*:28005", arbiterOnly: true},
{"_id":5,host:"*:28006", arbiterOnly: true},
{"_id":6,host:"*:28007", arbiterOnly: true}]
}
MyMongo:SECONDARY> rs.reconfig(config,{force:true});
MyMongo:PRIMARY> rs.status() #查看副本集的状态,及各节点的状态
MyMongo:PRIMARY> db.isMaster()
在client端批量插入数据(简单的程序),这里可以配置集群方式连接,也可以指定主节点的方式进行插入,这里是直接指定主节点
#coding:utf-8
import time
from pymongo import MongoClient
#conn = MongoClient()
# keyword argument
conn = MongoClient('*', 28004)
# MongoDB URI
#conn = MongoClient('mongodb://localhost:27017/')
#from pymongo import ReplicaSetConnection
#conn = ReplicaSetConnection("*:28001,*:28002,*:28004", replicaSet="MyMongo", read_preference=2, safe=True) for i in xrange(100):
try:
conn.test.tt3.insert({"name":"test" + str(i)})
time.sleep(1)
print conn.primary
print conn.secondaries
except:
pass
主节点执行,100条
MyMongo:PRIMARY> db.tt3.find().count()
100
启动主中心的3个节点
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28001.conf
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28002.conf
[root@mysqlt1 conf]# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/28003.conf
[root@mysqlt1 ~]# /usr/local/mongodb/bin/mongo *:28002/admin
MyMongo:SECONDARY> rs.slaveOk(true)
MyMongo:SECONDARY> use test;
switched to db test
MyMongo:SECONDARY> db.tt3.find().count() #数据同步成功
100
之前的5个节点,现在变成了7个节点,删除新加的2个仲裁节点
MyMongo:PRIMARY> rs.remove("*:28007");
MyMongo:PRIMARY> rs.remove("*:28006");
MyMongo:PRIMARY> db.isMaster() #变回之前的5个节点,1主,2secondry,2仲裁
{
"hosts" : [
"*:28001",
"*:28002",
"*:28004"
],
"arbiters" : [
"*:28003",
"*:28005"
MyMongo:PRIMARY> rs.status()
{
"set" : "MyMongo",
"date" : ISODate("2018-10-16T18:16:15.512Z"),
"myState" : 1,
"term" : NumberLong(7),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1539713766, 1),
"t" : NumberLong(7)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1539713766, 1),
"t" : NumberLong(7)
},
"appliedOpTime" : {
"ts" : Timestamp(1539713766, 1),
"t" : NumberLong(7)
},
"durableOpTime" : {
"ts" : Timestamp(1539713766, 1),
"t" : NumberLong(7)
}
},
"members" : [
{
"_id" : 0,
"name" : "*:28001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 237,
"optime" : {
"ts" : Timestamp(1539713766, 1),
"t" : NumberLong(7)
},
"optimeDurable" : {
"ts" : Timestamp(1539713766, 1),
"t" : NumberLong(7)
},
"optimeDate" : ISODate("2018-10-16T18:16:06Z"),
"optimeDurableDate" : ISODate("2018-10-16T18:16:06Z"),
"lastHeartbeat" : ISODate("2018-10-16T18:16:13.929Z"),
"lastHeartbeatRecv" : ISODate("2018-10-16T18:16:14.928Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "*:28004",
"configVersion" : 102086
},
{
"_id" : 1,
"name" : "*:28002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 269,
"optime" : {
"ts" : Timestamp(1539713766, 1),
"t" : NumberLong(7)
},
"optimeDurable" : {
"ts" : Timestamp(1539713766, 1),
"t" : NumberLong(7)
},
"optimeDate" : ISODate("2018-10-16T18:16:06Z"),
"optimeDurableDate" : ISODate("2018-10-16T18:16:06Z"),
"lastHeartbeat" : ISODate("2018-10-16T18:16:13.929Z"),
"lastHeartbeatRecv" : ISODate("2018-10-16T18:16:14.928Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "*:28004",
"configVersion" : 102086
},
{
"_id" : 2,
"name" : "*:28003",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 193,
"lastHeartbeat" : ISODate("2018-10-16T18:16:13.929Z"),
"lastHeartbeatRecv" : ISODate("2018-10-16T18:16:11.917Z"),
"pingMs" : NumberLong(0),
"configVersion" : 102086
},
{
"_id" : 3,
"name" : "*:28004",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 68054,
"optime" : {
"ts" : Timestamp(1539713766, 1),
"t" : NumberLong(7)
},
"optimeDate" : ISODate("2018-10-16T18:16:06Z"),
"electionTime" : Timestamp(1539712874, 1),
"electionDate" : ISODate("2018-10-16T18:01:14Z"),
"configVersion" : 102086,
"self" : true
},
{
"_id" : 4,
"name" : "*:28005",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 66987,
"lastHeartbeat" : ISODate("2018-10-16T18:16:13.929Z"),
"lastHeartbeatRecv" : ISODate("2018-10-16T18:16:11.921Z"),
"pingMs" : NumberLong(0),
"configVersion" : 102086
}
],
"ok" : 1,
"operationTime" : Timestamp(1539713766, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1539713766, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
Mongodb 5节点异地两中心故障转移恢复测试案例的更多相关文章
- 3.16 使用Zookeeper对HDFS HA配置自动故障转移及测试
一.说明 从上一节可看出,虽然搭建好了HA架构,但是只能手动进行active与standby的切换: 接下来看一下用zookeeper进行自动故障转移: # 在启动HA之后,两个NameNode都是s ...
- MHA高可用+VIP 集群故障转移(已测试成功)
服务器部署说明192.168.158.201 mha管理,mysql主服192.168.158.202 mha节点,mysql从服192.168.158.203 mha节点,mysql从服Man ...
- MongoDB副本集配置系列十一:MongoDB 数据同步原理和自动故障转移的原理
1:数据同步的原理: 当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步: 1:检查自己local库的oplog.rs集合找出最近的时间戳. 2:检查Primary ...
- MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录
Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...
- mongoDB研究笔记:复制集故障转移机制
上面的介绍的数据同步(http://www.cnblogs.com/guoyuanwei/p/3293668.html)相当于传统数据库中的备份策略,mongoDB在此基础还有自动故障转移的功能.在复 ...
- 一个线上问题的思考:Eureka注册中心集群如何实现客户端请求负载及故障转移?
前言 先抛一个问题给我聪明的读者,如果你们使用微服务SpringCloud-Netflix进行业务开发,那么线上注册中心肯定也是用了集群部署,问题来了: 你了解Eureka注册中心集群如何实现客户端请 ...
- Hyper-V 2012 R2 故障转移群集
和终端用户相比,企业用户对于业务的连续性和可靠性更为在意.相对而言,企业一般不会将追逐单一硬件的性能排在第一位. 如何衡量业务是否持续可用,一般使用"x 个 9"这种方式来定义.如 ...
- 第八章 Hyper-V 2012 R2 故障转移群集
和终端用户相比,企业用户对于业务的连续性和可靠性更为在意.相对而言,企业一般不会将追逐单一硬件的性能排在第一位. 如何衡量业务是否持续可用,一般使用"x 个 9"这种方式来定义.如 ...
- 搭建iSCSI文件服务器故障转移群集
故障转移群集(Failover Cluster)可以提供一个高可用性应用程序或服务的网络环境,本章将接受如何搭建iSCSI SAN文件服务器故障转移群集. 故障转移群集概述 我们可以将多台服务器组成一 ...
随机推荐
- springmvc拦截器基本使用
1.HandlerExecutionChain是一个执行链,当用户的请求到达DispatcherServlet的时候,DispatcherServlet会到HandlerMapping中查找对应的Ha ...
- word导出失败问题
1.问题分析: 求职者在线填写招聘简历,人事hr下载简历无法打开,报错如下: 对于”根据架构,xml数据无效”,是因为没有成功生产xml,内部代码里还包含word无法识别的代码块,所以无法打开,通过用 ...
- 【bzoj3240 && 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法……然而我太弱了,一开始只想到了矩阵乘法的 ...
- HBase学习1(hbase基础)
认识NoSQL NoSQL:泛指非关系数据库(Not only SQL) NoSQL两重要特征:使用硬盘和把随机存储器作为存储载体 NoSQL分类(按照存储格式) 1)键值(Key-Value)存储数 ...
- 利用Phoenix为HBase创建二级索引
为什么需要Secondary Index 对于Hbase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄. ...
- 十分钟让你明白Objective-C的语法(和Java、C++的对比)
很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有 ...
- Spring初学之annotation实现AOP前置通知、后置通知、返回通知、异常通知。
实现两个整数的加减乘除.在执行每个方法之前打印日志. ArithmeticCalculator.java: package spring.aop.impl; public interface Arit ...
- BZOJ3672/UOJ7 [Noi2014]购票
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- UVA 11827 水
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 简单CSS3动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...