内网主
外网从
你想要实现的功能是内网的 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)
执行后,你应该能在从节点看到主节点插入的数据,确认数据已经同步。
如果有更多具体问题,欢迎继续提问!