MongoDB副本集

1. 副本集介绍

官方文档:https://docs.mongodb.com/manual/replication/

MongoDB中的副本集(Replica Set)是一组维护相同数据集的mongod服务。 副本集可提供冗余和高可用性,是所有生产部署的基础

副本集类似于有自动故障恢复功能的主从集群。通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,并且当主库当掉时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载

1)冗余和数据可用性

通过在不同数据库服务器上提供多个数据副本,复制可提供一定级别的容错功能,以防止丢失数据。在某些情况下,复制可以增加读取性能,因为客户端可以将读取操作发送到不同的服务上, 在不同数据中心维护数据副本可以增加分布式应用程序的数据位置和可用性。 您还可以为专用目的维护其他副本,例如灾难恢复,报告或备份

2)MongoDB中的复制

副本集是一组维护相同数据集的mongod实例。 副本集包含多个数据承载节点和可选的一个仲裁节点。在承载数据的节点中,一个且仅一个成员被视为主节点,而其他节点被视为次要(从)节点。主节点接收所有写操作

辅助(副本)节点复制主节点的oplog并将操作应用于其数据集,以使辅助节点的数据集反映主节点的数据集。 如果primary不在,则符合条件的secondary将举行选举以选出新的主节点

3)主从复制和副本集区别

主从集群和副本集最大的区别就是副本集没有固定的"主节点";整个集群会选出一个"主节点",当其挂掉后,又在剩下的从节点中选中其他节点为"主节点",副本集总有一个活跃点(主、primary)和一个或多个备份节点(从、secondary)

4)副本集主要有三种角色:

  • primary(主节点):主要接收所有写操作,主节点
  • secondary(从节点):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置),是默认的一种从节点类型
  • arbiter(仲裁者):不保留任何数据的副本,只具有投票选举作用,当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者,也是一种从节点类型

关于仲裁者的说明:

1、仲裁者不维护数据集。 仲裁者的目的是通过响应其他副本集成员的心跳和选举请求来维护副本集中的仲裁

2、如果你的副本+主节点的个数是偶数,建议加一个仲裁者,形成奇数,容易满足大多数的投票。

3、如果你的副本+主节点的个数是奇数,可以不加仲裁者

2. 服务器规划

IP地址 端口 角色
10.0.0.107 27017 primary
10.0.0.108 27017 secondary
10.0.0.109 27017 secondary
路径 说明
/data/mongod/conf 配置文件目录
/data/mongod/data 数据目录
/data/mongod/logs 日志目录
/data/mongod/pid 进程文件目录
/data/mongod/key key目录

3. 副本集搭建步骤

3.1 所有节点安装mongoDB并配置

操作步骤参照MongoDB单机安装

3.2 编辑配置文件

yaml 复制代码
# 所有节点编辑配置文件
[root@MongoDB-07 ~]# vim /data/mongod/conf/mongod.conf
systemLog:
  destination: file
  path: "/data/mongod/logs/mongod.log"
  logAppend: true
storage:
  dbPath: "/data/mongod/data"
  directoryPerDB: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1  #50%(RAM-1 GB)
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zstd 
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
  pidFilePath: /data/mongod/pid/mongod.pid
net:
  bindIp: 0.0.0.0
  port: 27017
  maxIncomingConnections: 10240
operationProfiling:
  slowOpThresholdMs: 100
  mode: off
security:
  authorization: enabled
  keyFile: /data/mongod/key/keyfile
replication:
  oplogSizeMB: 8192    
  replSetName: shard03

3.3 编辑内部身份验证文件

除了验证客户端的身份之外,MongoDB能要求副本集和分片集群的成员对其各自的副本集或者分片集群的成员资格进行身份验证。

bash 复制代码
# 在第一个节点创建身份验证key文件
[root@MongoDB-07 ~]# openssl rand -base64 756 > /data/mongod/key/keyfile
[root@MongoDB-07 ~]# chmod 600 /mongodb/key/keyfile
# 将可以文件传输到其他节点
[root@MongoDB-07 ~]# scp /mongodb/key/keyfile 10.0.0.108:/data/mongod/key/
[root@MongoDB-07 ~]# scp /mongodb/key/keyfile 10.0.0.109:/data/mongod/key/
# 所有节点修改目录权限
[root@MongoDB-07 ~]# chown -R mongodb.mongodb /data/mongod
[root@MongoDB-08 ~]# chown -R mongodb.mongodb /data/mongod
[root@MongoDB-09 ~]# chown -R mongodb.mongodb /data/mongod

