我很难理解 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")
}
}
我可以使用任何命令来处理这个结构吗?
此致。
请注意,在 MongoDB 中有两个不同的多数。
多数适用于选举 PRIMARY,在您的情况下,所有三个成员都被计算在内,即如果一个成员不可用,那么您仍然有多数可用。
其他大多数适用于写入数据,在您的情况下,只计算两个数据承载注释。如果其中一个出现故障,那么大多数将不再可用 - 尽管您有一个 ARBITER。
因此,对于 3 成员 PSA 副本集,唯一有意义的 RW 问题是
通常,您在设置 MongoDB 时只运行一次此命令。
请注意,某些命令(例如重命名集合)强制写入关注
{ w: "majority" }
,您无法更改它。因此,当您想运行此类命令时,大多数必须可用。否则,您需要将非投票成员不可用的成员降级,即将副本设置更改为{ votes: 0, priority: 0}
。