目前我已经拥有运行以下 mongod 实例的服务器 A 和服务器 B:
服务器 A
- mongod 服务器(通常是主服务器)
- mongod 仲裁者
服务器 B
- mongod 服务器 (通常是 SECONDARY)
当服务器 A 发生故障时,服务器 B 无法选举自己为主服务器来接管一切。因此,我的整个应用程序都离线了,因为数据库不可用。
我的问题是,在不增加物理服务器数量的前提下,如何确保当服务器 A 发生故障时服务器 B 能够正确接管?
以下做法是个好主意吗?
服务器 A
- mongod 服务器 1A
- mongod 服务器 2A
- mongod 仲裁者A
服务器 B
- mongod 服务器 1B
- mongod 服务器 2B
- mongod 仲裁者B
我没有在 B 上添加仲裁器,因为这样会使服务器总数相等。问题是:当服务器 A 关闭时,这是让服务器 B 接管的最有效方法吗?或者我可以移除一些服务器以节省 RAM/CPU/HDD 吗?
答案1
将仲裁器与 mongod 进程放在同一台机器上其实并不有效。您是否有第三台不相关的服务器来运行仲裁器?
(记录于此:http://www.mongodb.org/display/DOCS/Replica+Set+Tutorial#ReplicaSetTutorial-Runningwithtwonodes)
在同一台服务器上运行多个 mongod 进程会导致性能问题。此外,在同一台机器上有两个可用的 mongod 进程和一个仲裁器意味着,如果两台物理服务器彼此断开连接,它们将各自选举一个本地主服务器。
答案2
当 A 断电时让服务器 B 接管的最有效方法是将当前仲裁器移至 B。但是,这意味着如果 B 发生故障,A 将不再是主要服务器,因为它无法形成多数。
有两个选项 - 让另一个仲裁器实例准备好在 A/B 上运行,并在将其添加到集合中失败时重新配置集合并删除另一个仲裁器,或者在另一个仲裁器关闭时将 A/B 作为副本集之外的独立 mongod 重新启动,并在一切恢复正常后重新配置。
使用 2 台机器时,您总会遇到必须手动干预才能恢复设置的问题。我能想到的每个自动解决方案都需要另一台机器。