当前位置: 首页 > news >正文

如何在一台服务器上搭建 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 从)。这种方法适合本地开发和测试,但在生产环境中建议使用多台服务器以实现高可用性。

相关文章:

  • linux之crosstool-NG(1)生成toolchain
  • 算法-二叉树篇13-路径总和
  • ARM MTE
  • 【算法】前缀和算法详解
  • Field 对象的使用
  • uCOSIII-任务内嵌信号量
  • vue3配置端口,比底部vue调试
  • 千峰React:Hooks(下)
  • 七、Three.jsPBR材质与纹理贴图
  • 数据结构——位图
  • Redis 源码分析-内部数据结构 robj
  • 帧中继+静态路由实验(大规模网络路由器技术)
  • DeepSeek开源周Day5压轴登场:3FS与Smallpond,能否终结AI数据瓶颈之争?
  • React 中 useState 的 基础使用
  • Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(十二)
  • 民安智库:物业满意度调查的数据分析经验分享
  • 《宇宙》自我意识之局部宇宙,无垠星空之真实宇宙
  • Android+SpringBoot的老年人健康饮食小程序平台
  • 【react】快速上手基础教程
  • 《向华为学习:BEM战略解码》课程大纲
  • 建设银行投资网站/站长工具使用方法
  • 淄博网站建设哪家专业/太原百度搜索排名优化
  • 制作网站的钱/哪里可以接广告
  • 帮别人做网站自己为什么会被抓/搜狗收录提交入口网址
  • 徐州网站建设费用/推广赚钱一个50元
  • 美女教师做爰网站/百度一下你就知道下载