MongoDB 业务背景及方案设计
一、业务背景
1.1 项目信息
| 项目 | 说明 |
|---|---|
| 时间 | 2023.6 - 2024.9 |
| 产品类型 | 互联网动态站点 商城 |
| 用户数量 | 25000 - 30000(用户量猛增) |
| PV | 1000000 - 5000000(24小时访问次数总和) |
| DAU | 10000 - 20000(每日活跃用户数) |
1.2 业务需求
用户访问日志存储在 Web 服务器 access.log 中,需要集中化存储和分析。
1.3 运维架构设计
采用 MongoDB 数据库存储用户访问日志,使用单台服务器实现:
1. 访问日志集中化存储 - 统一收集各 Web 服务器日志 2. 用户行为分析 - 在 MongoDB 中筛选查看信息,实现用户行为分析
---
二、MongoDB 概述
2.1 MongoDB 介绍
数据库排名: https://db-engines.com/en/ranking
关系型数据库(RDBMS):
- 通过设计表结构,使用 SQL 语句进行操作
- 常见:MySQL、Oracle(商业)、DB2(IBM)、SQL Server(微软)、PostgreSQL
非关系型数据库(NoSQL):
- 泛指非关系数据库,存储格式 key => value
- 常见:Memcached、Redis(内存缓存)、MongoDB(文档型数据库)
MongoDB 定位:
- Document Store(文档型数据库)
- 可适用于大部分 MySQL 场景
2.2 存储介质对比
| 数据库类型 | 存储介质 | 代表数据库 |
|---|---|---|
| 关系型数据库 | 硬盘 | MySQL/MariaDB/SQL Server/Oracle |
| 非关系型数据库 | 内存(MongoDB 例外) | Redis |
| MongoDB | 磁盘 + 内存加速 | MongoDB |
注意: MongoDB 不是纯内存数据库,只是极度依赖内存做加速。真正的数据可靠性仍靠磁盘存储和日志机制保障。
2.3 MongoDB 特点
存储性
- 适合存储大量没有规则、无序的数据
- 存储量大:单表可实现存储 PB 级别数据
存储单位换算:
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB效率性
MongoDB 与 MySQL 效率对比:
| 对比项 | MongoDB | MySQL |
|---|---|---|
| 数据模型 | 文档(BSON) | 关系表 |
| 查询语言 | MQL(MongoDB Query Language) | SQL |
| 事务支持 | 支持多文档事务 | 完整 ACID 事务 |
| 扩展方式 | 水平扩展(分片) | 垂直扩展为主 |
| 适用场景 | 大量非结构化数据 | 结构化数据 |
2.4 术语与概念对比
| SQL 术语 | MongoDB 术语 | 说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column/field | field | 数据字段/域 |
| index | index | 索引 |
| table joins | - | 表连接,MongoDB 不支持 |
| primary key | primary key | 主键,MongoDB 自动将 _id 字段设置为主键 |
2.5 BSON 格式
BSON(Binary JSON) 是 MongoDB 用来存储和传输数据的核心格式。
特点:
- 类 JSON 结构 - 支持嵌套文档和数组
- 二进制编码 - 比 JSON 更快、更高效
- 无固定结构 - 适合存储灵活的非结构化数据
三大优点: 1. 轻量 - 结构紧凑,适合传输 2. 可遍历 - 支持快速定位字段 3. 高效 - 读取某字段无需解析整个文档
示例:
{
title: "MongoDB", // 字符串类型
last_editor: "192.168.1.122", // 字符串类型
last_modified: new Date(), // 日期类型
body: "MongoDB introduction", // 字符串类型
categories: ["Database", "NoSQL", "BSON"], // 数组类型
reviewed: false // 布尔类型
}---
三、MongoDB 安装
3.1 安装方式
官方网站: https://www.mongodb.com/
下载地址:
- MongoDB Server: https://www.mongodb.com/try/download/community
- MongoDB Shell: https://www.mongodb.com/try/download/shell
3.2 环境准备
前提条件:
- 更改主机名称、IP 地址
- 关闭防火墙、SELinux
- 时间同步
- 安装必备软件:vim、wget、rsync、net-tools、bash-completion
3.3 配置官方 YUM 源
# 创建 MongoDB yum 源配置文件
vim /etc/yum.repos.d/mongodb-org.repo命令作用:
- 这条命令用于打开并编辑文件。进入编辑器后需要保存退出,修改才会写回文件。
执行结果:
- 编辑器会打开目标文件;保存并退出后文件内容才会改变。
关键参数:
注意事项:
[mongodb-org-8.0] baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/8.0/x86_64/ gpgcheck=0 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-8.0.asc
**注意事项:**
关键参数:
注意事项:
});});
security:注意事项:
**关键参数:**
**注意事项:**
**基本语法:**案例:备份整个数据库
**参数说明:**
**备份后目录结构:**itheima_backup/
**查看备份文件信息:**如果需要身份验证:
**常见备份异常说明:**
备份所有数据库:
#!/bin/bash
HOST="10.0.0.100"
PORT="27017"
USER="admin"
PASS="123456"
AUTH_DB="admin"
OUT_DIR="/backup/itheima_backup"基本语法:
**案例:还原数据库**参数说明:
如果需要身份验证:
注意事项:
---
数据结构: { }, }
**题目:**
**答案:**
db.students.insertOne({
})
db.students.insertMany([
{
},
{
},
{
}
])
db.students.find()
数据结构: { }
**题目:**
**答案:**
db.employees.insertMany([
{
},
{
}
])
db.employees.updateOne(
)
db.employees.updateMany(
)
---
解决:
解决:
示例:
**注意事项:**
**解决:**答案:
为什么比传统关系型数据库快?