基于k8s环境的mongodb多副本高可用方案

文章目录

基于现有版本出具高可用多副本改造方案

1.1.单副本与多副本比较

现有xx平台的数据库mongodb部署架构为单节点单副本方式,要升级为多副本模式,利用数据冗余与安全。

1.2.多副本升级方案

1.2.1.升级方案参考

以下是单副本升级为多副本方案,可作为参考

1.2.2.多副本部署过程示例

以下为多副本部署的试例,可作参考

1.2.2.1.使用sts,先成功部署mongodb

利用现有yaml文件,可成功部署mongo-0,mongo-1,仲裁节点mongo-arbiter,如下示例

1.2.2.2.初始化mongodb数据库

通过kubectl -n mongodb exec -it mongo-0 /bin/bah登录进入容器中,直接执行mongo进入到mongodb数据库中

使用

复制代码
Use admin
 rs.initiate(
{   _id: "rs0",   
members: [     
{       _id: 0,       host: "mongo-0.mongo-headless.mongodb.svc.cluster.local:27017",       priority: 50     },     


{       _id: 1,       host: "mongo-1.mongo-headless.mongodb.svc.cluster.local:27017",       priority: 40     },     
{       _id: 2,       host: "mongo-arbiter-0.mongo-headless.mo-*ngodb.svc.cluster.local:27017",       arbiterOnly: true     }   ] })

执行结果如下:

对以上初始化命令作一解释:

rs.initiate() 是 MongoDB 中用于首次初始化一个副本集(Replica Set)的命令。执行该命令后,MongoDB 实例将从独立模式(Standalone)切换为副本集模式,并根据配置启动选举流程,选出主节点(Primary),建立主从复制关系

_id: "rs0"

指定副本集的逻辑名称为 rs0。

所有成员必须使用相同的副本集名称才能加入该集群。

该名称在整个 MongoDB 部署中应保持唯一。

成员 1:mongo-0(主节点候选)

复制代码
{
  _id: 0,
  host: "mongo-0.mongo-headless.mongodb.svc.cluster.local:27017",
  priority: 50
}

_id: 0:该成员在副本集中的唯一编号。

host:该成员的主机地址,使用 Kubernetes Headless Service 提供的 DNS 名称,确保 Pod 重启后地址不变。

priority: 50:优先级为 50(默认为 1),数值越高越容易被选举为主节点。mongo-0 在正常情况下将作为主节点运行。

成员 2:mongo-1(从节点)

复制代码
{
  _id: 1,
  host: "mongo-1.mongo-headless.mongodb.svc.cluster.local:27017",
  priority: 40
}

_id: 1:该成员的唯一编号。

host:指向 mongo-1 Pod 的 DNS 地址。

priority: 40:优先级低于 mongo-0,正常情况下作为从节点(Secondary)运行,用于数据同步和读负载分担。

成员 3:mongo-arbiter-0(仲裁节点)

复制代码
{
  _id: 2,
  host: "mongo-arbiter-0.mongo-headless.mongodb.svc.cluster.local:27017",
  arbiterOnly: true
}

arbiterOnly: true:表示这是一个纯仲裁节点(Arbiter)。

仲裁节点不存储数据,仅参与选举投票。作用是在两个数据节点之间提供"决胜一票",确保在主节点故障时能选出新的主节点,避免脑裂(Split-Brain)问题。

资源占用小,适合用于优化部署成本。

通过rs.status()查看:

主从节点,从节点,仲裁节点三个

通过rs.conf()再查看副本集,如下图:

1.2.3.验证mongodb数据高可用

1.2.3.1.插入数据测试主从高可用

在主节点上,插入数据1000条,用于验证,返回1000

复制代码
// 插入 1000 条测试数据
for (let i = 1; i <= 1000; i++) {
  db.test.insertOne({
    _id: i,
    name: "user" + i,
    ts: new Date()
  });
}
// 查询总记录数
db.test.count();

再到从上查询,可以查询到1000,表示主从同步正常。

1.2.3.2.mongo-0优先级高时切换情况

1.2.3.2.1.停主节点mongo-0是否切换

停主节点mongo-0,验证mongo-1 从是否切换为主,

通过停进程,可以快速查询到mongo-1切换为主, mongo-0为从

当仲裁节点检测到原主节点mongo-0恢复并重新接入集群后,会触发新一轮选举;由于初始化时已配置mongo-0的优先级高于mongo-1,因此在选举中mongo-0获胜并自动重新成为主节点,实现主从角色的自动回归。

容器化部署好处,当delete mongo-0容器时,k8也会自动拉取起的mongo-0,

整个来回切换时间为10-20秒时间完成。不需要人为干预。

此时查看主从的数据

1000个数据存在,正常读取。

1.2.3.3.mongo-0、1优先级相同时切换情况
1.2.3.3.1.停主节点mongo-0是否切换

当delete掉mongo-0 后,快速查看副本情况,mongo-0是异常的。

此时mongo-1变为主节点,

待10-20秒后,再次查看mongo-0,已经变为从节点,如下图:

当主节点与从节点的优先级相同时,若主节点发生异常,副本集可自动将从节点选举为新的主节点,实现故障切换,保障系统高可用性。

查看数据是否正常:

Mongo-1主上:

Mongo-0从上:

总结:通过仲裁的选举,mongdb能满足高可用需求,由于是k8s部署,我们还是以设置优先级指定mongo-0作为主,这样恢复后,不会造成数据因延迟切换到mongo-1进行写数据,造成数据不一致问题。

相关推荐
SirLancelot116 小时前
MongoDB-基本介绍(一)基本概念、特点、适用场景、技术选型
java·数据库·分布式·后端·mongodb·软件工程·软件构建
博睿谷IT99_18 小时前
K8s 核心架构是什么?组件怎么协同工作的?
云原生·kubernetes·k8s·k8s pod 设计原理·容器编排与集群管理
武子康18 小时前
Java-151 深入浅出 MongoDB 索引详解 性能优化:慢查询分析 索引调优 快速定位并解决慢查询
java·开发语言·数据库·sql·mongodb·性能优化·nosql
能不能别报错19 小时前
K8s学习笔记(二十一) RBAC
笔记·学习·kubernetes
久绊A19 小时前
Kubernetes(k8s)版本查看
云原生·容器·kubernetes
007php00719 小时前
Docker 实战经验之关键文件误删恢复指南(一)
jvm·docker·云原生·容器·面试·职场和发展·eureka
Do_GH19 小时前
【Docker】06.通过WSL部署Docker Desktop
运维·docker·容器
可DRAK鸦|・ω・`)20 小时前
docker后端jar包本地构建镜像
java·docker·容器·jar
翰林小院20 小时前
【MongoDB】 MongoDB index overview
数据库·mongodb