【后端高阶面经:MongoDB篇】41、MongoDB 是怎么做到高可用的?

news2025/5/31 14:36:31

在这里插入图片描述

一、MongoDB高可用核心架构:副本集(Replica Set)设计

(一)副本集角色与拓扑结构

1. 三大核心角色
角色职责描述资源占用选举权重数据存储
Primary唯一接收写请求的节点,将操作日志(Oplog)同步到Secondary节点1
Secondary异步复制Primary的Oplog,可提供读服务(默认只读)可配置
Arbiter仅参与选举投票,不存储数据,解决偶数节点选举僵局1
2. 典型部署拓扑(3节点+仲裁节点)
客户端
Primary
Secondary
Secondary
Arbiter
3. 节点配置示例(mongod.conf)
# Primary节点配置
replication:
  replSetName: "rs0"
  bindIp: 192.168.1.101
  port: 27017
  priority: 20 # 选举优先级(0-100,默认10)

# Secondary节点配置
replication:
  replSetName: "rs0"
  bindIp: 192.168.1.102
  port: 27017
  priority: 5
  readOnly: true # 配置为只读节点

(二)自动故障转移机制

1. 选举流程解析
  1. 心跳检测:节点间通过ping命令检测状态,默认每2秒发送一次心跳
  2. 故障判定:Primary节点超过electionTimeoutMillis(默认10秒)未响应,触发选举
  3. 投票阶段
    • Secondary节点向其他节点发送选举请求
    • 需获得**多数节点投票(N/2+1)**才能成为新Primary
  4. 角色切换:选举成功后,新Primary开始接收写请求,旧Primary降为Secondary
2. 防脑裂设计
  • 多数派原则:3节点副本集允许1节点故障,5节点允许2节点故障
  • 仲裁节点作用:在3节点集群中,仲裁节点不存储数据但参与投票,确保选举结果有效
    # 添加仲裁节点命令
    rs.addArb("192.168.1.103:27017")
    

二、数据同步与一致性控制

(一)Oplog机制深度解析

1. Oplog存储结构
  • 本质:一个固定大小的环形缓冲区(默认大小为磁盘空间的5%,可通过--oplogSize调整)
  • 存储位置:每个节点的local.oplog.rs集合,记录所有写操作(插入、更新、删除)
  • 同步流程
    Primary写入操作
    写入Oplog
    Secondary拉取Oplog
    Secondary重放Oplog
    数据最终一致
