mongodb Replica Set (复制集)

一、mongodb复制集简介

1. 复制集的基本概念

  • 定义: 复制集是由多个 MongoDB 实例(节点)组成的一个集群,这些节点协同工作以维护数据的复制和高可用性。
  • 节点类型:
    • 主节点(Primary): 负责处理所有的写操作和大多数读操作。主节点是复制集中的唯一写入节点。
    • 副本节点(Secondary): 这些节点复制主节点的数据,并处理读操作(如果配置了相应的读取偏好)。副本节点是从节点,它们从主节点拉取数据以保持同步。
    • 仲裁节点(Arbiter): 不保存数据,但参与选举过程。用于在主节点发生故障时帮助进行选举,确保复制集保持一个有效的主节点。

2. 数据同步

  • 同步过程: 副本节点通过复制主节点的操作日志(Oplog)来同步数据。主节点将所有操作记录到 Oplog 中,副本节点从 Oplog 中读取并应用这些操作以保持数据一致性。
  • 延迟: 副本节点可能会有轻微的同步延迟,取决于网络状况和负载。

3. 故障转移

  • 自动选举: 如果主节点发生故障,复制集会自动进行选举,选举出一个新的主节点。这个过程是自动进行的,以确保系统的高可用性。
  • 读写操作: 一旦新的主节点被选举出来,客户端会重新连接到新的主节点。应用程序应该能够处理这种变化,通常可以通过设置适当的读取偏好来帮助平衡读操作。

 二、配置复制集(多实例方式)

1. 创建数据目录

mkdir -p /mongodb/28017/{conf,data,log}
mkdir -p /mongodb/28018/{conf,data,log}
mkdir -p /mongodb/28019/{conf,data,log}
mkdir -p /mongodb/28020/{conf,data,log}

2. 配置文件写入

cat > /mongodb/28017/conf/mongod.conf << EOF
systemLog:
  destination: file
  path: /mongodb/28017/log/mongod.log  
  logAppend: true
storage:
  dbPath: /mongodb/28017/data
  journal:
    enabled: true
  directoryPerDB: true
  #engineConfig: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
  port: 28017
  bindIp: 0.0.0.0 
# 复制集配置
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
EOF

cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/
cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/
cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/

sed -i 's#28017#28018#g' /mongodb/28018/conf/mongod.conf
sed -i 's#28017#28019#g' /mongodb/28019/conf/mongod.conf
sed -i 's#28017#28020#g' /mongodb/28020/conf/mongod.conf

3. 启动实例

mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf

4. 配置副本集

(1)连接到28017示例

mongo --port 28017

(2)切换到admin库

use admin

(3)初始化复制集

rs.initiate({
  _id: "my_repl",
  members: [
    { _id: 0, host: "192.168.44.191:28017" },
    { _id: 1, host: "192.168.44.191:28018" },
    { _id: 2, host: "192.168.44.191:28019" }
  ]
})

(4)查看复制集状态

rs.status

若返回如上图这样信息(截图不全),则复制集配置成功 

 (5)配置从节点可读

# Secondary节点执行
rs.slaveOk()

(6)测试复制集功能

①在主库的test库下,在testtable表中写入一条数据

use test

db.testtable.insertOne({"name": "小王"})

②在从库开启可读权限

注意:从库默认不支持增删改查操作,需要给从库赋予读操作

# 从库执行
rs.slaveOk()

③查看是否复制成功

# 切换到test库
use test

# 查看test库下所有的表
show tables

# 查看testtable表中的数据
db.testtable.find()

若为上图,则同步功能正常 

三、复制集常用操作

1. 常用命令

--查看副本集配置信息:rs.conf()
--查看副本集各成员的状态:rs.status()
--副本集角色切换(不要认为切换,有风险):rs.stepDown()  # 单位为秒
--锁定副本集从节点,使其不会成为主节点:rs.freeze(300)  # 单位为秒
--设置主从复制集群的从节点可读:rs.slaveOk()

2. 新增和删除节点

--新增从节点:rs.add("ip:port");

--新增仲裁节点:rs.addArb("ip:port"); 

--删除节点:rs.remove("ip:port"); 

3. 特殊从节点配置

(1)配置延时节点

①参数介绍:

        priority:优先级(参数:0-1000),优先级值越大,优先成为主节点;优先级值为0,无法成为主节点

        slaveDelay:延迟(单位:秒),复制n秒之前的数据,与主节点保持时间差

        hidden:隐藏(值:ture,false),可以复制数据,但对应用不可见,具有投票权,但优先级必须为0

        votes:投票数(一般情况,值为:0或1),此处为0,表示不参与投票

②将复制集中下标索引为3的节点配置为延时节点,延时120秒

cfg=rs.conf()
cfg.members[3].priority=0
cfg.members[3].slaveDelay=120
cfg.members[3].hidden=false
cfg.members[3].votes=0
rs.reconfig(cfg)

 ③将复制集中下标索引为3的节点恢复为默认从节点

cfg=rs.conf()
cfg.members[3].priority=1
cfg.members[3].slaveDelay=0
cfg.members[3].hidden=false
cfg.members[3].votes=1
rs.reconfig(cfg)

(2)配置仲裁节点

①参数介绍:

        arbiterOnly:仲裁权限(值:ture,false),此处为true,表示将下标索引为3的节点设置为仲裁节点

        buildIndexes:构建索引(值:ture,false),此处为false,通常用于仲裁节点,值参与投票,不进行复制

        priority:优先级(参数:0-1000),此处为0,这确保该节点不会被选为主节点。仲裁节点一般设为优先级0。

        slaveDelay:延迟(单位:秒),因为仲裁节点不存储数据,此配置对它没有实际影响。

        hidden:隐藏(值:ture,false),隐藏节点不会出现在复制集的视图中,但仲裁节点通常是可见的。

        votes:投票数(一般情况,值为:0或1),此处为1,尽管它是仲裁节点,但它仍然参与选举并提供投票。

②将复制集中下标索引为3的节点配置为仲裁节点

cfg=rs.conf()
cfg.members[3].arbiterOnly=true
cfg.members[3].buildIndexes=false
cfg.members[3].priority=0
cfg.members[3].slaveDelay=0
cfg.members[3].hidden=false
cfg.members[3].votes=1
rs.reconfig(cfg)

③将复制集中下标索引为3的节点恢复为默认复制节点

        注意:arbiter节点不能直接恢复为默认复制节点,只能remove之后再add

rs.remove("192.168.44.190:28020")   
rs.add("192.168.44.190:28020")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值