MongoDB ReplicaSet 部署

前言

本篇文章介绍 MongoDB ReplicaSet 如何搭建,及常用的维护方法。

1. 环境准备

单机 MongoDB 安装部署,可参考 MongoDB 单机部署 文档。

IP Hostname Role
172.16.104.55 172-16-104-55 PRIMARY
172.16.104.56 172-16-104-56 SECONDARY
172.16.104.57 172-16-104-57 SECONDARY
  • CentOS Linux release 7.9.2009 (Core)
  • MongoDB version v4.2.25

配置 /etc/hosts 映射:

172.16.104.57 172-16-104-57
172.16.104.56 172-16-104-56
172.16.104.55 172-16-104-55

2. 生成密钥

通过密钥文件身份验证, mongod 副​​本集中的每个实例都使用密钥文件的内容作为共享密码来对部署中的其他成员进行身份验证。只有 mongod 具有正确密钥文件的实例才能加入副本集。

在主节点生成密钥,可通过下方命令完成:

openssl rand -base64 756 > /data/mongodb/data/keyFile
chmod 400 /data/mongodb/data/keyFile

然后将密钥文件,scp 到其他节点的相同目录下:

scp /data/mongodb/data/keyFile root@172.16.104.56:/data/mongodb/data/keyFile

记得调整文件属组:

chown mongod:mongod /data/mongodb/data/keyFile

3. 配置参数

在原来的配置文件基础上,需要添加如下内容:

security:
  keyFile: <path-to-keyfile>
replication:
  replSetName: <replicaSetName>

keyFile 就是刚才生产密钥的文件路径,replSetName 是集群的名称,3 台实例都需要配置。

# where to write logging data. 
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/mongod.log
# Where and how to store data.
storage:
  dbPath: /data/mongodb/data
  journal:
    enabled: true

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /data/mongodb/run/mongod.pid  # location of pidfile

replication:
  replSetName: myReplSet

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
security: 
  authorization: enabled
  keyFile: /data/mongodb/data/keyFile

配置修改完成后,重启 3 台实例。

4. 创建 ReplicaSet

rs.initiate(
  {
   
    _id : "myReplSet",
    members: [
      {
    _id : 0, host : "172-16-104-55:27017" },
      {
    _id : 1, host : "172-16-104-56:27017" },
      {
    _id : 2, host : "172-16-104-57:27017" }
    ]
  }
)

请添加图片描述

查看 ReplicaSet 状态:

rs.status()

如果集群成员都正常,那 infoMessage 为空。

5. 副本集维护

5.1 新增成员
rs.add("172-16-104-57:27017")

新增节点的数据会自动同步,分为两个阶段 Initial Sync 和 Replication,先通过 init sync 同步全量数据,再通过 replication 不断重放 Primary 上的 oplog 同步增量数据。

另外,当创建副本集节点数比较多的时候,主节点需要每次需要心跳检测来判断自己是否符合 “大多数”。这种情况下,心跳的网络流量和选举所花费的时间都会比较大。为避免这种情况我们可以指定某几个节点具体选举的权利。

rs.add({
   "_id":4,"host":"xx:xx","votes":0})
5.2 移除节点
rs.remove("172-16-104-57:27017")
5.4 主节点降级

将主节点降级为副本节点,触发选举且原主节点不会被选为主。

rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)
  • stepDownSecs:降级主节点的秒数,在此期间该节点不会被选为主节点,默认 60 秒。
  • secondaryCatchUpPeriodSecs:避免主节点降级时,有增量数据未被副本节点接收,等待的时间。
5.5 阻止选举

当一个节点维护的时候,使用下方命令阻止其在一定时间内,不会被选为主节点。

rs.freeze()
5.6 允许副本节点读

副本节点默认不允许执行操作,执行命令会报错 not master and slaveOk=false 可使用下方命令,允许副本节点只读。

rs.secondaryOk()
5.7 延迟观测

可使用下方命令查看备节点延迟:

db.printSecondaryReplicationInfo()

6. 连接副本集

MongoDB 连接串参数,支持指定多个副本集节点,可通过 readPreference 分配读写。
请添加图片描述

后记

推荐阅读:https://www.mongodb.com/docs/manual/reference/method/js-replication/

相关推荐

  1. FastDFS部署

    2023-12-27 18:56:04       43 阅读
  2. 部署zabbix

    2023-12-27 18:56:04       29 阅读
  3. Postgresql部署

    2023-12-27 18:56:04       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-27 18:56:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-27 18:56:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-27 18:56:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-27 18:56:04       18 阅读

热门阅读

  1. MongoDB 字段部分内容替换 SQL整理

    2023-12-27 18:56:04       36 阅读
  2. 12.25力扣

    2023-12-27 18:56:04       43 阅读
  3. HBase 创建不分裂的表 ( 禁止 Table Split )

    2023-12-27 18:56:04       32 阅读
  4. [c]统计数字

    2023-12-27 18:56:04       42 阅读
  5. 发布版本自动化记录版本功能方法

    2023-12-27 18:56:04       36 阅读
  6. 【超图】SuperMap 模型处理自动化方案 ——目录

    2023-12-27 18:56:04       43 阅读
  7. 董事会在线审批决策任务都在哪里进行?

    2023-12-27 18:56:04       37 阅读
  8. 提升认识能力,远离诈骗

    2023-12-27 18:56:04       35 阅读