2. 初始同步(Initial Sync)
  • 触发场景:新加入的Secondary节点或Oplog追赶超时
  • 流程
    1. 全量复制Primary数据(通过mongodump/mongorestore
    2. 增量同步Oplog直至追上Primary

(二)写入关注(Write Concern)与读关注(Read Concern)

1. 写入语义级别
级别描述一致性强度延迟(ms)适用场景
w: 1仅Primary确认写入成功1-5非关键业务(如日志)
w: majority多数节点(Primary+至少半数Secondary)确认写入5-20金融交易、订单系统
w: "majority" + j: true多数节点确认且写入磁盘持久化日志(Journal)最强20-50资产变更、事务性操作
2. 代码示例(Node.js驱动)
// 写入多数节点并等待持久化
db.collection.insertOne(
  { item: "book", qty: 10 },
  { writeConcern: { w: "majority", j: true, wtimeout: 5000 } } // 5秒超时
);

// 从Secondary节点读取数据(最终一致性)
db.collection.find({}).readConcern("local");

三、分片集群(Sharding)与水平扩展

(一)分片集群架构组件

1. 三大核心组件
组件职责描述高可用设计
mongos查询路由节点,解析客户端请求并路由到对应Shard无状态,可部署多个实例
Shard数据存储节点,每个Shard是一个副本集,负责存储部分数据每个Shard至少3节点(1主2从)
Config Server存储元数据(分片键范围、Chunk分布、节点拓扑),支持副本集部署3节点副本集,避免单点故障
2. 分片键设计原则
类型示例优势劣势
哈希分片{ user_id: "hashed" }数据均匀分布,适合高并发写入范围查询性能差
范围分片{ date: 1 }范围查询高效,适合时间序列数据可能导致热点分片
3. 分片键配置示例
// 启用分片并设置哈希分片键
sh.addShard("rs0/192.168.1.101:27017,192.168.1.102:27017")
sh.enableSharding("mydb")
sh.shardCollection("mydb.orders", { user_id: "hashed" })

(二)自动负载均衡

1. 块(Chunk)管理
  • 默认块大小:128MB,可通过sh.config.settings调整
  • 分裂条件:块数据量超过阈值或文档数超过平均值1.3倍
  • 迁移流程
    块大小超限
    mongos触发moveChunk
    源Shard创建临时索引
    数据同步到目标Shard
    更新Config Server元数据
2. 手动平衡控制
# 禁止自动平衡(维护期间)
sh.setBalancerState(false)

# 强制平衡指定数据库
sh.startBalancer("mydb")

四、读扩展与多数据中心部署

(一)读偏好(Read Preference)策略

1. 五种模式对比
模式节点选择一致性适用场景
primary仅从Primary节点读取(默认)强一致交易查询、实时数据
primaryPreferred优先Primary,故障时允许从Secondary读取最终一致高可用读扩展
secondary仅从Secondary节点读取最终一致报表生成、非实时分析
secondaryPreferred优先Secondary,故障时允许从Primary读取最终一致低优先级读请求
nearest选择网络延迟最低的节点(无论角色)最终一致全球分布式部署
2. 代码示例(Java驱动)
MongoClient client = new MongoClient(
  Arrays.asList(new ServerAddress("rs0/192.168.1.101:27017")),
  new ReadPreference(ReadPreferenceMode.SECONDARY_PREFERRED)
);

(二)跨机房容灾部署

1. 三机房部署拓扑
Primary
Secondary
Secondary
Arbiter
机房A
主节点
机房B
从节点
机房C
从节点
仲裁节点
2. 节点优先级配置
// 配置机房A节点为高优先级
rs.conf().members[0].priority = 20
rs.reconfig(rs.conf())

// 配置机房B/C节点为低优先级(仅用于读)
rs.conf().members[1].priority = 5
rs.conf().members[2].priority = 5

五、运维监控与故障处理

(一)关键运维命令

1. 副本集状态检查
rs.status()  # 查看节点角色、同步延迟、选举状态
rs.printReplicationInfo()  # 查看Oplog使用情况
2. 手动故障转移
# 强制主节点降级(需在Secondary节点执行)
rs.stepDown(60)  # 60秒内禁止该节点重新选举

# 紧急切换主节点(绕过选举)
rs.reconfig({
  _id: "rs0",
  members: [
    { _id: 0, host: "192.168.1.102:27017", priority: 20 },
    { _id: 1, host: "192.168.1.101:27017", priority: 5 }
  ]
}, { force: true })

(二)核心监控指标

指标名称采集方式健康阈值告警处理
副本集状态rs.status().ok1(所有节点在线)检查故障节点网络/磁盘
Oplog剩余空间比例db.oplog.rs.stats().spaceUsed>20%扩容Oplog或清理历史操作
选举次数/小时日志分析<3次/小时排查网络波动或节点性能问题
写入延迟(w:majority)慢查询日志<50ms优化写入语义或增加节点资源

六、数据备份与恢复策略

(一)逻辑备份(mongodump)

1. 全量备份
# 备份单个数据库
mongodump -h rs0/192.168.1.101:27017 -d mydb -o /backup/mydb_$(date +%Y%m%d)

# 备份分片集群(通过mongos路由)
mongodump -h mongos:27017 -d mydb --sharded
2. 增量备份(基于Oplog)
# 导出Oplog日志
mongodump -d local -c oplog.rs --query '{"ts": {"$gt": ISODate("2023-10-01T00:00:00Z")}}'

(二)物理备份(文件系统快照)

1. 操作步骤
# 1. 锁定数据库(阻止写操作)
db.fsyncLock()

# 2. 执行快照(如LVM快照或云盘快照)
lvcreate -L 10G -s /dev/mapper/vol_es -n vol_es_snap

# 3. 解锁数据库
db.fsyncUnlock()
2. 云服务集成(AWS示例)
# 使用MongoDB Atlas自动备份
1. 在Atlas控制台启用连续备份(默认保留7天)
2. 通过API恢复至指定时间点:
   atlas clusters restore --clusterId=cluster1 --snapshotId=snapshot_123

七、高可用最佳实践与场景适配

(一)金融交易场景

1. 架构设计
  • 副本集配置:5节点(3数据节点+2仲裁节点),writeConcern: {w: "majority", j: true}
  • 分片策略:哈希分片键user_id,每个Shard独立副本集
  • 监控重点:Oplog延迟、选举频率、事务冲突率
2. 故障恢复流程

在这里插入图片描述

(二)电商订单场景

1. 性能优化
  • 读偏好secondaryPreferred,分流60%读请求到从节点
  • 分片键order_date范围分片,提升按日期查询效率
  • 索引优化:对statususer_id创建复合索引
2. 容灾演练
# 模拟主节点故障
ssh primary-node "sudo service mongod stop"

# 验证故障转移
rs.status().primary.should.be("secondary-node-1:27017")

# 恢复原主节点
sudo service mongod start
rs.status().primary.should.be("secondary-node-1:27017") # 原主节点降为从节点

八、面试核心考点与应答策略

(一)基础问题

  1. Q:MongoDB如何实现高可用?
    A:通过副本集(Replica Set)实现自动故障转移,至少3节点(1主2从或含仲裁节点),利用Oplog同步数据,结合分片集群实现水平扩展。

  2. Q:仲裁节点的作用是什么?
    A:仲裁节点不存储数据,仅参与选举投票,解决偶数节点的选举僵局,例如3节点集群中仲裁节点可确保多数派投票有效。

(二)进阶问题

  1. Q:如何保证数据不丢失?
    A

    • 设置写入关注writeConcern: {w: "majority", j: true},确保数据写入多数节点并持久化到磁盘
    • 定期备份(mongodump + 快照),结合Oplog实现点恢复
  2. Q:分片集群中如何避免热点分片?
    A

    • 选择哈希分片键(如用户ID哈希)实现数据均匀分布
    • 监控块分布,通过sh.rebalanceShard()手动迁移热点块
    • 启用自动平衡器(默认开启),设置合理块大小(如256MB)

(三)架构设计问题

Q:设计一个支持全球部署的高可用MongoDB集群,你会考虑哪些因素?
回答思路

  1. 多数据中心部署:每个区域部署独立副本集,通过priority配置优先选举本地节点
  2. 读写分离:使用nearest读偏好降低跨区域延迟
  3. 数据同步:跨区域副本集通过异步复制(如AWS Direct Connect)同步数据
  4. 容灾切换:配置DNS切换策略,结合客户端驱动自动重定向
  5. 监控覆盖:跨区域延迟、Oplog滞后、节点心跳状态

九、总结:高可用架构的三维保障模型

(一)数据冗余层

  • 副本集:至少3节点,确保数据多副本存储
  • 分片集群:每个Shard独立副本集,实现双重高可用

(二)故障容错层

  • 自动选举:基于Raft变种协议,10秒内完成主节点切换
  • 客户端适配:驱动自动重定向(如MongoDB Java Driver支持拓扑感知)

(三)运维保障层

  • 监控体系:Prometheus+Grafana采集节点指标(如mongodb_oplog_window
  • 备份策略:逻辑备份+物理快照+云服务集成,满足RPO/RTO要求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2391687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DMBOK对比知识点整理(4)

1.常见数据质量维度 常见数据质量维度(DMBOK-P353)质量维度

day12 leetcode-hot100-21(矩阵4)

240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; 1.暴力法O(m*n) 思路&#xff1a;两层for循环即可。 2.二分查找O(m*logn) 思路&#xff1a;每行都用二分查找,因为每行都是排好序的 class Solution {public boolean searchMatrix(int[][] matrix, int targe…

提问:鲜羊奶是解决育儿Bug的补丁吗?

在育儿这个"系统工程"中&#xff0c;过度提醒就像冗余代码&#xff1a;"快写作业"&#xff08;重复调用&#xff09;、"多穿衣服"&#xff08;异常捕获&#xff09;、"别玩手机"&#xff08;进程阻断&#xff09;。羊大师技术育儿实验…

关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别

我们谈论数据中台之前&#xff0c; 我们也听到过数据平台、数据仓库、数据湖、湖仓一体的相关概念&#xff0c;它们都与数据有关系&#xff0c;但他们和数据中台有什么样的区别&#xff0c; 下面我们将围绕数据平台、数据仓库、数据湖和数据中台的区别进行介绍。 一、相关概念…

什么是可重组机器人?

可重组机器人是一种具有高度灵活性和适应性的新型机器人系统&#xff0c;能够根据不同任务需求&#xff0c;快速改变自身结构和功能。下面我从概念、结构、特点、应用领域、发展趋势等方面&#xff0c;为你详细介绍&#xff1a; 概念&#xff1a;可重组机器人是由多个标准化、模…

4、docker compose

1、介绍 Docker Compose 是 Docker 官方提供的容器编排工具&#xff0c;用于简化多容器应用的开发、部署和管理。它通过声明式配置文件&#xff08;YAML格式&#xff09;定义容器化应用的服务、网络、存储等组件及其依赖关系&#xff0c;使用户能够通过单一命令快速启动、停止…

SQL里几种JOIN连接

数据信息&#xff1a; 员工表EMP 部门表DEPT 一、INNER JOIN&#xff08;内连接&#xff09; 作用&#xff1a;只返回两个表中完全匹配的行&#xff0c;相当于取交集。 场景&#xff1a;查询「有部门的员工信息」。 示例&#xff1a; SELECT 员工.姓名, 部门.部门名称 FR…

基于通义千问的儿童陪伴学习和成长的智能应用架构。

1.整体架构概览 我们的儿童聊天助手将采用典型的语音交互系统架构,结合大模型能力和外部知识库: 2. 技术方案分解 2.1. 前端应用/设备 选择: 移动App(iOS/Android)、Web应用,或者集成到智能音箱/平板等硬件设备中。技术栈: 移动App: React Native / Flutter (跨平台…

LVS-DR 负载均衡群集

目录 一、LVS-DR集群 1、LVS-DR 工作原理 2、数据包流向分析 3、LVS-DR 模式特点 二、直接路由模式&#xff08;LVS-DR&#xff09; 1、准备案例环境 2、配置负载调度器&#xff08;101&#xff09; &#xff08;1&#xff09;配置虚拟IP 地址&#xff08;VIP&#xff…

[Dify] 如何应对明道云API数据过长带来的Token超限问题

在集成明道云与大型语言模型(LLM)如ChatGPT或本地部署的Dify时,开发者经常会面临一个核心问题:API获取的数据太长,超出LLM支持的Token数限制,导致无法直接处理。本文将深入探讨这个问题的成因,并提供几种可行的解决方案,包括分段处理、外部知识库构建等策略。 明道云AP…

eNSP企业综合网络设计拓扑图

1.拓扑图 2.拓扑配置 此拓扑还有一些瑕疵&#xff0c;仅做参考和技术提升使用。 想要配置的可以关注下载 大型网络综合实验拓扑图&#xff08;eNSP&#xff09;资源-CSDN文库

BugKu Web渗透之备份是个好习惯

启动场景后&#xff0c;网页显示一段字符串。 看起来像md5值&#xff0c;但是又过长了。 步骤一&#xff1a;右键查看源代码&#xff0c;没有发现任何异常。 步骤二&#xff1a;使用dirsearch去查看是否有其他可疑文件。 在终端输入&#xff1a; dirsearch -u http://117.72.…

华为AP6050DN无线接入点瘦模式转胖模式

引言 华为AP6050DN是一款企业级商用的无线接入点。由于产品定位原因,其默认工作在瘦模式下,即须经AC统一控制和管理,是不能直接充当普通的无线路由器来使用的。 而本文的目的,就是让其能脱离AC的统一控制和管理,当作普通无线路由器来使用。 硬件准备 华为AP6050DN无线接…

十、【核心功能篇】项目与模块管理:前端页面开发与后端 API 联调实战

【核心功能篇】项目与模块管理&#xff1a;前端页面开发与后端 API 联调实战 前言准备工作第一部分&#xff1a;完善项目管理功能 (Project)1. 创建/编辑项目的表单对话框组件 第二部分&#xff1a;模块管理功能 (集成到项目详情页)1. 创建模块相关的 API 服务 (src/api/module…

【大模型/MCP】MCP简介

一句话总结 如果你打算让 LLM 像人一样“随手”调用脚本、数据库、搜索引擎或 CI/CD 流水线&#xff0c;而又不想为每个工具分别写 REST 插件或轮询接口&#xff0c;那么把它们包进 MCP 服务器是当前最省心、延迟最低、可复用最高的做法——正因如此 OpenAI、Google DeepMind、…

[Godot][游戏开发] 如何在 Godot 中配置 Android 环境(适配新版 Android Studio)

在使用 Godot 进行 Android 项目的开发与导出时&#xff0c;配置 Android 环境是一项必要步骤。随着 Android Studio 的更新&#xff08;特别是自 Arctic Fox 版本起&#xff09;&#xff0c;安装方式发生了变化&#xff0c;默认不再引导用户手动配置 SDK/JDK/NDK&#xff0c;而…

机器学习多分类逻辑回归和二分类神经网络实践

1、2-17 实现多分类逻辑回归 代码 # 2-17 实现多分类逻辑回归 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 参数设置 iterations 5400 # 迭代次数 learning_rate 0.1 # 学习率 m_train 200 # 训练样本数量# 整数索引值转one-hot向量 def…

社交类网站设计:经典feed流系统架构详细设计(小红书微博等)

文章目录 一、关注服务1、粉丝、关注数架构设计&#xff08;1&#xff09;数据库实现方案1&#xff08;2&#xff09;数据库实现方案2&#xff08;3&#xff09;基于redis缓存优化&#xff08;4&#xff09;使用专用计数服务&#xff08;5&#xff09;近似计数&#xff08;牺牲…

RISC-V PMA、PMP机制深入分析

1 PMA PMA&#xff08;Physical Memory Attributes&#xff09;&#xff0c;物理内存属性&#xff0c;顾名思义就是用来设置物理内存属性的&#xff0c;但这里说“设置”&#xff0c;并不合理&#xff0c;因为一般情况下各存储的属性&#xff0c;在芯片设计时就固定了&#xf…

【NebulaGraph】查询案例(七)

【NebulaGraph】查询案例 七 1. 查询语句12. 查询语句23. 查询语句34. 查询语句4 1. 查询语句1 GO FROM "player100" OVER * YIELD type(edge) AS link, properties($$) AS properties,tostring(src(edge)) AS src,tostring(dst(edge)) AS dst, tags($$) AS tagLi…