MongoDB

MongoDB介绍

MongoDB而是一款基于“分布式存储”的非关系型数据库(NoSQL),是一款专为扩展性、高性能和高可用而设计的数据库,它可以从单节点部署扩展到大型、复杂的多数据中心架构,也能提供高性能的数据读写操作;而且提供了数据复制、无感知的故障自动选主等功能,从而实现数据节点高可用。

核心存储格式:BSON

  • 全称:Binary JSON(二进制JSON)。

  • 优势:存储和扫描效率高于普通JSON。

  • 代价:空间占用更大。

  • 扩展:在JSON基础上增加了更多数据类型和元数据描述。

2. 半结构化特性

  • 结构性:BSON保留JSON特性,可便捷存储复杂嵌套数据(如数组、对象)。

  • 灵活性(与关系型数据库对比)

    • 关系型数据库(强结构化):需预先定义表结构,字段必须一一对应,结构变更时插入会报错,修改繁琐。

    • MongoDB(半结构化):无需预定义结构,同一集合(Collection)中的文档(Document)可以有不同的字段,适应灵活多变的数据模型。

3. 文档型数据库

  • 基本单位:数据以文档(Document)形式存储,文档由一组 K-V(键值对)组成。

  • 组成规则

    • Key:必须是字符串。

    • Value:可以是任意BSON支持的类型(字符串、数值、数组、嵌套文档等)。

  • 直观理解:可以把一个MongoDB文档看作一个JSON对象。

4. 与MySQL的逻辑结构对比

MySQL

MongoDB

数据库(DataBase)

数据库(DataBase)

数据表(Table)

数据集合(Collection)

数据行(Row)

数据文档(Document)

列/字段(Column)

字段(Field)

索引(Index)

索引(Index)

核心理念:两者层级结构类似,只是术语和具体实现细节不同。MongoDB中的“集合”对应MySQL的“表”,“文档”对应“行”。

MongoDB安装

MongoDB环境搭建

 # 创建MongoDB目录
 mkdir -p /usr/local/mongodb/
 ​
 # 切换目录(可以文件包上传或wget下载)
 cd /usr/local/mongodb/
 ​
 # wget下载6.0.8版本(下载不了就去网页下载然后上传)
 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-6.0.8.tgz
 ​
 # 解压对应目录
 tar -xvzf mongodb-linux-x86_64-rhel80-6.0.8.tgz
 ​
 # 并重命名
 mv mongodb-linux-x86_64-rhel80-6.0.8 mongodb6.0.8
 ​
 # 为了方便启动,咱们可以将bin目录拷贝出来
 cp -a mongodb6.0.8/bin /usr/local/mongodb/bin
 ​
 # 创建单机版MongoDB存储配置文件、数据、日志的目录
 mkdir -p /usr/local/mongodb/data/standalone
 mkdir -p /usr/local/mongodb/log/standalone
 mkdir -p /usr/local/mongodb/conf/standalone
 ​
 ## 注释:
 data/standalone 存放数据文件(集合数据、索引数据)
 log/standalone  存放运行日志
 conf/standalone 存放配置文件
 ​
 # 编写MongoDB核心配置文件(没有会自动创建)
 vim /usr/local/mongodb/conf/standalone/mongodb.conf
 ​
 # yaml配置,及注释含义(注释可以复制不影响)
     # ========== 日志配置 ==========
 systemLog:
     destination: file            # 日志输出到文件(而非控制台)
     path: "/usr/local/mongodb/log/standalone/mongodb.log"
     logAppend: true              # 重启时追加日志(false = 覆盖)
 ​
 # ========== 数据存储配置 ==========
 storage:
     dbPath: "/usr/local/mongodb/data/standalone"
 ​
 # ========== 进程管理配置 ==========
 processManagement:
     fork: true                   # 以后台守护进程方式运行
 ​
 # ========== 网络配置 ==========
 net:
     bindIp: 0.0.0.0              # 监听所有网卡(生产环境换成具体 IP)
     port: 27017                  # 默认端口
     
 ## 注释:
 各配置项的作用:
 systemLog.destination: file —— 将日志写入文件,比输出到控制台更便于排查问题
 systemLog.logAppend: true —— 追加模式,重启不会清空旧日志
 storage.dbPath —— MongoDB 所有数据(集合、索引、日志)都存储在这个目录下
 processManagement.fork: true —— 将进程放到后台运行,终端关闭后服务不中断
 net.bindIp: 0.0.0.0 —— 0.0.0.0 表示监听本机所有 IP;生产环境应改为具体内网 IP,避免暴露到公网
 ​
 # 启动服务(已设置环境变量)(无法启动运行兼容问题看下面)
 mongod -f /usr/local/mongodb/conf/standalone/mongodb.conf
 ​
 # 验证进程是否正常
 ps aux | grep mongod
 ​
 # 查看端口是否在监听
 ss -tlnp | grep 27017

