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

简介: 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.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. 读写操作流程

  • 读操作:
  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
  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 的灵活数据模型和分布式架构使其适合高并发、大数据量的应用场景。安装时需根据实际需求调整配置,生产环境中尤其要关注安全、性能和高可用性。

目录
相关文章
|
存储 关系型数据库 分布式数据库
喜报|阿里云PolarDB数据库(分布式版)荣获国内首台(套)产品奖项
阿里云PolarDB数据库管理软件(分布式版)荣获「2024年度国内首版次软件」称号,并跻身《2024年度浙江省首台(套)推广应用典型案例》。
|
NoSQL MongoDB 数据库
数据库数据恢复—MongoDB数据库数据恢复案例
MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍然开启的情况下将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据库原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然无法使用,报错“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,展现卓越性能与性价比。其轻量版满足国产化需求,兼具高性能与低成本,适用于多种场景,推动数据库技术革新与发展。
|
缓存 NoSQL Linux
在CentOS 7系统中彻底移除MongoDB数据库的步骤
以上步骤完成后,MongoDB应该会从您的CentOS 7系统中被彻底移除。在执行上述操作前,请确保已经备份好所有重要数据以防丢失。这些步骤操作需要一些基本的Linux系统管理知识,若您对某一步骤不是非常清楚,请先进行必要的学习或咨询专业人士。在执行系统级操作时,推荐在实施前创建系统快照或备份,以便在出现问题时能够恢复到原先的状态。
1398 79
|
存储 NoSQL 前端开发
【赵渝强老师】MongoDB的分布式存储架构
MongoDB分片通过将数据分布到多台服务器,实现海量数据的高效存储与读写。其架构包含路由、配置服务器和分片服务器,支持水平扩展,结合复制集保障高可用性,适用于大规模生产环境。
736 1
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
|
运维 NoSQL 容灾
告别运维噩梦:手把手教你将自建 MongoDB 平滑迁移至云数据库
程序员为何逃离自建MongoDB?扩容困难、运维复杂、高可用性差成痛点。阿里云MongoDB提供分钟级扩容、自动诊断与高可用保障,助力企业高效运维、降本增效,实现数据库“无感运维”。
|
SQL 存储 分布式数据库
分布式存储数据恢复—hbase和hive数据库数据恢复案例
分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障: 数据库底层文件被误删除,数据库不能使用。要求恢复hbase和hive数据库。
685 12
|
NoSQL MongoDB 数据库
数据库数据恢复——MongoDB数据库服务无法启动的数据恢复案例
MongoDB数据库数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 管理员在未关闭MongoDB服务的情况下拷贝数据库文件。将MongoDB数据库文件拷贝到其他分区后,对MongoDB数据库所在原分区进行了格式化操作。格式化完成后将数据库文件拷回原分区,并重新启动MongoDB服务。发现服务无法启动并报错。
|
存储 NoSQL MongoDB
微服务——MongoDB常用命令1——数据库操作
本节介绍了 MongoDB 中数据库的选择、创建与删除操作。使用 `use 数据库名称` 可选择或创建数据库,若数据库不存在则自动创建。通过 `show dbs` 或 `show databases` 查看所有可访问的数据库,用 `db` 命令查看当前数据库。注意,集合仅在插入数据后才会真正创建。数据库命名需遵循 UTF-8 格式,避免特殊字符,长度不超过 64 字节,且部分名称如 `admin`、`local` 和 `config` 为系统保留。删除数据库可通过 `db.dropDatabase()` 实现,主要用于移除已持久化的数据库。
942 0

热门文章

最新文章

推荐镜像

更多