Dan*_*l F 5 replication mongodb ssh
dc1.com 上的 MongoDB 实例目前是独立的,On-Site 定期通过 ssh 隧道通过 mongodump 提取备份。
我现在想创建两个实例,一个在现场,一个在第二个数据中心,并使这三个实例成为副本集,以便备份几乎是即时的。这样,我就可以拥有一个现场备份,并在第二个数据中心中拥有一个备份,该备份始终是最新的。
如果 dc1.com 中的主 MongoDB 实例发生故障,那么就这样,无法提供任何数据,然后需要手动修复此问题,因为现场实例和辅助数据中心中的实例不应接管。这两个也不应该被质疑。他们只是作为备份。
我的问题是,当我将 --replSet 添加到主数据库,然后添加 rs.initialize() 时,该实例在某种程度上不会被识别为绑定到 localhost,而是绑定到 172.17.0.1,这是 docker 接口,我需要绑定以便容器可以连接到 MongoDB。如果我随后尝试通过rs.add("localhost:2001")dc2.com 上的实例添加成员,则会收到有关无法混合本地主机和非本地主机数据库的错误。主实例被识别为 172.17.0.1,而不是 localhost。
“副本集配置中的所有主机名都必须是本地主机引用,或者都必须是本地主机引用;找到二分之一”
然后,我使用/sf/ask/2019044751/来发出 ars.initiate({_id:"rs0", members: [{"_id":1, "host":"127.0.0.1:1000"}]})强制将 dc1.com 上的副本集初始化绑定到本地主机。但是当我尝试通过添加成员时,rs.add("localhost:2001")我仍然无法做到这一点。这不再是主机名错误,而是另一个错误,我不太记得了,因为我厌倦了尝试,不得不回滚所有内容。就像连接被拒绝一样。当我执行 a 时,mongo --port 2001我会在收到有关“isMaster”相关内容的警告后断开连接。
是否可以创建这种设置?我想做的就是避免在 MongoDB 上使用 TLS 并将备份绑定到全局可访问的接口(现场实例将位于防火墙后面,因此 0.0.0.0:1002 将无法公开访问)
无需使用 TLS,即可进行以下设置。
数据中心 1 是主数据中心。所有客户端仅连接到此客户端。数据中心 2 仅用于通过复制进行实时备份。现场也仅用于通过复制进行实时备份。
此设置不适用于故障转移,仅用于灾难恢复。
数据中心1:
MongoDB
mongod --bind_ip 127.0.0.1,172.17.0.1 --replSet test --port 2000 --rest --httpinterface --logpath data/replica/logs/log.txt --dbpath data/replica/wiredTiger --directoryperdb -- storageEnginewiredTiger--wiredTigerDirectoryForIndexes--fork
127.0.0.1 用于 SSH 访问,172.17.0.1 用于从 Docker 容器访问。
SSH 隧道(该服务器负责创建到数据中心 2 的隧道):
autossh -f -N -L 2001:localhost:2001 mongodb@dc-2.example.com
autossh -f -N -R 2000:localhost:2000 mongodb@dc-2.example.com
数据中心2:
MongoDB
mongod --bind_ip 127.0.0.1 --port 2001 --replSet test --rest --httpinterface --logpath data/replica/logs/log.txt --dbpath data/replica/wiredTiger --directoryperdb --storageEnginewiredTiger -- wiredTigerDirectoryForIndexes --fork
现场:
MongoDB
mongod --bind_ip 127.0.0.1 --port 2002 --replSet test --rest --httpinterface --logpath data/replica/logs/log.txt --dbpath data/replica/wiredTiger --directoryperdb --storageEnginewiredTiger -- wiredTigerDirectoryForIndexes --fork
SSH 隧道(On-Site 负责创建到数据中心 1 的隧道,数据中心 2 和 On-Site 之间不存在持久连接)
autossh -f -N -R 2002:localhost:2002 mongodb@dc-1.example.com
autossh -f -N -L 2000:localhost:2000 mongodb@dc-1.example.com
Datacenter 1 中的服务器包含所有要复制的数据,Datacenter 2 和 On-Site 是空数据库。
在数据中心 1 的机器上,我输入mongo --port 2000,然后发出
rs.initiate(
{
_id: "test",
version: 1,
members: [
{ _id: 0, host : "localhost:2000", priority: 1, votes: 1 },
{ _id: 1, host : "localhost:2001", priority: 0, votes: 0, hidden: true },
{ _id: 2, host : "localhost:2002", priority: 0, votes: 0, hidden: true }
]
}
)
Run Code Online (Sandbox Code Playgroud)
我想priority: 0, votes: 0, hidden: true这里的辅助设备是可选的,它可以满足我的要求,只需让两个辅助设备成为静默、不可见的数据收集器以用于备份目的即可。我不确定更改此设置是否会产生任何副作用,因为两个辅助节点之间的连接可能应该可用,但在本例中并非如此(它们无法看到对方)。
我可以slaveDelay在其中一个隐藏成员上使用 a 来使其滞后半天,但由于我将通过 mongodump 从两个隐藏数据库中进行大量备份,因此实际上没有必要。
为了能够通过 mongodb 工具连接到辅助节点,我需要发出rs.slaveOk()
客户端无需进行任何更改,它们连接到172.17.0.1:2000.
我在数据中心 2 中测试了计算机的重新启动,在重新启动期间,我在数据库中插入了新项目,大约 30 秒后,重新启动的计算机按预期同步到数据中心 1。
数据中心 1 有一个快速服务器,有大量 RAM 和 CPU,只有少量 SSD 存储,数据中心 2 有一点 RAM,但有大量 HDD,所以这似乎是一个很好的解决方案。
| 归档时间: |
|
| 查看次数: |
4742 次 |
| 最近记录: |