MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉

由于老产品即时通讯私有化软件就是采用MongoDB ,但是版本实在太低,要做大更新,其次针对10年前完美运营的项目来到10年后的现在就不一定行,优雅草卓伊凡最近一直在研究,同事们都忙着开发,但是疑难问题一直比较难处理,最近两周多一直在花时间处理数据库的问题。

MongoDB 简介

MongoDB 是一款开源的 NoSQL 文档型数据库,由 MongoDB Inc.(原 10gen 公司)开发并维护。它采用 BSON(Binary JSON) 格式存储数据,支持动态模式(Schema-less),适用于处理非结构化或半结构化数据,如社交网络、物联网(IoT)、实时分析等场景。

MongoDB 的推出公司

MongoDB 由 Dwight Merriman、Eliot Horowitz 和 Kevin Ryan(DoubleClick 创始团队)于 2007 年 创立,最初是为了解决传统关系型数据库在 可扩展性灵活性 方面的不足。

  • 2009 年,MongoDB 1.0 正式发布,并开源。
  • 2013 年,公司更名为 MongoDB Inc.,并推出商业版本 MongoDB Enterprise Advanced
  • 2017 年,MongoDB 在纳斯达克上市,并推出 MongoDB Atlas(全托管云数据库服务)。


MongoDB 发展史(版本演进)

MongoDB 自 2009 年发布以来,经历了多个重要版本迭代,以下是关键版本及其特性:

版本

发布时间

主要改进

1.0

2009.02

首个正式版本,支持基本查询功能

2.0

2010.08

引入 分片(Sharding)副本集(Replica Set)

3.0

2015.03

引入 WiredTiger 存储引擎,大幅提升写入性能

4.0

2018.06

支持 多文档 ACID 事务(跨集合事务)

5.0

2021.07

新增 时间序列集合(Time Series Collections)

6.0

2022.07

支持 加密数据查询

7.0

2023.11

优化 分布式事务性能查询引擎

您的项目使用的是 MongoDB 3.4.0(2016年发布),该版本已 停止维护,存在以下问题:

  • 存储引擎落后:默认使用 MMAPv1(已被 WiredTiger 取代,3.0+ 支持)。
  • 无事务支持:4.0 之前仅支持单文档原子操作,无法保证跨文档一致性。
  • 安全漏洞:旧版本存在未授权访问等风险。

建议升级至 MongoDB 6.0+,以获取:
✅ 更高效的 WiredTiger 存储引擎
✅ 完整 ACID 事务支持
✅ 更好的分片与副本集管理


MongoDB 相比其他数据库的优势

1. 灵活的数据模型(Schema-less)

  • 无需预定义表结构,可动态增减字段,适合快速迭代的业务(如即时通讯消息存储)。
  • 支持 嵌套文档数组,减少关联查询(如聊天记录可直接嵌入用户文档)。

2. 高性能读写

  • WiredTiger 引擎 提供高效的 压缩存储内存映射,比 MySQL 等关系型数据库写入更快。
  • 索引优化:支持 地理空间索引、全文索引,适合即时通讯的“附近的人”功能。

3. 高可扩展性(分片+副本集)

  • 水平扩展(Sharding):数据可分布到多台服务器,适合 蜻蜓I水银版 的高并发需求。
  • 自动故障转移(Replica Set):主节点宕机时,从节点自动接管,保障服务连续性。

4. 适合即时通讯场景

  • 消息存储:聊天记录可存储为 JSON 文档,支持 消息状态(已读/未读)、撤回、历史记录查询
  • 在线状态管理:利用 TTL 索引 自动清理离线用户数据。
  • 群组聊天:嵌套文档可存储成员列表、权限等复杂结构。

MongoDB 在蜻蜓I水银版即时通讯中的应用建议

1. 数据结构设计

// 用户文档
{"_id": "user123","name": "Alice","status": "online","chats": [{ "chatId": "room1", "lastRead": "2025-07-22T10:00:00Z" }]
}// 聊天室文档
{"_id": "room1","members": ["user123", "user456"],"messages": [{ "sender": "user123", "text": "Hello!", "timestamp": "2025-07-22T10:00:00Z" }]
}

2. 升级建议

  1. 备份数据:使用 mongodump 导出旧数据。
  2. 部署新版本(如 MongoDB 6.0),并测试兼容性。
  3. 优化索引:对 messages.timestampuser.status 等高频查询字段建立索引。

3. 性能调优

  • 启用 WiredTiger 压缩snappyzstd)减少存储占用。
  • 使用 Change Streams 监听消息实时变更,替代轮询查询。

总结

  • MongoDB 由 MongoDB Inc. 推出,适用于 灵活、高并发的场景(如即时通讯)。
  • 3.4.0 版本已过时,建议升级至 6.0+ 以获取事务、安全性和性能优化。
  • 相比 MySQL,MongoDB 在 Schema 灵活性、水平扩展、嵌套数据存储 方面更具优势,但 复杂关联查询 稍弱。