为旧版 MongoDB 补充它所需的 OpenSSL 1.1 运行环境

 # 从阿里云镜像获取稳定版本下载 OpenSSL 1.1 RPM 包(在可联网的机器上执行)
 ALIYUN_BASE="https://mirrors.aliyun.com/centos/8.5.2111/BaseOS/x86_64/os/Packages/"
 wget ${ALIYUN_BASE}openssl-libs-1.1.1k-5.el8_5.x86_64.rpm
 wget ${ALIYUN_BASE}openssl-1.1.1k-5.el8_5.x86_64.rpm
 ​
 # 安装 OpenSSL 1.1 库(在目标 RHEL 9 服务器上执行)
 # 先安装 libs
 rpm -ivh --nodeps --force openssl-libs-1.1.1k-5.el8_5.x86_64.rpm
 ​
 # 再安装主程序
 rpm -ivh --nodeps --force openssl-1.1.1k-5.el8_5.x86_64.rpm
 ​
 # 刷新动态链接库缓存(至关重要)
 ldconfig
 ​
 # 验证库是否可用
 ldconfig -p | grep libssl.so.1.1
 ​
 ## 注意:
 安全风险:你安装的 OpenSSL 1.1.1k 是较旧版本,包含已知安全漏洞。

客户端工具

到了MongoDB6.x版本,官方不再默认内置Shell客户端工具,想要使用则需额外下载:官方Shell工具,这里咱们照样以wget方式下载:

 # 下载
 wget https://downloads.mongodb.com/compass/mongosh-1.10.3-linux-x64.tgz
 ​
 # 解压
 tar -zxvf mongosh-1.10.3-linux-x64.tgz
 ​
 # 拷贝bin目录下的Shell工具,放到原本的bin目录中
 cp /usr/local/mongodb/mongosh-1.10.3-linux-x64/bin/mongosh /usr/local/mongodb/bin/
 ​
 # 再通过mongosh来连接测试(已设置环境变量)
 mongosh -port 27017
 test> show dbs;
 ​
 # 如果上述操作执行完成后,能正常显示三个默认库,说明MongoDB安装成功。
 admin   40.00 KiB
 config  12.00 KiB
 local   40.00 KiB

关闭MongoDB服务,这里有三种方式

 # 1.通过启动项来关闭(已设置环境变量)
 mongod --shutdown -f /usr/local/mongodb/conf/standalone/mongodb.conf
 ​
 # 2.先通过客户端连接MongoDB服务,再进入admin库关闭(执行完后客户端会报连接出错)
 mongosh -port 27017
 test> use admin;
 test> db.shutdownServer();
 ​
 # 3.通过kill命令+进程号强杀进程(不推荐)
 一般推荐使用前面两种,因为kill强杀进程,可能会导致数据损坏
 kill -9 [pid]
 ​
 # 如果损坏则需手动修复:
 # 先删除数据目录下的所有锁文件
 rm -rf /usr/local/mongodb/data/standalone/*.lock
 # 再通过启动项对数据目录进行修复
 mongod --repair --dbpath=/usr/local/mongodb/data/standalone

外部连接操作

为了外部可以连接,需要开放MongoDB端口、更新防火墙(关闭防火墙也行):

 # 在 public 区域添加规则:永久开放 TCP 端口 27017
 firewall-cmd --zone=public --add-port=27017/tcp --permanent
 ​
 # 重新加载防火墙配置,使新规则立即生效
 firewall-cmd --reload
 ​
 # 列出 public 区域当前所有已开放的端口
 firewall-cmd --zone=public --list-ports