当前位置: 首页 > news >正文

mongodb主从

1 数据库服务复制集概述

MongoDB复制集(replication Set)的主要意义在于实现服务高可用,它的实现依赖于两个方面的功能

  • 数据写入时将数据迅速复制到另一个独立节点上
  • 在接受写入的节点发生故障时自动选举出一个新的替代节点

在实现高可用的同时,复制集实现了其他几个附加功能:

  • 数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
  • 读写分离:不同类型的压力分别在不同的节点上执行
  • 异地容灾:在数据中心故障时候快速切换到异地

一个典型的复制集由3个以上具有投票权的节点组成:(PSS PSA-建议5节点)

  • 一个主节点(primary):接收写入操作和选举时投票;
  • 两个或多个从节点(secondary):复制主节点上的新数据和选举时投票
  • Arbiter(投票节点),建议5节点架构时应用
    • arbiterOnly 是 MongoDB 中复制集配置的一部分,用于指定一个节点作为 仲裁者(Arbiter),而不是数据的存储或提供数据的副本
    • 设置某个节点为仲裁者节点时,MongoDB 会忽略该节点的数据存储功能,只将其作为选举的一部分来参与复制集的故障转移
    • 仲裁者节点不占用数据存储空间,因此在需要保证复制集多数节点数的情况下,可以使用仲裁者节点来降低资源开销

在这里插入图片描述

复制集节点之间的数据复制:

  • 当一个修改操作发生,无论是插入、更新或删除,到达主节点时,它对数据的操作将被记录下来(经过一些必要的转换);

    这些记录称为oplog

  • 从节点通过在主节点上打开一个tailable游标不断获取新进入主节点的oplog,并在自己的数据库上回放,以此保证更主节点数据一致

在这里插入图片描述

2 配置主从复制

01 创建数据库实例

实例监听端口存放目录
实例128017/mongodb/28017
实例228018/mongodb/28018
实例328019/mongodb/28019
实例428020/mongodb/28020

1.创建实例目录:

mkdir -pv /mongodb/{28017..28020}/{conf,data,log}

# tree命令查看目录结构
tree -F /mongodb/
/mongodb//
├── 28017/
│   ├── conf/
│   ├── data/
│   └── log/
├── 28018/
│   ├── conf/
│   ├── data/
│   └── log/
├── 28019/
│   ├── conf/
│   ├── data/
│   └── log/
└── 28020/
    ├── conf/
    ├── data/
    └── log/

2.创建配置文件

cat > /mongodb/28017/conf/mongodb.yaml <<'EOF'
systemLog:
  destination: file
  path: "/mongodb/28017/log/mongodb.log"
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: "/mongodb/28017/data"
  directoryPerDB: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
  port: 28017
  bindIp: 10.0.0.51,127.0.0.1
replication:
  # 定义oplog日志存储量,实质是数据库服务的表的大小
  oplogSizeMB: 2048
  # 表示复制集的名称,要和后面创建的集群名称一致
  replSetName: my_repl
EOF

3.把配置文件复制到其他实例目录下,修改端口信息。编写systemd

for i in {28018..28020}; do \cp /mongodb/28017/conf/mongodb.yaml /mongodb/$i/conf; done
for i in {28018..28020}; do sed -i "s#28017#$i#g" /mongodb/$i/conf/mongodb.yaml; done
cat > /etc/systemd/system/mongod28017.service <<EOF
[Unit]
Description=MongoDB Database Server
After=network.target

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/local/mongodb/bin/mongod -f /mongodb/28017/conf/mongodb.yaml
Type=forking
Restart=on-failure
LimitNOFILE=65535
TimeoutStopSec=5
PermissionsStartOnly=true
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target
EOF
cd /etc/systemd/system

for i in {28018..28020}; do \cp mongod28017.service mongod$i.service; done
for i in {28018..28020}; do sed -i "s#28017#$i#g" mongod$i.service; done

systemctl daemon-reload
for i in {28017..28020}; do systemctl start mongod$i; done
for i in {28017..28020}; do systemctl status mongod$i; done

在这里插入图片描述

02 设置主从复制

  • 主从关系建立完毕后,会实现底层自动克隆过程,不用考虑备份恢复数据问题
  • 对于secondary节点是默认不支持任何读和写操作的,后期可以打开节点的读功能

