AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 328194
Accepted
Rafael
Rafael
Asked: 2023-06-12 22:03:51 +0800 CST2023-06-12 22:03:51 +0800 CST 2023-06-12 22:03:51 +0800 CST

Mongodb replicaset允许secondary写数据

  • 772

我很难理解 replicaSet 如何使用 2 个节点和一个仲裁器工作,在 3 个服务器和 ubuntu 22.04 中使用 MongoDB 6 社区。

我的实际情况是我在一个 replicaSet 中有 2 个服务器,其中第一个是主服务器(优先级 1)和一个优先级为 0.5 的辅助服务器(我是这样设置的,所以我总是可以将主服务器作为主服务器)。第三台服务器不存储任何作为仲裁器工作的数据。

我测试关闭我的主要,所以我的次要被选为主要没有问题。但是如果我试图在上面写任何数据,他不会保存直到我的主要回来。

我的想法是让我的辅助服务器作为备用服务器,以防我的主服务器因任何原因出现故障,这样我的应用程序就可以继续保存和读取。

我知道我可以使用 3 个服务器节点,所以我会有 2 个可写服务器来投票,考虑到这个数据库将有大约 1TB 的数据,我现在不能让第三个服务器保存相同数量的数据。

我尝试了一些关于写关注的命令,但我有两种不同的行为:

1 - 使用此命令,使用 mongodb Compass,似乎写入了新数据,但在主数据库返回之前不会列出:

db.adminCommand({ "setDefaultRWConcern": 1, "defaultWriteConcern": { "w": 1 } })

2 - 使用 mongodb Compass,显示“Iinserting Document”,但永远不会完成,直到 primary 返回:

db.adminCommand({ "setDefaultRWConcern": 1, "defaultWriteConcern": { "w": "majority" } })

更新连接方式:通过 PHP 应用程序,将 ssh 与mongosh带有连接字符串的 MongoDB Compass 结合使用(在 Wernfried 的帮助下): mongodb://rootuser:rootpasswd@primaryip:27017,secondaryip:27017/?replicaSet=myRepl&authSource=admin&readPreference=primaryPreferred

如果我关闭我的主服务器,次要服务器将被选为主要服务器,但在两个节点都在线之前我无法写入。

这就是我的 rs.conf() 现在的样子

{
   _id: 'rspd01',
   version: 13,
   term: 51,
   members: [
     {
        _id: 0,
        host: 'primaryIP:27017',
        arbiterOnly: false,
        buildIndexes: true,
        hidden: false,
        priority: 1,
        tags: {},
        secondaryDelaySecs: Long("0"),
        votes: 1
     },
     {
        _id: 1,
        host: 'secondaryIP:27017',
        arbiterOnly: false,
        buildIndexes: true,
        hidden: false,
        priority: 0.5,
        tags: {},
        secondaryDelaySecs: Long("0"),
        votes: 1
     },
     {
        _id: 2,
        host: 'arbiterIP:27017',
        arbiterOnly: true,
        buildIndexes: true,
        hidden: false,
        priority: 0,
        tags: {},
        secondaryDelaySecs: Long("0"),
        votes: 1
     }
   ],
   protocolVersion: Long("1"),
   writeConcernMajorityJournalDefault: true,
   settings: {
      chainingAllowed: true,
      heartbeatIntervalMillis: 2000,
      heartbeatTimeoutSecs: 10,
      electionTimeoutMillis: 10000,
      catchUpTimeoutMillis: -1,
      catchUpTakeoverDelayMillis: 30000,
      getLastErrorModes: {},
      getLastErrorDefaults: { w: 1, wtimeout: 0 },
      replicaSetId: ObjectId("64863fd09a9b54d4cd0da913")
   }
}

我可以使用任何命令来处理这个结构吗?

此致。

replication
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    Wernfried Domscheit
    2023-06-13T12:50:09+08:002023-06-13T12:50:09+08:00

    请注意,在 MongoDB 中有两个不同的多数。

    • 多数适用于选举 PRIMARY,在您的情况下,所有三个成员都被计算在内,即如果一个成员不可用,那么您仍然有多数可用。

    • 其他大多数适用于写入数据,在您的情况下,只计算两个数据承载注释。如果其中一个出现故障,那么大多数将不再可用 - 尽管您有一个 ARBITER。

    因此,对于 3 成员 PSA 副本集,唯一有意义的 RW 问题是

    db.adminCommand({ setDefaultRWConcern: 1, defaultWriteConcern: { w: 1 } }) 
    

    通常,您在设置 MongoDB 时只运行一次此命令。

    请注意,某些命令(例如重命名集合)强制写入关注{ w: "majority" },您无法更改它。因此,当您想运行此类命令时,大多数必须可用。否则,您需要将非投票成员不可用的成员降级,即将副本设置更改为{ votes: 0, priority: 0}。

    • 1

相关问题

  • 如何阻止 MySQL 从站将更改复制到“mysql”数据库?

  • 在同一台物理服务器上运行复制是不明智的吗?

  • 有没有办法以小于 1 秒的分辨率测量 MySQL 中的复制滞后?

  • 运行时间偏移延迟复制的最佳实践

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve