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

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

在这里插入图片描述

一、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.101port: 27017priority: 20 # 选举优先级(0-100,默认10)# Secondary节点配置
replication:replSetName: "rs0"bindIp: 192.168.1.102port: 27017priority: 5readOnly: 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要求

相关文章:

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

一、MongoDB高可用核心架构&#xff1a;副本集&#xff08;Replica Set&#xff09;设计 &#xff08;一&#xff09;副本集角色与拓扑结构 1. 三大核心角色 角色职责描述资源占用选举权重数据存储Primary唯一接收写请求的节点&#xff0c;将操作日志&#xff08;Oplog&…...

IO Vs NIO

一、IO(传统阻塞式) 全称‌&#xff1a;Input/Output(输入/输出) 定义‌&#xff1a;Java 1.0 引入的基础 I/O 模型&#xff0c;基于流&#xff08;Stream&#xff09;的同步阻塞操作&#xff0c;线程在读写数据时会阻塞直到操作完成。 二、NIO(新式非阻塞式) ‌全…...

offset 家族和 client 家族

在前端开发中&#xff0c;offset 家族和 client 家族是用于获取元素尺寸和位置的重要属性集合。以下是对这两个家族相关知识点的系统总结&#xff1a; 一、offset 家族 核心属性 offsetWidth / offsetHeight 含义&#xff1a;元素的总尺寸&#xff0c;包含内容区、内边距、边…...

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…...

Java基础 Day24

一、进程和线程 1、进程 &#xff08;1&#xff09;概念 进程 (Process) 是计算机中的程序关于某数据集合上的一次运行活动 是系统进行资源分配的基本单位 简单理解&#xff1a;程序的执行过程&#xff08;正在运行的应用程序&#xff09; &#xff08;2&#xff09;特性…...

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

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

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

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

Hive 分桶(Bucketing)深度解析:原理、实战与核心概念对比

一、分桶的意义&#xff1a;比分区更细的粒度管理 1.1 解决分区数据不均匀问题 分区的局限性&#xff1a;分区基于表外字段&#xff08;如时间字段&#xff09;划分数据&#xff0c;但可能导致部分分区数据量过大&#xff0c;部分过小&#xff0c;无法进一步细化。 分桶的定…...

网络协议DHCP

DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一种网络协议&#xff0c;用于自动给网络中的设备分配 IP 地址、子网掩码、默认网关、DNS 服务器等网络配置参数。 ✅ 一、DHCP 的作用 自动为客户端分配网络信息&#xff0c;…...

什么是可重组机器人?

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

4、docker compose

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

Node.js全局对象详解:console、process与核心功能

在Node.js开发中&#xff0c;全局对象是一类无需引入即可直接访问的对象&#xff0c;它们为开发者提供了与运行时环境、系统交互和调试相关的核心功能。本文将深入解析Node.js中两个最常用的全局对象 console 和 process&#xff0c;并简要介绍其他全局对象的作用。通过代码示例…...

测试策略:AI模型接口的单元测试与稳定性测试

测试策略:AI模型接口的单元测试与稳定性测试 在构建支持AI能力的系统中,开发者不仅要关注业务逻辑的正确性,也必须保障AI模型接口在各种环境下都能稳定运行。这就要求我们在开发阶段制定清晰的测试策略,从功能验证到性能保障,逐步推进系统可用性、可维护性与可扩展性的提…...

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 (跨平台…...

生产环境Mysql推荐配置参数

以下是针对生产环境的 MySQL 配置(my.cnf 或 mysqld.cnf)推荐配置及说明。请根据实际硬件资源(如内存、CPU、磁盘类型)和应用场景调整参数。 核心配置模板(InnoDB 优化) [mysqld] #---------------------- 基础设置 ---------------------- datadir = /var/lib…...

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…...

理解并解决高丢包率问题,构建清晰流畅的实时音视频通话

丢包作为数字通信中的重要干扰因素&#xff0c;常常潜伏在表面之下&#xff0c;却严重影响性能&#xff0c;将清晰的对话变的模糊不清&#xff0c;将连贯的演示变的断断续续。因此&#xff0c;对音视频通话相关应用的开发者来说&#xff0c;理解丢包率非常重要。 什么是丢包&am…...

Ubuntu系统Todesk进度卡在100%

1 : 修改配置文件&#xff0c;关闭wayland sudo nano /etc/gdm3/custom.conf2 : 把#WaylandEnablefalse前的#号删掉 按图片删除注释 3 : 按Ctrl X &#xff0c;离开&#xff08;会问你要不要保存&#xff0c;输入 Y 回车保存&#xff09; 4 : 重启系统 或在命令行输入 r…...

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

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

Axure动态面板学习笔记

一、动态面板概述 动态面板(Dynamic Panel)是Axure中一个强大的交互组件&#xff0c;它本质上是多页面的集合&#xff0c;可以实现更丰富的页面交互功能。 主要特点&#xff1a; 可以包含多个状态(State)&#xff0c;每个状态相当于一个独立页面 支持在不同状态间切换&#…...

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

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

工程化架构设计:Monorepo 实战与现代化前端工程体系构建

三、核心架构实践&#xff1a;从模块管理到微前端落地 1. Monorepo 进阶&#xff1a;依赖治理与性能优化 痛点深化 依赖提升冲突&#xff1a;不同包对同一依赖的版本要求冲突幽灵依赖治理&#xff1a;未声明依赖被非法引用巨型仓库构建慢&#xff1a;全量构建耗时随项目增长线…...

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

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

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

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

uniapp 配置本地 https 开发环境(基于 Vue2 的 uniapp)

1、生成本地 HTTPS 证书&#xff08;mac&#xff09;打开终端&#xff0c;运行以下命令&#xff1a; mkdir ~/ssl-cert && cd ~/ssl-cert2、生成私钥&#xff1a; openssl genrsa -out localhost.key 20483、生成自签名证书&#xff08;有效期365天&#xff09;&…...

十、【核心功能篇】项目与模块管理:前端页面开发与后端 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;而…...