1.连接主库18017实例

[root@db51~]# mongo --port 28017 admin

# 执行以下配置,设置复制集
config = {
    _id: 'my_repl',
    members: [
        { _id: 0, host: '10.0.0.51:28017' },
        { _id: 1, host: '10.0.0.51:28018' },
        { _id: 2, host: '10.0.0.51:28019' }
    ]
}

# 启动复制集
> rs.initiate(config)
{ "ok" : 1 }

my_repl:SECONDARY> show databases;
admin   0.000GB
config  0.000GB
local   0.000GB

2.查看复制集的状态

rs.status();

03 查看其他节点的同步状态

1.在主节点上创建一个集合

use wzy;
db.createCollection("a")

2.登录其他节点查看


04 仲裁节点

1.在主节点把28019实例改为arbiterOnly。不建议进行应用,当只有三个节点时,会有一定的风险性

config = {
  _id: 'my_repl',
  members: [
    { _id: 0, host: '10.0.0.0.51:28017' },
    { _id: 1, host: '10.0.0.0.51:28018' },
    { _id: 2, host: '10.0.0.0.51:28019', arbiterOnly: true }
  ]
}

2.查看集群状态


# 查看主节点状态
rs.isMaster()

# 查看配置
rs.conf();

在这里插入图片描述

05 添加删除节点

节点停止之前先停止从节点可以避免数据不一致

# 增加/移除节点
rs.add("10.0.0.51:28020")
rs.remove("10.0.0.51:28020")

# 添加仲裁节点
rs.addArb("10.0.0.0.51:28020")

# 移除仲裁节点
rs.remove("10.0.0.0.51:28020")

06 秘钥认证

1.生成和分发秘钥

openssl rand -base64 756 >/mongodb/28017/conf/keyfile
chmod 600 /mongodb/28017/conf/keyfile && chown mongodb.mongodb -R /mongodb
for i in {28018..28020}; do \cp -a /mongodb/28017/conf/keyfile /mongodb/$i/conf/keyfile; done

2.所有节点增加验证功能

for i in {28017..28020}; do
  cat >> /mongodb/$i/conf/mongodb.yaml <<EOF
security:
  keyFile: /mongodb/$i/conf/keyfile
EOF
done

3.重启所有节点后生效

for i in {28017..28020}; do systemctl start mongod$i; done
ongodb/$i/conf/keyfile; done

2.所有节点增加验证功能

for i in {28017..28020}; do
  cat >> /mongodb/$i/conf/mongodb.yaml <<EOF
security:
  keyFile: /mongodb/$i/conf/keyfile
EOF
done

3.重启所有节点后生效

for i in {28017..28020}; do systemctl start mongod$i; done

相关文章:

  • Linux软件编程——标准IO(2025.2.14)
  • 数据库学习 第一次练习
  • 2025.2.15——1400
  • 如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题
  • 哈希算法题
  • P9853 [入门赛 #17] 方程求解
  • 正点原子ESP32S3系列开发板全面支持小智AI
  • LDO技术:线性调整率与负载调整率全解析
  • Maven打包保留参数名称
  • 数据库设计流程范式
  • SQL Server:查看当前连接数和最大连接数
  • 基于单片机的多功能热水器设计(论文+源码)
  • JavaScript中Map和Set数据结构详解
  • 基于深度学习的消费物联网中安全音乐流量传输方法
  • 【Redis系列】Redis安装与使用
  • 负载均衡集群——LVS-DR配置
  • 区块链账户的概念与安全管理
  • 在nodejs中使用RabbitMQ(七)实现生产者确认
  • SCI学术论文图片怎么免费绘制:drawio,gitmind
  • ES 与 MySQL 数据同步:深入解析与实战拓展
  • 湖北宜昌:在青山绿水间解锁乡村振兴“密码”
  • 习近平会见塞尔维亚总统武契奇
  • 19个剧团15台演出,上海民营院团尝试文旅融合新探索
  • 央行:下阶段将实施好适度宽松的货币政策
  • 梵蒂冈选出新教皇,外交部:望新教皇推动中梵关系不断改善
  • 开局良好,我国第一季度广告业务收入保持较快增速