跳到主要内容

第1章 MongoDB介绍及安装

1.1 关系型与非关系型

NoSQL(Not Only SQL)指的是非关系型的数据库,是对不同于传统关系型数据库的数据库管理系统的统称。对NoSQL最普遍的解释是"非关联型的",强调Key-Value Stores和文档数据库的优点。

NoSQL用于超大规模数据的存储,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。随着用户个人信息、社交网络、地理位置、用户生成数据和操作日志成倍增加,传统SQL数据库已经不适合这些应用场景,NoSQL数据库能很好地处理这些大数据。

💡 核心理念

NoSQL数据库专为大规模、非结构化数据设计,适合数据模型频繁变化的现代应用。

MongoDB的特点

高性能:MongoDB提供高性能的数据持久性,支持嵌入式数据模型减少数据库系统的I/O操作,索引支持快速查询,并且可以包括嵌入式文档和数组中的键。

丰富的查询语言:MongoDB支持丰富的查询语言来支持读写操作(CRUD)以及数据汇总、文本搜索和地理空间索引。

高可用性:MongoDB的复制工具称为副本集,提供自动故障转移和数据冗余。

水平可扩展性:MongoDB提供水平扩展能力,通过分片将数据分布在一组计算机上。

支持多种存储引擎:WiredTiger存储引擎、MMAPv1存储引擎和InMemory存储引擎。

MongoDB的应用场景

游戏场景:存储游戏用户信息,用户装备、积分等以内嵌文档形式存储,方便查询更新。

物流场景:存储订单信息,订单状态在运送过程中不断更新,以MongoDB内嵌数组形式存储,一次查询获取订单所有变更。

社交场景:存储用户信息和朋友圈信息,通过地理位置索引实现附近的人、地点等功能。

物联网场景:存储智能设备信息和设备汇报的日志信息,进行多维度分析。

视频直播:存储用户信息、礼物信息、用户评论等。

电商场景:商品具有灵活属性结构,如服装的尺寸、颜色等差异化属性,上衣有肩宽、胸围、袖长,裤子有臀围、脚口、裤长等。

MongoDB相比MySQL的优势

大规模数据处理:MongoDB通过分布式架构支持大数据量存储处理,提供更高效的水平扩展能力,通过增加服务器处理更多数据,而不依赖单个数据库服务器性能。

高速缓存应用:读写速度快,特别适合作为数据缓存层,灵活的文档结构比MySQL表结构更适合频繁变化的数据模式。

实时分析应用:支持实时查询处理,适合快速数据分析和实时反馈应用,非阻塞式IO和复制特性使数据读取更高效。

物联网和时序数据:有效处理存储大量时间标记数据,在处理大量结构多变数据时显示优势。

内容管理系统:可存储各种格式数据如文本、图片等,灵活的文档存储和快速查询性能适合管理大型多样化内容。

移动应用:文档模型易于映射到对象模型,使开发更直接高效。

选择MongoDB的场景

  • 数据量特别大(TB级别)
  • 应用不需要复杂事务和复杂Join
  • 高频读写,数据安全不丢失
  • 新应用需求经常变化,数据模型不固定,需要快速迭代开发
  • 高可用性,快速水平扩容
📋 对比其他数据库
  • MySQL:安全但性能不高,扩展不方便,维护成本高
  • Redis:速度快但不支持复杂查询
  • MongoDB:支持条件查询,速度比MySQL快,自带高可用架构,数据结构灵活

MongoDB和MySQL数据对比

MongoDB支持的数据结构非常松散,使用类似JSON格式的压缩格式BSON,相比MySQL的行列存储更灵活。MongoDB也有库和表(集合)的概念,但约束比MySQL宽松,不同字段的数据可以存在于同一个集合里。

数据格式对比

MySQL数据格式:
user库 - user_info表
name age job
oldzhang 24 IT
cookzhang 28 cook
xiaozhang 26 IT

MongoDB数据格式:
user库 - user_info集合
{ name:"oldzhang", age:"24", job:"IT" }
{ name:"cookzhang", age:"28", job:"cook" }
{ name:"xiaozhang", age:"26", job:"IT" }
{ name:"cookya", age:"23", job:"cook", host:"XZ" }

概念对应关系

MySQL概念MongoDB概念说明
databasedatabase数据库
tablecollection表/集合
rowdocument行/文档
columnfield列/字段
indexindex索引
table join嵌套文档MongoDB通过嵌套文档替代多表连接
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

安装部署

系统环境准备

# 安装依赖包
yum install libcurl openssl -y

目录规划

# 软件所在目录
/opt/mongodb
# 单节点目录
/opt/mongo_27017/{conf,log,pid}
# 数据目录
/data/mongo_27017

