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. 升级建议
- 备份数据:使用
mongodump
导出旧数据。 - 部署新版本(如 MongoDB 6.0),并测试兼容性。
- 优化索引:对
messages.timestamp
、user.status
等高频查询字段建立索引。
3. 性能调优
- 启用 WiredTiger 压缩(
snappy
或zstd
)减少存储占用。 - 使用 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. 读写操作流程
- 读操作:
- 客户端发送查询请求到 mongod。
- mongod 检查查询是否可通过索引完成,若否则进行全表扫描。
- 从内存(Page Cache)或磁盘读取数据,返回 BSON 格式结果。
- 写操作:
- 客户端发送写入请求(如
insert
,update
)。 - mongod 验证数据有效性,应用写入操作。
- 写入操作记录到预写日志(WiredTiger 的
journal
)确保原子性。 - 定期将内存中的脏数据刷新到磁盘(检查点机制)。
- 客户端发送写入请求(如
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. 安装后的基本配置
- 配置文件位置:
- Linux:
/etc/mongod.conf
- macOS:
/usr/local/etc/mongod.conf
- Linux:
- 重要配置参数:
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
- 启动/停止服务:
# 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. 生产环境注意事项
- 启用身份验证:
# 在 mongod.conf 中添加
security:authorization: enabled
创建管理员用户:
use admin
db.createUser({user: "admin",pwd: "password",roles: ["root"]
})
- 禁用远程匿名访问:
# 将 bindIp 改为服务器实际 IP 或 127.0.0.1
net:bindIp: 127.0.0.1
- 配置防火墙:
# Ubuntu/Debian
sudo ufw allow 27017/tcp# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=27017/tcp
sudo firewall-cmd --reload
- 数据备份:
# 使用 mongodump 备份
mongodump --out /backup/mongodb/$(date +%Y%m%d)# 使用 mongorestore 恢复
mongorestore /backup/mongodb/20250722
总结
MongoDB 的灵活数据模型和分布式架构使其适合高并发、大数据量的应用场景。安装时需根据实际需求调整配置,生产环境中尤其要关注安全、性能和高可用性。