如需进一步优化 蜻蜓I水银版 的 MongoDB 部署,可参考 MongoDB Atlas(云托管方案)或 分片集群 架构。

但是目前腾讯云而言MongoDB的数据库版本最低都得4.0,因此升级迫在眉睫

MongoDB 运行原理详解

MongoDB 是一个开源的、面向文档的 NoSQL 数据库,采用 BSON(二进制 JSON)格式存储数据,具有高性能、高可扩展性和灵活的数据模型。以下是其核心运行原理:

1. 数据模型与存储结构
  • 文档(Document):MongoDB 的基本数据单元,类似于关系型数据库中的行,但更灵活(如字段可动态添加、数据类型可变化)。
  • 集合(Collection):一组相关的文档,类似于关系型数据库中的表,但无需预定义模式。
  • BSON 存储:文档以 BSON 格式存储在磁盘上,支持嵌套结构、数组和二进制数据,便于高效读写。
  • 索引:MongoDB 支持多种索引类型(如单字段、复合、文本、地理空间),提升查询效率。
2. 核心组件与架构
  • mongod 进程:MongoDB 的核心服务进程,负责处理数据请求、管理数据文件和维护索引。
  • 内存管理
    • 使用系统虚拟内存(mmap)管理数据文件,依赖操作系统的页面缓存(Page Cache)提高读写性能。
    • WiredTiger 存储引擎支持压缩和内存控制(通过 cache_size 参数)。
  • 存储引擎
    • WiredTiger(默认):支持文档级锁、压缩和高性能写入。
    • MMAPv1(旧版):基于内存映射文件,支持表级锁,已逐步淘汰。
3. 读写操作流程
  • 读操作
    1. 客户端发送查询请求到 mongod。
    2. mongod 检查查询是否可通过索引完成,若否则进行全表扫描。
    3. 从内存(Page Cache)或磁盘读取数据,返回 BSON 格式结果。
  • 写操作
    1. 客户端发送写入请求(如 insert, update)。
    2. mongod 验证数据有效性,应用写入操作。
    3. 写入操作记录到预写日志(WiredTiger 的 journal)确保原子性。
    4. 定期将内存中的脏数据刷新到磁盘(检查点机制)。
4. 高可用性与复制
  • 副本集(Replica Set)
    • 一组维护相同数据集的 mongod 实例,包含一个主节点(Primary)和多个从节点(Secondary)。
    • 主节点处理所有写操作,从节点通过 oplog(操作日志)同步数据。
    • 自动故障转移:当主节点故障时,从节点通过选举机制选出新的主节点。
  • 读写分离:客户端可选择从从节点读取数据,减轻主节点压力。
5. 水平扩展与分片
  • 分片集群(Sharded Cluster)
    • 分片(Shards):存储实际数据的节点或副本集。
    • 配置服务器(Config Servers):存储集群元数据(如分片键、数据分布)。
    • 路由进程(mongos):客户端与集群的接口,负责请求路由和结果合并。
  • 分片策略
    • 哈希分片:基于哈希值均匀分布数据。
    • 范围分片:基于键的范围划分数据。
6. 事务处理
  • MongoDB 从 4.0 版本开始支持多文档事务(在副本集或分片集群中)。
  • 事务保证 ACID 特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
  • 适用于需要跨文档或跨集合的原子操作场景。

MongoDB 安装方法

以下介绍在主流 Linux 系统和 macOS 上安装 MongoDB 的步骤。

1. 在 Ubuntu/Debian 上安装
# 导入 MongoDB 官方 GPG 密钥
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -# 添加 MongoDB 软件源
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list# 更新包列表并安装 MongoDB
sudo apt-get update
sudo apt-get install -y mongodb-org# 启动并设置开机自启
sudo systemctl start mongod
sudo systemctl enable mongod# 验证安装
mongo --version
2. 在 CentOS/RHEL 上安装
# 创建 MongoDB 配置文件
sudo tee /etc/yum.repos.d/mongodb-org-6.0.repo <<EOF
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
EOF# 安装 MongoDB
sudo yum install -y mongodb-org# 启动并设置开机自启
sudo systemctl start mongod
sudo systemctl enable mongod# 验证安装
mongo --version
3. 在 macOS 上安装(使用 Homebrew)
# 安装 Homebrew(如果未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"# 添加 MongoDB 源
brew tap mongodb/brew# 安装 MongoDB 社区版
brew install mongodb-community@6.0# 启动 MongoDB 服务
brew services start mongodb-community@6.0# 验证安装
mongosh --version
4. 安装后的基本配置
  1. 配置文件位置
    • Linux:/etc/mongod.conf
    • macOS:/usr/local/etc/mongod.conf
  1. 重要配置参数