下载安装

# 下载地址
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz

# 解压安装
tar zxf mongodb-linux-x86_64-rhel70-4.0.14.tgz -C /opt/
cd /opt/
ln -s mongodb-linux-x86_64-rhel70-4.0.14 mongodb

# 创建目录
mkdir -p /opt/mongo_27017/{conf,log,pid}
mkdir -p /data/mongo_27017

配置文件

cat >/opt/mongo_27017/conf/mongodb.conf<<EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo_27017/log/mongodb.log

storage:
journal:
enabled: true
dbPath: /data/mongo_27017
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true

processManagement:
fork: true
pidFilePath: /opt/mongo_27017/pid/mongod.pid

net:
port: 27017
bindIp: 127.0.0.1,10.0.0.51
EOF

配置文件说明

systemLog 日志配置

  • destination: file:日志输出到文件
  • logAppend: true:重启时在现有日志文件末尾追加,不创建新文件
  • path:日志文件存储路径

storage 存储配置

  • journal: enabled: true:启用回滚日志,保证数据持久性和一致性
  • dbPath:数据库文件存储路径
  • directoryPerDB: true:为每个数据库创建单独目录,便于管理和隔离
  • wiredTiger:WiredTiger存储引擎配置
    • cacheSizeGB: 0.5:分配0.5GB内存缓存
    • directoryForIndexes: true:为索引创建单独目录
    • blockCompressor: zlib:使用zlib压缩数据块,减少磁盘占用
    • prefixCompression: true:开启索引前缀压缩

processManagement 进程管理

  • fork: true:以守护进程方式后台运行
  • pidFilePath:PID文件路径

net 网络配置

  • port: 27017:监听端口
  • bindIp:绑定IP地址,允许本地和指定IP连接

启动和管理

# 配置环境变量
echo 'export PATH=/opt/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile

# 启动MongoDB
/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf

# 验证启动
ps -ef | grep mongo
netstat -lntup | grep mongo

# 连接数据库
mongo

关闭MongoDB

# 方法1:推荐方式
mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown

# 方法2:命令行方式(仅localhost连接)
mongo
use admin
db.shutdownServer()

生产环境优化

用户权限配置

⚠️ 生产环境安全

生产环境禁止使用root用户运行MongoDB,必须创建专用用户并配置systemd服务。

# 关闭MongoDB服务
mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown

# 创建专用用户
groupadd mongo -g 777
useradd mongo -g 777 -u 777 -M -s /sbin/nologin

# 配置systemd服务文件
cat >/usr/lib/systemd/system/mongod.service<<EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target

[Service]
User=mongo
Group=mongo
ExecStart=/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf
ExecStartPre=/usr/bin/chown -R mongo:mongo /opt/mongo_27017/
ExecStartPre=/usr/bin/chown -R mongo:mongo /data/mongo_27017/
PermissionsStartOnly=true
PIDFile=/opt/mongo_27017/pid/mongod.pid
Type=forking
LimitNOFILE=64000
LimitNPROC=64000
LimitMEMLOCK=infinity
TasksMax=infinity

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl start mongod.service
systemctl enable mongod.service

系统参数优化

⚠️ 系统参数修改

修改系统参数后必须重启MongoDB服务才能生效,建议在维护窗口进行。

# 关闭透明大页
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag

# 优化系统限制
cat >> /etc/security/limits.conf <<EOF
mongo soft nofile 64000
mongo hard nofile 64000
mongo soft nproc 64000
mongo hard nproc 64000
EOF

# 重启MongoDB验证
systemctl restart mongod
mongo

常见问题处理

内存缓存警告

警告信息

WARNING: The configured WiredTiger cache size is more than 80% of available RAM.

解决方案

  • 增加服务器内存
  • 调整配置文件中cacheSizeGB参数,建议不超过可用内存的80%

访问控制警告

警告信息

WARNING: Access control is not enabled for the database.
💡 最佳实践

生产环境必须启用用户认证和访问控制,参考用户权限管理章节配置。

进程限制过低

警告信息

WARNING: soft rlimits too low. rlimits set to 7193 processes, 65535 files.

解决方案

# 在/etc/security/limits.conf中添加
* soft nofile 65535
* hard nofile 65535
* soft nproc 32768
* hard nproc 32768

监控服务提醒

提醒信息:MongoDB免费云监控服务

关闭方法

# 连接MongoDB后执行
db.disableFreeMonitoring()
📊 监控建议

生产环境建议使用专业监控工具如Prometheus、Grafana等,而非MongoDB自带的云监控服务。

更新: 2025-01-26