首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉

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

原创
作者头像
卓伊凡
发布2025-07-23 03:20:37
发布2025-07-23 03:20:37
3770
举报

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. 数据结构设计

代码语言:javascript
复制
// 用户文档
{
  "_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 上安装
代码语言:javascript
复制
# 导入 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 上安装
代码语言:javascript
复制
# 创建 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)
代码语言:javascript
复制
# 安装 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
  2. 重要配置参数
代码语言:javascript
复制
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log  # 日志路径
  logAppend: true
storage:
  dbPath: /var/lib/mongo  # 数据文件路径
  journal:
    enabled: true
net:
  port: 27017
  bindIp: 0.0.0.0  # 监听所有IP,生产环境建议改为具体IP
  1. 启动/停止服务
代码语言:javascript
复制
# 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. 连接与验证
代码语言:javascript
复制
# 连接到 MongoDB 服务
mongosh

# 在 shell 中验证
> db.version()  # 查看版本
> db.createCollection("test")  # 创建集合
> db.test.insertOne({name: "MongoDB"})  # 插入文档
> db.test.find()  # 查询文档
6. 生产环境注意事项
  1. 启用身份验证
代码语言:javascript
复制
# 在 mongod.conf 中添加
security:
  authorization: enabled

创建管理员用户:

代码语言:javascript
复制
use admin
db.createUser({
  user: "admin",
  pwd: "password",
  roles: ["root"]
})
  1. 禁用远程匿名访问
代码语言:javascript
复制
# 将 bindIp 改为服务器实际 IP 或 127.0.0.1
net:
  bindIp: 127.0.0.1
  1. 配置防火墙
代码语言:javascript
复制
# Ubuntu/Debian
sudo ufw allow 27017/tcp

# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=27017/tcp
sudo firewall-cmd --reload
  1. 数据备份
代码语言:javascript
复制
# 使用 mongodump 备份
mongodump --out /backup/mongodb/$(date +%Y%m%d)

# 使用 mongorestore 恢复
mongorestore /backup/mongodb/20250722

总结

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
    • MongoDB 简介
    • MongoDB 发展史(版本演进)
    • MongoDB 相比其他数据库的优势
      • 1. 灵活的数据模型(Schema-less)
      • 2. 高性能读写
      • 3. 高可扩展性(分片+副本集)
      • 4. 适合即时通讯场景
    • MongoDB 在蜻蜓I水银版即时通讯中的应用建议
      • 1. 数据结构设计
      • 2. 升级建议
      • 3. 性能调优
    • 总结
      • MongoDB 运行原理详解
      • MongoDB 安装方法
      • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档