mongoDB pair replication [ two master when remote unreachable ]

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:
测试环境如图:
使用对外连接的网卡作为心跳网卡,VIP作为与外部应用服务器通信的端口。

mongoDB pair replication [ two master when remote unreachable ] - 德哥@Digoal - The Heart,The World.

当比较神奇的现象出现的时候,假设这两台服务器不通了,但是和外面的应用服务器已经交换机是通的。正常情况下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"})

 
mongoDB pair replication [ two master when remote unreachable ] - 德哥@Digoal - The Heart,The World.
 

假设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" }
数据被合并了!

mongoDB pair replication [ two master when remote unreachable ] - 德哥@Digoal - The Heart,The World.
 
总结:
1. 选择好的心跳。加入更完善的判断。
目录
相关文章
|
存储 消息中间件 NoSQL
延时消息常见实现方案
延时消息常见实现方案
延时消息常见实现方案
|
SQL 关系型数据库 MySQL
MySQL InnoDB中的锁-临键锁(next-key lock)
MySQL InnoDB 锁 临键锁 next-key lock
2222 0
MySQL InnoDB中的锁-临键锁(next-key lock)
|
SQL XML 存储
【MyBatis-Plus】MyBatis-Plus基本操作快速入门(二)
【MyBatis-Plus】MyBatis-Plus基本操作快速入门(二)
543 0
【MyBatis-Plus】MyBatis-Plus基本操作快速入门(二)
|
定位技术
【DIY无人机】导航板(I2C-GPS)烧录
GPS,其实应该是指Global Navigation Satellite System全球导航卫星系统,即GNSS,主要是用来定位的系统,目前全球定位系统有下面几种.....
890 1
【DIY无人机】导航板(I2C-GPS)烧录
|
人工智能 监控 算法
阿里云智慧高速解决方案 让高速公路出行更安全、更畅通、更舒心
首先,交通安全问题突出,交通事故频发;第二,智慧管控手段不足,大多依靠表格化的 OA 系统;第三,管理运营水平不高,主要流程依靠人为推动发现;第四,公众出行体验较差,交通拥堵事件频发。
3466 0
阿里云智慧高速解决方案 让高速公路出行更安全、更畅通、更舒心
|
开发者 语音技术 自然语言处理
天猫精灵创建音乐小场景-冬瓜
天猫精灵创建音乐小场景-冬瓜
1325 0
天猫精灵创建音乐小场景-冬瓜
|
小程序 前端开发 程序员
讨老婆开心,阿里云程序员的方式,竟然是…
阿里坚持每年都举办集体婚礼,还得从“阿里日”开始说起。 2003年“非典”期间,因一位员工被确诊“疑似”,全体阿里员工必须搬着电脑回家隔离办公。为纪念那段艰苦岁月中的坚韧坚持,感恩家人的温暖支撑,2005年起,阿里决定将每年的5月10日设立为“阿里日”,并从2006年起,每年举办员工集体婚礼。 当阿里集体婚越来越受到阿里人追捧时, “公益”成为集体婚礼另一个重要的关键词。每年累计公益时长最高的两对夫妻,可以免于抽签,直接参加集体婚礼。 为了给妻子王若芸一个别致却更有意义的婚礼,这一年,阿里云程序员驿桥积累了599个公益时,这是他和妻子的爱情故事。
551 0
讨老婆开心,阿里云程序员的方式,竟然是…
SwiftUI—如何给图像视图添加边框、透明度和阴影
SwiftUI—如何给图像视图添加边框、透明度和阴影
943 0
SwiftUI—如何给图像视图添加边框、透明度和阴影
浅谈http缓存使用(Cache-Control、Last-Modified、ETag使用)
浅谈http缓存使用(Cache-Control、Last-Modified、ETag使用)
浅谈http缓存使用(Cache-Control、Last-Modified、ETag使用)
m1 mac电脑端钉钉 无远程协助功能
m1 mac电脑端钉钉无法远程协助他人