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: 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

  2. 启动/停止服务

    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

  2. 配置防火墙

    Ubuntu/Debian

    sudo ufw allow 27017/tcp

    CentOS/RHEL

    sudo firewall-cmd --permanent --add-port=27017/tcp
    sudo firewall-cmd --reload

  3. 数据备份

    使用 mongodump 备份

    mongodump --out /backup/mongodb/$(date +%Y%m%d)

    使用 mongorestore 恢复

    mongorestore /backup/mongodb/20250722

总结

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

相关推荐
GottdesKrieges17 分钟前
obd运维OceanBase数据库的常见场景
运维·数据库·oceanbase
慢慢沉2 小时前
Lua(数据库访问)
开发语言·数据库·lua
武子康6 小时前
Java-82 深入浅出 MySQL 内部架构:服务层、存储引擎与文件系统全覆盖
java·开发语言·数据库·学习·mysql·spring·微服务
vdoi8 小时前
【Mysql】 Mysql zip解压版 Win11 安装备忘
数据库·mysql
TDengine (老段)9 小时前
TDengine 转化类函数 TO_CHAR 用户手册
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
程序员编程指南9 小时前
Qt 与 SQLite 嵌入式数据库开发
c语言·数据库·c++·qt
fht19 小时前
SQLite
数据库·sqlite
float_六七10 小时前
MySQL索引背后的B+树奥秘
数据库·b树·mysql
Java初学者小白11 小时前
秋招Day18 - MyBatis - 基础
java·数据库·mybatis