systemLog:destination: filepath: /var/log/mongodb/mongod.log  # 日志路径logAppend: true
storage:dbPath: /var/lib/mongo  # 数据文件路径journal:enabled: true
net:port: 27017bindIp: 0.0.0.0  # 监听所有IP,生产环境建议改为具体IP
  1. 启动/停止服务
# Linux
sudo systemctl start mongod    # 启动
sudo systemctl stop mongod     # 停止
sudo systemctl restart mongod  # 重启# macOS(使用 Homebrew)
brew services start mongodb-community@6.0
brew services stop mongodb-community@6.0
5. 连接与验证
# 连接到 MongoDB 服务
mongosh# 在 shell 中验证
> db.version()  # 查看版本
> db.createCollection("test")  # 创建集合
> db.test.insertOne({name: "MongoDB"})  # 插入文档
> db.test.find()  # 查询文档
6. 生产环境注意事项
  1. 启用身份验证
# 在 mongod.conf 中添加
security:authorization: enabled

创建管理员用户:

use admin
db.createUser({user: "admin",pwd: "password",roles: ["root"]
})
  1. 禁用远程匿名访问
# 将 bindIp 改为服务器实际 IP 或 127.0.0.1
net:bindIp: 127.0.0.1
  1. 配置防火墙
# Ubuntu/Debian
sudo ufw allow 27017/tcp# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=27017/tcp
sudo firewall-cmd --reload
  1. 数据备份
# 使用 mongodump 备份
mongodump --out /backup/mongodb/$(date +%Y%m%d)# 使用 mongorestore 恢复
mongorestore /backup/mongodb/20250722

总结

MongoDB 的灵活数据模型和分布式架构使其适合高并发、大数据量的应用场景。安装时需根据实际需求调整配置,生产环境中尤其要关注安全、性能和高可用性。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin 中的单例模式(Singleton)与对象声明

在 Kotlin 中&#xff0c;类描述的是一种通用结构&#xff0c;可以多次实例化&#xff0c;也可以用多种方式实例化。但有时我们只需要单个实例&#xff0c;不多不少。单例模式能帮你更好地组织代码&#xff0c;把相关的方法聚合在一起。 单例模式是什么&#xff1f; 单例模式是…

Shell 编程基础入门从认识到实战

对于刚接触 Linux 或 Unix 系统的开发者来说&#xff0c;Shell 脚本往往是自动化操作的第一道门槛。它不像 Python 那样语法简洁&#xff0c;也不像 Java 那样有完善的面向对象体系&#xff0c;但却能以极少的代码实现强大的系统管理功能。本文将从 Shell 的基本概念讲起&#…

混合遗传粒子群算法在光伏系统MPPT中的应用研究

混合遗传粒子群算法在光伏系统MPPT中的应用研究 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c;觉得好请收藏。点击跳转到网站。 摘要 本文针对光伏系统最大功率点跟踪(MPPT)问题&#xff0…

机器视觉的布料丝印应用

在纺织印染行业&#xff0c;布料丝印工艺的精度直接决定产品外观质量与市场竞争力。传统丝印设备依赖机械定位与人工校准&#xff0c;面对高密度图案、柔性面料或复杂纹理时&#xff0c;易出现套色偏移、油墨渗透不均等问题&#xff0c;导致良品率波动与生产成本攀升。 随着机…

前端常用类库

常用类库 类库作用 类库可以帮助我们快速实现项目业务的开发与功能的实现, 帮助我们解放劳动力提高生产效率, 前端中的类库与框架都是由原生javascript编写, 提供给其他开发者应用于某一业务环境或者需求。一般有开发者/团队开源维护. 优秀的类库需要具备高度封装可用, 稳定, …

通俗易懂循环神经网络(RNN)指南

本文用直观类比、图表和代码&#xff0c;带你轻松理解RNN及其变体&#xff08;LSTM、GRU、双向RNN&#xff09;的原理和应用。什么是循环神经网络 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类专门用于处理序列数据的神经网络。与前馈神经网络不同…

【SVM】支持向量机实例合集

基于Java的SVM(支持向量机)实例合集 以下是一个基于Java的SVM(支持向量机)实例合集,包含核心代码示例和应用场景说明。这些例子基于流行的机器学习库(如LIBSVM、Weka、JSAT)实现。 数据准备与加载 使用LIBSVM格式加载数据集: // 加载LIBSVM格式数据 svm_problem pr…

Python100个库分享第38个—lxml(爬虫篇)

目录专栏导读&#x1f4da; 库简介&#x1f3af; 主要特点&#x1f6e0;️ 安装方法Windows安装Linux/macOS安装验证安装&#x1f680; 快速入门基本使用流程HTML vs XML解析&#x1f50d; 核心功能详解1. XPath选择器2. CSS选择器支持3. 元素操作&#x1f577;️ 实战爬虫案例…