3.4 启动MongDB服务

bash 复制代码
# 所有节点启动mongod服务
[root@MongoDB-07 ~]# systemctl start mongod
[root@MongoDB-08 ~]# systemctl start mongod
[root@MongoDB-09 ~]# systemctl start mongod

3.5 副本集构建

bash 复制代码
(1)连接到第一个节点
[root@MongoDB-07 ~]# mongosh --port=27017


(2)编辑副本集信息
config = {
    _id: 'shard03', 
    members: [
    {_id: 1, host: '10.0.0.37:27017'},
    {_id: 2, host: '10.0.0.38:27017'},
    {_id: 3, host: '10.0.0.39:27017'}
    ]
}

(3)初始化复制集
rs.initiate(config) 

3.6 创建root用户

bash 复制代码
# 在主节点创建root用户
use admin

db.createUser({
    user: "root",
    pwd: "123",
    roles: [ { role: "root", db: "admin" } ]
})

验证root用户登录

bash 复制代码
mongosh 127.0.0.1:27017/admin  -u root -p 123

mongosh --host=127.0.0.1 --username=root --password=123 --port=27017 --authenticationDatabase=admin
#登录后再验证
mongosh 127.0.0.1:27017/admin
shard03 [direct: primary] admin> db.auth("root","123")

5. 查看副本集的状态

json 复制代码
rs.status()

副本集配置的查看命令,本质是查询的是 local库中 system.replset 表中的数据

json 复制代码
shard03 [direct: primary] admin> use local
switched to db local
shard03 [direct: primary] local> db.system.replset.find()

7. 常用操作

更多详细信息查看官方文档中关于副本集的指令https://docs.mongoing.com/replication/replication-reference

json 复制代码
#(1)配置文件方式初始化集群
config = {
    _id: 'shard03', 
    members: [
    {_id: 1, host: '10.0.0.37:27017'},
    {_id: 2, host: '10.0.0.38:27017'},
    {_id: 3, host: '10.0.0.39:27017'}
    ]
}
rs.initiate(config) 

#(2)添加新节点
rs.add("10.0.0.102:27017")

#(3)删除节点
rs.remove("10.0.0.103:27017")

#(4)查看副本集配置
rs.conf()

#(5)查看副本集状态
rs.status()

#(6)查看集群所有节点,与主节点信息
rs.isMaster()

#(7)查看从库延时
rs.printSecondaryReplicationInfo() #低版本使用rs.printSlaveReplicationInfo()

#(8)查看oplog信息
rs.printReplicationInfo()

#(9)指定节点升为主节点
cfg = rs.conf()
cfg.members[1].priority = 1
cfg.members[2].priority = 0.5
cfg.members[3].priority = 0.5
rs.reconfig(cfg)

#(10)主节点执行,触发failover
rs.stepDown()

#(11)查看oplog大小
use local
db.oplog.rs.stats().maxSize

#(12)调整oplog大小,单位mb
db.adminCommand({replSetResizeOplog: 1, size: 2048})

#(13)当缩小oplog后,磁盘空间不会被回收,需要执行compact操作,操作期间复制停止,需要在窗口期业务停写后执行
use local
db.runCommand({ "compact" : "oplog.rs" })
相关推荐
大模型玩家七七12 分钟前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草14 分钟前
redis-9-哨兵
数据库·redis·bootstrap
space621232718 分钟前
在SpringBoot项目中集成MongoDB
spring boot·后端·mongodb
明哥说编程19 分钟前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速
xiaowu08029 分钟前
C# 拆解 “显式接口实现 + 子类强类型扩展” 的设计思想
数据库·oracle
讯方洋哥43 分钟前
HarmonyOS App开发——关系型数据库应用App开发
数据库·harmonyos
惊讶的猫1 小时前
Redis持久化介绍
数据库·redis·缓存
Apple_羊先森2 小时前
ORACLE数据库巡检SQL脚本--19、磁盘读次数最高的前5条SQL语句
数据库·sql·oracle
全栈前端老曹2 小时前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
神梦流2 小时前
ops-math 算子库的扩展能力:高精度与复数运算的硬件映射策略
服务器·数据库