mongoDB pair replication [ two master when remote unreachable ]

测试环境如图:
使用对外连接的网卡作为心跳网卡,VIP作为与外部应用服务器通信的端口。

当比较神奇的现象出现的时候,假设这两台服务器不通了,但是和外面的应用服务器已经交换机是通的。正常情况下mongoDB会选出新的primary(下面用iptables来模拟)
如下图,A机和B机都变成primary了,
在mongo shell中的表现:
A(原来的primary)机器:
经过一段时间之后(约20秒)
> db.isMaster()
{
        "ismaster" : 1,
        "remote" : "192.168.169.90:5281",
        "info" : "remote unreachable",
        "ok" : 1
}
B机器:
经过一段时间之后(约20秒)
> db.isMaster()
{
        "ismaster" : 1,
        "remote" : "192.168.169.90:5281",
        "info" : "remote unreachable",
        "ok" : 1
}
对于VIP的漂移来说,判断对方不可达了就启VIP。当然你可以选择另外的心跳(比如串口),这里是模拟两台都primary了后面会怎么样?
那么在交换机上192.168.169.99的mac地址会不断的被这两台mongodb服务器刷新成自己的MAC。
应用程序幸运的话可能会对两个数据库都有写入操作.
模拟:
A机器写入数据:
> db.tbl_test.insert({"id" : "a"})
> db.tbl_test.insert({"id" : "a"})
> db.tbl_test.insert({"id" : "a"})
> db.tbl_test.insert({"id" : "a"})
> db.tbl_test.insert({"id" : "a"})
> db.tbl_test.insert({"id" : "a"})
> db.tbl_test.insert({"id" : "a"})
B机器写入数据:
> db.tbl_test.insert({"id" : "b"})
> db.tbl_test.insert({"id" : "b"})
> db.tbl_test.insert({"id" : "b"})
> db.tbl_test.insert({"id" : "b"})
> db.tbl_test.insert({"id" : "b"})
> db.tbl_test.insert({"id" : "b"})
> db.tbl_test.insert({"id" : "b"})

 


 

假设A机器和B机器之间的网络恢复正常了,两台mongodb将重新协商谁将成为primary。(具体的选择算法参考mongoDB手册)
假设A又变成primary了。
来查询一下刚才插入的数据表:
> db.tbl_test.find()
{ "_id" : ObjectId("4d26c6127073f6939f0149e1"), "id" : "b" }
{ "_id" : ObjectId("4d26c6197073f6939f0149e2"), "id" : "b" }
{ "_id" : ObjectId("4d26c6197073f6939f0149e3"), "id" : "b" }
{ "_id" : ObjectId("4d26c6197073f6939f0149e4"), "id" : "b" }
{ "_id" : ObjectId("4d26c6197073f6939f0149e5"), "id" : "b" }
{ "_id" : ObjectId("4d26c61a7073f6939f0149e6"), "id" : "b" }
{ "_id" : ObjectId("4d26c61a7073f6939f0149e7"), "id" : "b" }
{ "_id" : ObjectId("4d26c60355fd2c402a5c025c"), "id" : "a" }
{ "_id" : ObjectId("4d26c61555fd2c402a5c025d"), "id" : "a" }
{ "_id" : ObjectId("4d26c61655fd2c402a5c025e"), "id" : "a" }
{ "_id" : ObjectId("4d26c61655fd2c402a5c025f"), "id" : "a" }
{ "_id" : ObjectId("4d26c61655fd2c402a5c0260"), "id" : "a" }
{ "_id" : ObjectId("4d26c61655fd2c402a5c0261"), "id" : "a" }
{ "_id" : ObjectId("4d26c61655fd2c402a5c0262"), "id" : "a" }
数据被合并了!


 
总结:
1. 选择好的心跳。加入更完善的判断。

时间: 2024-10-24 12:33:54

mongoDB pair replication [ two master when remote unreachable ]的相关文章

linux中mongodb安装和启动配置介绍

1.下载安装包 wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.2.tgz 下载完成后解压缩压缩包 tar zxf mongodb-linux-i686-1.8.2.tgz 2. 安装准备 将mongodb移动到/usr/local/server/mongdb文件夹 mv mongodb-linux-i686-1.4.4 /usr/local/mongodb 创建数据库文件夹与日志文件 mkdir /usr/local/mo

Performing Data Write Operations with MongoDB

Introduction This article discusses the steps involved in performing data write operations with MongoDB, focusing on the roles of the Journal and Oplog applications. Journal is a concept on the MongoDB storage engine layer while plog is a capped coll

MongoDB的Master-Slave主从模式配置及主从复制要点解析_MongoDB

主从配置mongodb的master-slave模式配置方式如下1.keyFile生成key_file openssl rand -base64 741 > mongo_key 将mongo_key 分别置于master 和 slave mongodb user可以access的地方. 设置权限 chmod 700 mongo_key 设置 onwer chown mongodb:nogroup mongo_key 2.master配置编辑/etc/mongodb.conf, 设置如下 mast

【Mongodb】Master-Slave 复制

mongodb的主从复制是最常见的复制模式,这种模式是非常灵活的并且可以用来做备份,failover 故障切换, 拓展读等等,最常见的方式是一主一备或者一主多备,每个slave 都知道主库的地址 即主库的ip地址和端口号. 如下图:                                                 一主一备模式                                                    一主多备 模式 mongodb 启动master 的方

PostgreSQL HOT STANDBY using Stream replication

案例解析二.PostgreSQL HOT STANDBY by stream replication 测试:一.准备硬件1. 主节点硬件配置DISK : 146GB*6MEM : 14GBCPU : 2.83GHz*82. standby节点硬件配置DISK : 146GB*4MEM : 8GBCPU : 2.0GHz*8 二.准备环境1. 系统Red Hat Enterprise Linux Server release 5.5 (Tikanga) x642. 时钟同步8 * * * * /u

MongoDB 主从复制实例讲解_MongoDB

主从复制可以用来做数据库的备份,故障恢复,读写分离. 本实验使用Mongodb 3.2版本,我们先查看一下mongod的帮助 [root@localhost mongodb]# mongod --help .....省略 Master/slave options (old; use replica sets instead): --master master mode --slave slave mode --source arg when slave: specify master as <s

MongoDB 之Java应用测试

不多说了,看源码 package corejava2.mongo.basic; import java.net.UnknownHostException; import org.bson.types.ObjectId; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DB

实战MongoDB-Replication之Master-Slave

01. 欢迎使用ueditor! MongoDB支持不同服务之间的异步的数据复制,来实现failover(故障转移,故障切换,故障恢复) and redundancy(数据冗余). 同一时间,只有一个服务节点(primary或者master)支持写入. MongoDB支持两种复制的模式: Master/Slave,主从复制,角色包括master和slave. Replica Set,复制集复制,角色包括primary和secondary. 介绍Master/Slave的官方地址: http://

计算机端口详解

计算机端口详解 一 摘要 端口是个网络应用中很重要的东西,相当于"门"了. 计算机"端口"是英文port的义译,可以认为是计算机与外界通讯交流的出口.其中硬件领域的端口又称接口,如:USB端口.串行端口等.软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和I/O(基本输入输出)缓冲区.     可以先了解面向连接和无连接协议(Connection-Oriented and Connectionless Prot