mongodb-主从同步-内外网


内网主

外网从

你想要实现的功能是内网的 MongoDB 主实例(Primary)上有数据更新时,能够自动同步到外网的 MongoDB 从实例(Secondary)。这种同步是通过 MongoDB 的复制机制来完成的,通常涉及设置副本集(Replica Set)架构。具体来说,你可以将内网的 MongoDB 配置为主节点,外网的 MongoDB 配置为从节点,并且通过 MongoDB 自带的复制机制来保持数据一致性。

以下是操作流程和实验步骤:

1. 配置 MongoDB 副本集

首先,你需要配置两个 MongoDB 实例作为一个副本集(Replica Set)。主节点(内网 MongoDB)和从节点(外网 MongoDB)会相互同步数据。

a. 创建内网 MongoDB 容器

假设内网 MongoDB 运行在 mongodb_primary 容器中,运行如下命令来启动 MongoDB:

docker run -d --name mongodb_primary \
  -e MONGO_INITDB_ROOT_USERNAME=root \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  -p 27017:27017 \
  mongo --replSet rs0

这里设置了副本集名称为 rs0

b. 创建外网 MongoDB 容器

假设外网 MongoDB 运行在 mongodb_secondary 容器中,运行如下命令来启动 MongoDB:

docker run -d --name mongodb_secondary \
  -e MONGO_INITDB_ROOT_USERNAME=root \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  -p 27018:27017 \
  mongo --replSet rs0

c. 配置副本集

登录到内网 MongoDB 容器并初始化副本集:

docker exec -it mongodb_primary mongo -u root -p password

在 MongoDB shell 中运行以下命令来初始化副本集:

rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "mongodb_primary:27017" },
    { _id: 1, host: "mongodb_secondary:27017" }
  ]
})

d. 启动副本集

外网 MongoDB 会自动连接到内网 MongoDB,作为从节点参与副本集。你可以通过以下命令查看副本集状态:

rs.status()

2. 自动同步数据

MongoDB 副本集的主节点上的所有数据变更(插入、更新、删除)会自动同步到从节点。你无需手动进行数据同步,MongoDB 会负责这一过程。

3. 测试代码

你可以通过以下代码来验证数据是否同步:

a. 向主节点插入数据

docker exec -it mongodb_primary mongo -u root -p password

在 MongoDB shell 中插入一些数据:

use testdb
db.testcollection.insert({ name: "test data", value: 1 })

b. 查看从节点的数据

你可以登录到外网 MongoDB 容器,查看是否同步了数据:

docker exec -it mongodb_secondary mongo -u root -p password
use testdb
db.testcollection.find()

如果数据在从节点上也能看到,说明同步成功。

4. 监控与故障恢复

你可以使用 MongoDB 的监控工具来监控副本集的状态,确保数据同步没有问题。在实际生产环境中,也要做好备份和容错措施。

5. 实验环境测试代码(Python 示例)

如果你需要测试数据同步,下面是一个简单的 Python 示例,使用 pymongo 库连接到 MongoDB 实例,并进行插入操作:

from pymongo import MongoClient

# 连接主节点
client_primary = MongoClient("mongodb://root:password@localhost:27017/")
db_primary = client_primary['testdb']
collection_primary = db_primary['testcollection']

# 向主节点插入数据
collection_primary.insert_one({"name": "test data", "value": 1})

# 连接外网从节点
client_secondary = MongoClient("mongodb://root:password@<external_ip>:27017/")
db_secondary = client_secondary['testdb']
collection_secondary = db_secondary['testcollection']

# 查询从节点数据
for doc in collection_secondary.find():
    print(doc)

执行后,你应该能在从节点看到主节点插入的数据,确认数据已经同步。

如果有更多具体问题,欢迎继续提问!