如何在一台服务器上搭建 mongodb副本集1主2从节点
在一台服务器上搭建 MongoDB 副本集(1 主节点 + 2 从节点)可以通过运行多个 MongoDB 实例并使用不同端口和数据目录来实现。以下是详细步骤:
1. 准备工作
- 确保已安装 MongoDB。
- 为每个实例创建独立的数据目录和日志文件。
2. 创建数据目录和日志文件
为每个节点创建独立的数据目录和日志文件。
mkdir -p /data/db{1,2,3}
touch /var/log/mongodb{1,2,3}.log
chmod 777 /var/log/mongodb{1,2,3}.log
演示
3. 配置 MongoDB 实例
为每个实例创建独立的配置文件。
主节点配置文件 (mongod1.conf
):
storage:
dbPath: /data/db1
systemLog:
destination: file
path: /var/log/mongodb1.log
logAppend: true
net:
bindIp: 127.0.0.1
port: 27017
replication:
replSetName: rs0
processManagement:
fork: true
演示如下
systemLog:
destination: file
path: "/usr/local/mongodb/logs/mongodb.log"
logAppend: true
storage:
dbPath: "/usr/local/mongodb/data"
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 2
journal:
commitIntervalMs: 100
net:
port: 27017
bindIp: "0.0.0.0"
replication:
replSetName: rs0
processManagement:
fork: true
从节点 1 配置文件 (mongod2.conf
):
storage:
dbPath: /data/db2
systemLog:
destination: file
path: /var/log/mongodb2.log
logAppend: true
net:
bindIp: 127.0.0.1
port: 27018
replication:
replSetName: rs0
processManagement:
fork: true
演示如下
systemLog:
destination: file
path: "/usr/local/mongodb/logs2/mongodb.log"
logAppend: true
storage:
dbPath: "/usr/local/mongodb/data2"
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 2
journal:
commitIntervalMs: 100
net:
port: 27018
bindIp: "0.0.0.0"
replication:
replSetName: rs0
processManagement:
fork: true
从节点 2 配置文件 (mongod3.conf
):
storage:
dbPath: /data/db3
systemLog:
destination: file
path: /var/log/mongodb3.log
logAppend: true
net:
bindIp: 127.0.0.1
port: 27019
replication:
replSetName: rs0
processManagement:
fork: true
演示如下
systemLog:
destination: file
path: "/usr/local/mongodb/logs3/mongodb.log"
logAppend: true
storage:
dbPath: "/usr/local/mongodb/data3"
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 2
journal:
commitIntervalMs: 100
net:
port: 27019
bindIp: "0.0.0.0"
replication:
replSetName: rs0
processManagement:
fork: true
4. 启动 MongoDB 实例
使用配置文件启动三个 MongoDB 实例。
mongod -f /path/to/mongod1.conf
mongod -f /path/to/mongod2.conf
mongod -f /path/to/mongod3.conf
演示如下
#启动
mongod --config /usr/local/mongodb/etc/mongod.conf --fork #后台进程运行
mongod --config /usr/local/mongodb/etc2/mongod.conf --fork #后台进程运行
mongod --config /usr/local/mongodb/etc3/mongod.conf --fork #后台进程运行
#关闭
mongod --shutdown -f /usr/local/mongodb/etc/mongod.conf
mongod --shutdown -f /usr/local/mongodb/etc2/mongod.conf
mongod --shutdown -f /usr/local/mongodb/etc3/mongod.conf
启动效果如下
5. 初始化副本集
连接到主节点(27017
端口),初始化副本集。
mongo --port 27017
演示如下
mongosh "mongodb://localhost:27017"
在 MongoDB Shell 中执行:
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "127.0.0.1:27017" },
{ _id: 1, host: "127.0.0.1:27018" },
{ _id: 2, host: "127.0.0.1:27019" }
]
})
演示如下
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "127.0.0.1:27017" },
{ _id: 1, host: "127.0.0.1:27018" },
{ _id: 2, host: "127.0.0.1:27019" }
]
})
执行效果如下
6. 检查副本集状态
初始化后,检查副本集状态。
rs.status()
输出应显示 1 个 PRIMARY
和 2 个 SECONDARY
节点。
演示如下
7. 验证数据同步
在主节点插入数据,检查从节点是否同步。
主节点插入数据:
use testdb
db.testcollection.insert({ name: "example" })
从节点查询数据:
mongo --port 27018
演示如下
mongosh "mongodb://localhost:27018"
在 MongoDB Shell 中执行:
rs.secondaryOk() # 允许从节点读取 mongodb 7
db.testcollection.find()
说明:
rs.secondaryOk()
允许当前会话从次要节点读取数据。- 如果你希望所有会话都默认允许从次要节点读取数据,可以在连接字符串中添加
readPreference=secondary
参数。
连接字符串示例
mongodb://host1:27017,host2:27017,host3:27017/myDatabase?readPreference=secondary
通过这种方式,你可以确保应用程序从次要节点读取数据,从而分担主节点的负载。
8. 停止和清理
如果需要停止副本集,可以使用以下命令:
mongod --dbpath /data/db1 --shutdown
mongod --dbpath /data/db2 --shutdown
mongod --dbpath /data/db3 --shutdown
清理数据目录和日志文件:
rm -rf /data/db{1,2,3}
rm -f /var/log/mongodb{1,2,3}.log
总结
通过以上步骤,您可以在单台服务器上成功搭建一个 MongoDB 副本集(1 主 2 从)。这种方法适合本地开发和测试,但在生产环境中建议使用多台服务器以实现高可用性。