mongodb Replica Set(副本集) 部署

一、安装mongodb
详情请参考我的另一篇文章:

https://www.cnblogs.com/sunjiwei/articles/18354786


副本集的配置文件用下面这个,每个节点都相同:

cat > /etc/mongod-cnf/mongodb-rs.conf << EOF 
systemLog:
   destination: file
   ###日志存储位置
   path: /opt/software/mongodb/log/mongod.log
   logAppend: true
storage:
   ##journal配置,类似mysql的redo
   journal:
      enabled: true
   ##数据文件存储位置
   dbPath: /opt/software/mongodb/data
   ##是否一个库一个文件夹
   directoryPerDB: true
   ##数据引擎
   engine: wiredTiger
   ##WT引擎配置
   wiredTiger:
      engineConfig:
         ##WT最大使用cache(根据服务器实际情况调节)
         cacheSizeGB: 4
         ##是否将索引也按数据库名单独存储
         directoryForIndexes: true

##端口配置
net:
   port: 27017
   bindIpAll: true
processManagement:
   fork: true
   pidFilePath: /opt/software/mongodb/data/mongod.pid
   
##副本集配置
replication:
   ##oplog大小
   oplogSizeMB: 2048
   ##复制集名称
   replSetName: rs01

# 此处第一次要把安全参数注释掉,在初始化集群并设置好管理员用户后再开启安全验证然后重启mongodb
#security:
#    authorization: enabled
#    clusterAuthMode: keyFile
#    keyFile: /opt/software/mongodb/data/keyFile/mongo.key
##服务器参数配置    
#setParameter:
#	<parameter1>: <value1>
EOF


配置keyfile文件:

# 副本集各个节点之间内部身份验证需要用到keyFile,所以副本集的安装比单节点安装多了这一步
mkdir -p /opt/software/mongodb/data/keyFile

cat > /opt/software/mongodb/data/keyFile/mongo.key << EOF 
mongodbrs01 
EOF       

chmod 600 /opt/software/mongodb/data/keyFile/mongo.key
<details>


配置时间同步服务器NTP
强烈建议配置时间同步服务器保持所有节点时间一致性

1、安装ntp
yum install -y ntp

2、修改ntp配置文件
vim /etc/ntp.conf
# 下面这个配置意思是192.168.160的网段的机器都参与ntp的时间同步,或者给注释掉也行
restrict 192.168.160.0 mask 255.255.255.0 nomodify notrap

# ntp.conf中有默认的时间服务器,注销掉,然后添加上我们对应的时区时间服务器,我这里用的阿里云时间服务器,也可以公司自己内部的时间服务器如果有的话。
server ntp1.aliyun.com
server ntp2.aliyun.com
server ntp3.aliyun.com

3、手动做时间同步
ntpdate -u ntp1.aliyun.com

注意:要等这一步时间同步完成才能做下一步,可以用ntpstat 命令查看时间是否同步完成,一般第一次同步需要几分钟时间

4、时间同步完成后,就可以启动ntp服务了,命令如下:
systemctl start ntpd
systemctl status ntpd
systemctl enable ntpd


启动mongodb

# 注意这里启动即可,不要设置管理员账号并重启,初始化集群之后再设置账号修改配置文件然后逐个重启每个节点
 mongod -f /etc/mongod-cnf/mongodb.conf


二、初始化集群

1、选择一个节点,执行以下命令进行初始化操作

# 注意,priority为权重,权重高的节点更有可能当选为主节点,priority 的值可为介于 01000 之间的任意浮点数。priority 字段的默认值为 1。也可不设置权重,则默认所有节点都为1,第一次初始化时如果没有设置权重,则在哪个节点进行的初始化,则该节点即为主节点
rs.initiate(
{_id:"rs01", 
members:[
{_id:0, host:"192.168.167.160:27018",priority:100}, 
{_id:1, host:"192.168.167.161:27018",priority:1}, 
{_id:2, host:"192.168.167.162:27018",priority:1}
]})

# 查看集群状态,集群初始化成功后使用下面的命令可以查看状态
 rs.status()

