跨区 MongoDB 的 replica 高可用验证

本贴最后更新于 1340 天前,其中的信息可能已经沧海桑田

跨区 MongoDB 的 replica 高可用验证

背景:创建 7 个节点的 replica:三区 4 个节点,四区 3 个节点。

  • 四区不可用时(3 个节点挂了),mongo 集群还能正常工作
  • 三区不可用时(4 个节点挂了),此情况下需要人工干预

人工干预的思路为把剩下的三个节点重新配置为一个新的副本集,步骤如下:

  1. 登录其中一个存活的节点,用以下命令查看和保存当前配置

    cfg = rs.conf()
    
    printjson(cfg)
    
  2. 重新配置副本集成员:下面的 4,5,6 为 cfg.members 这个数组中的下标(下标从 0 开始算起),不是每个节点的“_id”参数。请根据实际情况配置。

    cfg.members = [cfg.members[5] , cfg.members[4] , cfg.members[6]]
    
  3. 重新配置副本集:

    rs.reconfig(cfg, {force : true})
    

    操作后,剩下的三个存活节点会选出一个 primary 节点。

恢复正常

当出问题的区恢复正常后,需要把恢复正常的节点加入到新的副本集去。参考命令:

rs.add( "192.168.11.141:27001" )
rs.add( "192.168.11.141:27002" )
rs.add( "192.168.11.141:27003" )
rs.add( "192.168.11.141:27004" )

常用操作

use admin;
db.createUser(
  {
    user: "root",
    pwd: "root",
    roles: [ { role: "root", db: "admin" } ]
  }
)
db.auth("root","root")
show users
db.inventory.insertOne(
   { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
db.inventory.insertOne(
   { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
db.inventory.insertMany([
   { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
   { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
   { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
db.inventory.find( {} )
  • secondary 的操作
设置 secondary 节点可读
db.getMongo().setSlaveOk()
rs.slaveOk()
  • 添加新的数据到新的副本集:
db.inventory.insertMany([
   { item: "journal", qty: 26, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
   { item: "mat", qty: 88, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
   { item: "mousepad", qty: 35, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
db.inventory.find( {} )
  • 新副本集重新添加失效节点:
rs.add( "192.168.11.141:27001" )

失效节点加进来新副本集后数据是如何同步的?

27007 是新副本集的 primary,27001 是失效后,再加入新副本集的节点。27001 的日志如下:

2020-08-07T02:22:01.769+0000 I REPL     [replexec-0] Member 192.168.11.141:27007 is now in state PRIMARY
2020-08-07T02:22:02.303+0000 I REPL     [rsBackgroundSync] sync source candidate: 192.168.11.141:27007
2020-08-07T02:22:02.303+0000 I ASIO     [RS] Connecting to 192.168.11.141:27007
2020-08-07T02:22:02.305+0000 I REPL     [rsBackgroundSync] Changed sync source from empty to 192.168.11.141:27007

根据同步日志来看,是全量同步的。

  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 4 关注
1 操作
SmiteLi 在 2020-08-19 11:14:56 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...