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" })
相关推荐
蜡笔小炘18 分钟前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长22 分钟前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚1 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设1 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据1 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300962 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
m0_736919102 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
亓才孓2 小时前
[JDBC]PreparedStatement替代Statement
java·数据库
m0_466525292 小时前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
爱学习的阿磊3 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python