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

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

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.lryc.cn/news/595826.html

相关文章:

  • Go 并发(协程,通道,锁,协程控制)
  • 基于 FFT + VMD 预处理的 1DCNN‑Informer 双支路并行、多头注意力融合分类模型
  • 【JS】获取元素宽高(例如div)
  • 力扣-链表相关题 持续更新中。。。。。。
  • 【Android】Popup menu:弹出式菜单
  • KafkaMQ 日志采集最佳实践
  • 《一种利用电阻抗和声学断层扫描进行触觉感应的仿生弹性机器人皮肤》论文解读
  • 基于开源AI智能名片链动2+1模式与S2B2C商城小程序的淘宝新店引流与好评优化策略研究
  • 92套毕业相册PPT模版
  • ES操作笔记
  • 认识自我的机器人:麻省理工学院基于视觉的系统让机器了解自身机体
  • 机器人芯片(腾讯元宝)
  • 合同审核:法务的“冰与火之歌”,如何唱出企业安全新篇章?
  • Python趣味算法:实现任意进制转换算法原理+源码
  • [hot 100]两数之和-Python3-Hash Table
  • 物联网_TDengine_EMQX_性能测试
  • Java 大视界 -- Java 大数据在智能交通自动驾驶车辆与周边环境信息融合与决策中的应用(357)
  • UE5 UI 水平框
  • RAG(检索增强生成)里的文档管理
  • Jiasou TideFlow AIGC SEO Agent:全自动外链构建技术重构智能营销新标准
  • UE5 UI 安全区
  • powerquery如何实现表的拼接主键
  • 零事故网站重构:11步标准化流程与风险管理指南
  • 小鹏汽车视觉算法面试30问全景精解
  • JavaScript AJAX 实现,演示如何将 Token 添加到 Authorization
  • Android ViewModel 深度解析:原理、使用与最佳实践
  • MCP消息协议和传输协议(Java角度)
  • Apache Ignite 长事务终止机制
  • -----------------------------------事务--------------------------
  • android 12 的 aidl for HAL 开发示例