imx6ull-系统移植篇17——linux顶层 Makefile(上)

目录 前言 顶层 Makefile 源码简析 版本号 MAKEFLAGS 变量 命令输出 静默输出 设置编译结果输出目录 代码检查 模块编译 设置目标架构和交叉编译器 调用 scripts/Kbuild.include 文件 交叉编译工具变量设置 头文件路径变量 导出变量 make xxx_defconfig 过程 …

OpenCV 官翻6 - Computational Photography

文章目录图像去噪目标理论OpenCV中的图像去噪1、cv.fastNlMeansDenoisingColored()2、cv.fastNlMeansDenoisingMulti()附加资源图像修复目标基础概念代码补充资源练习高动态范围成像&#xff08;HDR&#xff09;目标理论基础曝光序列HDR1、将曝光图像加载到列表中2、将曝光序列…

APT32F1732RBT8爱普特微电子 32位MCU国产芯片 智能家居/工业控制 首选

APT32F1732RBT8 爱普特微电子&#xff0c;32位MCU国产芯片一、产品简介APT32F1732RBT8 是爱普特微电子&#xff08;APT&#xff09;推出的高性能32位ARM Cortex-M0内核MCU&#xff0c;主频高达48MHz&#xff0c;内置64KB Flash8KB RAM&#xff0c;专为智能家居、工业控制、消费…

Smart Tomcat

本篇博客的内容是教你借助idea中的插件,把tomcat集成到idea中安装 Smart Tomcat 插件搜索下载 ,如果一直处于加载界面,就尝试一下科学上网配置 Smart Tomcat 插件 点击右上角的 "Add Configuration"选择左侧的 "Smart Tomcat" 在 Name 这一栏填写一个名字(…

Linux_shell编写

title: Linux_4 shell编写 shell pwd (/root/A/2025_7/19/myshell) 首先需要设计命令行提示 &#xff08;MakeCommandLine()&#xff09; 首先获取相关信息 getenv(“name”) // 获取用户名 const char* GetUserName() {const char* name getenv("USER");if (name …

【数据结构】栈的深入解析--用C语言实现

文章目录1.栈的概念2.栈的底层结构3.栈的功能4.栈的实现4.1.栈结构的定义4.2.栈的初始化4.3.栈的销毁4.4.入栈4.5.出栈4.6.取栈顶元素4.7.获取栈中有效元素个数5.完整代码Stack.hStack.cmain.c运行结果1.栈的概念 是一种特殊的线性表&#xff0c;只允许数据在固定的一段进行插…

Git仓库核心概念与工作流程详解:从入门到精通

Git仓库的基本概念版本库&#xff08;Repository&#xff09;是Git的核心概念&#xff0c;你可以简单理解为一个被Git管理的目录。这个目录里的所有文件都能被Git跟踪&#xff0c;记录每次修改和删除&#xff0c;让你可以随时追溯历史或在未来某个时刻"还原"文件。Gi…

Web开发 05

1 React库&#xff08;人话详解版&#xff09;别慌&#xff0c;React 刚接触时是会有点懵&#xff0c;咱们用 “人话 类比” 一步步拆&#xff1a;核心概念先抓牢组件&#xff08;Component&#xff09;把它想成 “乐高积木”&#xff0c;比如做个社交 App&#xff0c;顶部导航…

RustDesk 自建中继服务器教程(Mac mini)

&#x1f4d6; 教程目标 在家里的 Mac mini 上部署 RustDesk 中继服务器 (hbbs hbbr)&#xff0c;让你从办公室、笔电或手机 低延迟、安全 地远程控制家里的 Windows 和 Mac mini。 ✅ 不依赖第三方服务器 ✅ 支持 P2P 和中继双模式 ✅ 全流量可控、跨平台 &#x1f3d7;️ 架…

数据库—修改某字段默认值

前言有时候&#xff0c;数据库的字段默认值没有正确设置&#xff0c;这时候需要改默认值。以下是我做的改默认值的记录&#xff0c;希望对网友有所帮助。1.SQL SERVER下面的示例假设你要修改名为 YourColumnName 的字段&#xff0c;并为其设置一个新的默认值 NewDefaultValue。…

Spring快速整合Mybatis

MyBatis是一个优秀的持久层框架&#xff0c;Spring则是广泛使用的Java应用框架。可以将两者整合可以充分发挥各自的优势。 1、Spring整合MyBatis的基本配置 添加依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spri…

基于深度学习的语音识别:从音频信号到文本转录

前言 语音识别&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能领域中一个极具挑战性和应用前景的研究方向。它通过将语音信号转换为文本&#xff0c;为人们提供了更加自然和便捷的人机交互方式。近年来&#xff0c;深度学习技术在语音识别领域取得了显著…