欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > mongodb主从

mongodb主从

2025/2/20 18:31:00 来源:https://blog.csdn.net/qq_73797346/article/details/145650897  浏览:    关键词: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: filepath: "/mongodb/28017/log/mongodb.log"logAppend: true
storage:journal:enabled: truedbPath: "/mongodb/28017/data"directoryPerDB: truewiredTiger:engineConfig:cacheSizeGB: 1directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: true
processManagement:fork: true
net:port: 28017bindIp: 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/systemfor 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; donesystemctl 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}; docat >> /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}; docat >> /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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词