# 结果如下
{
  set: 'rs01',
  date: ISODate('2024-08-13T03:36:04.337Z'),
  myState: 1,
  term: Long('1'),
  syncSourceHost: '',
  syncSourceId: -1,
  heartbeatIntervalMillis: Long('2000'),
  majorityVoteCount: 2,
  writeMajorityCount: 2,
  votingMembersCount: 3,
  writableVotingMembersCount: 3,
  optimes: {
    lastCommittedOpTime: { ts: Timestamp({ t: 1723520162, i: 6 }), t: Long('1') },
    lastCommittedWallTime: ISODate('2024-08-13T03:36:02.954Z'),
    readConcernMajorityOpTime: { ts: Timestamp({ t: 1723520162, i: 6 }), t: Long('1') },
    appliedOpTime: { ts: Timestamp({ t: 1723520162, i: 6 }), t: Long('1') },
    durableOpTime: { ts: Timestamp({ t: 1723520162, i: 6 }), t: Long('1') },
    lastAppliedWallTime: ISODate('2024-08-13T03:36:02.954Z'),
    lastDurableWallTime: ISODate('2024-08-13T03:36:02.954Z')
  },
  lastStableRecoveryTimestamp: Timestamp({ t: 1723520151, i: 1 }),
  electionCandidateMetrics: {
    lastElectionReason: 'electionTimeout',
    lastElectionDate: ISODate('2024-08-13T03:36:01.865Z'),
    electionTerm: Long('1'),
    lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1723520151, i: 1 }), t: Long('-1') },
    lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1723520151, i: 1 }), t: Long('-1') },
    numVotesNeeded: 2,
    priorityAtElection: 1,
    electionTimeoutMillis: Long('10000'),
    numCatchUpOps: Long('0'),
    newTermStartDate: ISODate('2024-08-13T03:36:01.925Z'),
    wMajorityWriteAvailabilityDate: ISODate('2024-08-13T03:36:02.855Z')
  },
  members: [
    {
      _id: 0,
      name: '192.168.167.160:27018',
      health: 1,
      state: 1,
      stateStr: 'PRIMARY',
      uptime: 131,
      optime: { ts: Timestamp({ t: 1723520162, i: 6 }), t: Long('1') },
      optimeDate: ISODate('2024-08-13T03:36:02.000Z'),
      lastAppliedWallTime: ISODate('2024-08-13T03:36:02.954Z'),
      lastDurableWallTime: ISODate('2024-08-13T03:36:02.954Z'),
      syncSourceHost: '',
      syncSourceId: -1,
      infoMessage: '',
      electionTime: Timestamp({ t: 1723520161, i: 1 }),
      electionDate: ISODate('2024-08-13T03:36:01.000Z'),
      configVersion: 1,
      configTerm: 1,
      self: true,
      lastHeartbeatMessage: ''
    },
    {
      _id: 1,
      name: '192.168.167.161:27018',
      health: 1,
      state: 2,
      stateStr: 'SECONDARY',
      uptime: 13,
      optime: { ts: Timestamp({ t: 1723520162, i: 6 }), t: Long('1') },
      optimeDurable: { ts: Timestamp({ t: 1723520162, i: 6 }), t: Long('1') },
      optimeDate: ISODate('2024-08-13T03:36:02.000Z'),
      optimeDurableDate: ISODate('2024-08-13T03:36:02.000Z'),
      lastAppliedWallTime: ISODate('2024-08-13T03:36:02.954Z'),
      lastDurableWallTime: ISODate('2024-08-13T03:36:02.954Z'),
      lastHeartbeat: ISODate('2024-08-13T03:36:03.884Z'),
      lastHeartbeatRecv: ISODate('2024-08-13T03:36:02.890Z'),
      pingMs: Long('1'),
      lastHeartbeatMessage: '',
      syncSourceHost: '192.168.167.160:27018',
      syncSourceId: 0,
      infoMessage: '',
      configVersion: 1,
      configTerm: 1
    },
    {
      _id: 2,
      name: '192.168.167.162:27018',
      health: 1,
      state: 2,
      stateStr: 'SECONDARY',
      uptime: 13,
      optime: { ts: Timestamp({ t: 1723520162, i: 6 }), t: Long('1') },
      optimeDurable: { ts: Timestamp({ t: 1723520162, i: 6 }), t: Long('1') },
      optimeDate: ISODate('2024-08-13T03:36:02.000Z'),
      optimeDurableDate: ISODate('2024-08-13T03:36:02.000Z'),
      lastAppliedWallTime: ISODate('2024-08-13T03:36:02.954Z'),
      lastDurableWallTime: ISODate('2024-08-13T03:36:02.954Z'),
      lastHeartbeat: ISODate('2024-08-13T03:36:03.883Z'),
      lastHeartbeatRecv: ISODate('2024-08-13T03:36:02.892Z'),
      pingMs: Long('0'),
      lastHeartbeatMessage: '',
      syncSourceHost: '192.168.167.160:27018',
      syncSourceId: 0,
      infoMessage: '',
      configVersion: 1,
      configTerm: 1
    }
  ],
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1723520162, i: 6 }),
    signature: {
      hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
      keyId: Long('0')
    }
  },
  operationTime: Timestamp({ t: 1723520162, i: 6 })
}

2、修改配置文件开启身份验证

# 在主节点创建管理员账号
use admin
db.createUser({user: "root",pwd: "1111111",roles: ['root']})

# 这个地方在设置好管理员账号后,要放开注释,然后重启mongodb,所有节点都做
security:
    authorization: enabled  
    clusterAuthMode: keyFile
    keyFile: /opt/software/mongodb/data/keyFile/mongo.key

# 配置文件修改好后,重启mongodb
# 关闭mongodb
/opt/software/mongodb27018/mongodb-6.0.16/bin/mongod --shutdown --dbpath  /opt/software/mongodb/data

# 启动mongodb
/opt/software/mongodb27018/mongodb-6.0.16/bin/mongod -f /etc/mongod-cnf/mongodb-rs.conf 


至此,mongodb副本集部署成功

posted @   有形无形  阅读(6)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示