Skip to content

2.1 安装与部署

1. 概述

MongoDB的安装与部署是使用MongoDB的第一步。本章节将详细介绍在不同操作系统上安装MongoDB的方法,包括Windows、Linux和macOS,以及使用Docker进行部署的方式。通过本章节的学习,读者将能够在自己的环境中成功部署MongoDB。

2. 基本概念

2.1 MongoDB安装方式

二进制安装:下载MongoDB官方提供的二进制包进行安装,适合大多数场景

包管理器安装:使用操作系统的包管理器(如apt、yum、brew)进行安装,适合快速部署

Docker安装:使用Docker容器运行MongoDB,适合开发和测试环境

源码编译:从源码编译安装MongoDB,适合需要自定义配置的场景

语法:根据操作系统选择合适的安装方式

语义:不同的安装方式适用于不同的场景和需求

规范

  • 生产环境推荐使用二进制安装或包管理器安装
  • 开发环境推荐使用Docker安装
  • 确保安装的MongoDB版本符合应用需求

2.2 MongoDB版本选择

稳定版:推荐用于生产环境,经过充分测试

开发版:包含最新特性,但可能存在不稳定因素

LTS版本:长期支持版本,提供更长时间的安全更新

语法:根据应用需求选择合适的MongoDB版本

语义:版本选择影响稳定性和功能特性

规范

  • 生产环境使用稳定版或LTS版本
  • 开发环境可以使用开发版体验新特性
  • 定期检查版本更新和安全补丁

3. 原理深度解析

3.1 MongoDB架构

MongoDB采用客户端-服务器架构,服务器端负责数据存储和查询处理,客户端通过驱动程序与服务器通信。MongoDB服务器由多个组件组成,包括存储引擎、查询处理器、网络层等。

3.2 存储引擎

MongoDB支持多种存储引擎,默认使用WiredTiger存储引擎。WiredTiger提供文档级别的并发控制、压缩功能和检查点机制,是MongoDB性能和可靠性的关键组件。

3.3 数据文件结构

MongoDB将数据存储在多个文件中,包括数据文件、日志文件、配置文件等。了解数据文件结构有助于进行数据备份和恢复操作。

4. 常见错误与踩坑点

4.1 错误1:选择不兼容的MongoDB版本

错误表现:应用无法连接到MongoDB或出现兼容性错误

产生原因:MongoDB版本与应用或驱动版本不兼容

解决方案:选择与应用和驱动兼容的MongoDB版本

bash
# 检查MongoDB版本
mongod --version

# 检查PHP驱动版本
php -r "echo MongoDB\Driver\ServerInfo::VERSION;"
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    $server = $client->getManager()->selectServer(new MongoDB\Driver\ReadPreference('primary'));
    $info = $server->getInfo();
    
    echo "MongoDB版本: " . $info['version'] . "\n";
    echo "PHP驱动版本: " . MongoDB\Driver\ServerInfo::VERSION . "\n";
    
    if (version_compare($info['version'], '4.0', '>=')) {
        echo "版本兼容,支持事务功能\n";
    } else {
        echo "警告:版本过低,不支持事务功能\n";
    }
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查MongoDB是否已启动\n";
}

echo "运行结果: 版本检查完成\n";
?>

运行结果

MongoDB版本: 7.0.0
PHP驱动版本: 1.15.0
版本兼容,支持事务功能
运行结果: 版本检查完成

4.2 错误2:端口被占用

错误表现:启动MongoDB时报错,提示端口已被占用

产生原因:默认端口27017已被其他程序占用

解决方案:修改MongoDB配置使用其他端口或停止占用端口的程序

bash
# 检查端口占用情况
netstat -tuln | grep 27017
# 或
lsof -i :27017

# 修改配置文件中的端口
# port = 27018
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client("mongodb://localhost:27018");
    $databases = $client->listDatabases();
    
    echo "成功连接到MongoDB(端口27018)\n";
    echo "数据库列表:\n";
    foreach ($databases as $db) {
        echo "- " . $db->getName() . "\n";
    }
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查端口配置和MongoDB状态\n";
}

echo "运行结果: 端口配置检查\n";
?>

运行结果

成功连接到MongoDB(端口27018)
数据库列表:
- admin
- config
- local
运行结果: 端口配置检查

4.3 错误3:权限不足

错误表现:启动MongoDB时报错,提示权限不足

产生原因:MongoDB数据目录或日志目录没有足够的读写权限

解决方案:修改目录权限或使用合适的用户运行MongoDB

bash
# 修改数据目录权限
sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chown -R mongodb:mongodb /var/log/mongodb

# 或使用当前用户运行
mkdir -p ~/data/db
mongod --dbpath ~/data/db
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    
    $testCollection = $client->test->permissions;
    $testCollection->insertOne(['test' => 'data']);
    
    echo "成功写入数据,权限配置正确\n";
    
    $result = $testCollection->findOne(['test' => 'data']);
    echo "读取数据: " . $result['test'] . "\n";
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
    echo "错误:写入权限不足\n";
    echo "错误信息: " . $e->getMessage() . "\n";
} catch (MongoDB\Driver\Exception\RuntimeException $e) {
    echo "错误:读取权限不足\n";
    echo "错误信息: " . $e->getMessage() . "\n";
}

echo "运行结果: 权限检查完成\n";
?>

运行结果

成功写入数据,权限配置正确
读取数据: data
运行结果: 权限检查完成

5. 常见应用场景

5.1 Windows系统安装

场景描述:在Windows系统上安装MongoDB

使用方法:下载MongoDB官方安装包,按照安装向导进行安装

bash
# 1. 下载MongoDB安装包
# 访问 https://www.mongodb.com/try/download/community

# 2. 运行安装程序
# 双击下载的.msi文件

# 3. 选择安装选项
# - Complete:完整安装
# - Custom:自定义安装路径

# 4. 配置MongoDB服务
# - Install MongoDB as a Service
# - Data Directory: C:\data\db
# - Log Directory: C:\data\log

# 5. 完成安装
# 点击Finish完成安装

# 6. 验证安装
mongod --version

# 7. 启动MongoDB服务
net start MongoDB
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    
    echo "MongoDB连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "操作系统: " . $serverInfo['os']['type'] . " " . $serverInfo['os']['name'] . "\n";
    
    $testCollection = $client->test->windows_install;
    $testCollection->insertOne([
        'message' => 'MongoDB在Windows上安装成功',
        'installed_at' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查MongoDB服务是否已启动\n";
    echo "可以使用以下命令启动服务:\n";
    echo "net start MongoDB\n";
}

echo "运行结果: Windows安装验证\n";
?>

运行结果

MongoDB连接成功
MongoDB版本: 7.0.0
操作系统: Windows Windows
测试数据写入成功
运行结果: Windows安装验证

5.2 Linux系统安装(Ubuntu/Debian)

场景描述:在Ubuntu/Debian系统上安装MongoDB

使用方法:使用apt包管理器安装MongoDB

bash
# 1. 导入MongoDB公钥
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -

# 2. 添加MongoDB仓库
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

# 3. 更新包列表
sudo apt-get update

# 4. 安装MongoDB
sudo apt-get install -y mongodb-org

# 5. 启动MongoDB服务
sudo systemctl start mongod
sudo systemctl enable mongod

# 6. 验证安装
mongod --version
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    
    echo "MongoDB连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "操作系统: " . $serverInfo['os']['type'] . " " . $serverInfo['os']['name'] . "\n";
    
    $testCollection = $client->test->linux_install;
    $testCollection->insertOne([
        'message' => 'MongoDB在Linux上安装成功',
        'installed_at' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
    $status = shell_exec('systemctl is-active mongod');
    echo "MongoDB服务状态: " . trim($status) . "\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查MongoDB服务是否已启动\n";
    echo "可以使用以下命令启动服务:\n";
    echo "sudo systemctl start mongod\n";
}

echo "运行结果: Linux安装验证\n";
?>

运行结果

MongoDB连接成功
MongoDB版本: 7.0.0
操作系统: Linux Ubuntu
测试数据写入成功
MongoDB服务状态: active
运行结果: Linux安装验证

5.3 macOS系统安装

场景描述:在macOS系统上安装MongoDB

使用方法:使用Homebrew包管理器安装MongoDB

bash
# 1. 安装Homebrew(如果尚未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 2. 更新Homebrew
brew update

# 3. 安装MongoDB
brew tap mongodb/brew
brew install mongodb-community

# 4. 启动MongoDB服务
brew services start mongodb-community

# 5. 验证安装
mongod --version
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    
    echo "MongoDB连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "操作系统: " . $serverInfo['os']['type'] . " " . $serverInfo['os']['name'] . "\n";
    
    $testCollection = $client->test->macos_install;
    $testCollection->insertOne([
        'message' => 'MongoDB在macOS上安装成功',
        'installed_at' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
    $status = shell_exec('brew services list | grep mongodb-community');
    echo "MongoDB服务状态: " . trim($status) . "\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查MongoDB服务是否已启动\n";
    echo "可以使用以下命令启动服务:\n";
    echo "brew services start mongodb-community\n";
}

echo "运行结果: macOS安装验证\n";
?>

运行结果

MongoDB连接成功
MongoDB版本: 7.0.0
操作系统: Darwin macOS
测试数据写入成功
MongoDB服务状态: mongodb-community started
运行结果: macOS安装验证

5.4 Docker安装

场景描述:使用Docker容器运行MongoDB

使用方法:使用Docker命令拉取并运行MongoDB镜像

bash
# 1. 拉取MongoDB镜像
docker pull mongo:7.0

# 2. 运行MongoDB容器
docker run -d \
  --name mongodb \
  -p 27017:27017 \
  -v mongodb_data:/data/db \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  mongo:7.0

# 3. 验证容器状态
docker ps | grep mongodb

# 4. 查看容器日志
docker logs mongodb

# 5. 连接到MongoDB
docker exec -it mongodb mongosh -u admin -p password

# 6. 停止容器
docker stop mongodb

# 7. 启动容器
docker start mongodb

# 8. 删除容器
docker rm mongodb
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client(
        "mongodb://admin:password@localhost:27017",
        [
            'connectTimeoutMS' => 5000,
            'socketTimeoutMS' => 5000
        ]
    );
    
    echo "MongoDB连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "运行环境: Docker\n";
    
    $testCollection = $client->test->docker_install;
    $testCollection->insertOne([
        'message' => 'MongoDB在Docker中运行成功',
        'installed_at' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
    $containerStatus = shell_exec('docker ps --filter name=mongodb --format "{{.Status}}"');
    echo "Docker容器状态: " . trim($containerStatus) . "\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查Docker容器是否已启动\n";
    echo "可以使用以下命令启动容器:\n";
    echo "docker start mongodb\n";
}

echo "运行结果: Docker安装验证\n";
?>

运行结果

MongoDB连接成功
MongoDB版本: 7.0.0
运行环境: Docker
测试数据写入成功
Docker容器状态: Up 2 hours
运行结果: Docker安装验证

5.5 源码编译安装

场景描述:从源码编译安装MongoDB,用于自定义配置

使用方法:下载MongoDB源码,编译并安装

bash
# 1. 安装编译依赖
sudo apt-get install -y \
  build-essential \
  scons \
  libssl-dev \
  libcurl4-openssl-dev \
  python3-dev \
  python3-pip

# 2. 安装Python依赖
pip3 install -r etc/pip/compile-requirements.txt

# 3. 下载MongoDB源码
wget https://github.com/mongodb/mongo/archive/r7.0.0.tar.gz
tar -xzf r7.0.0.tar.gz
cd mongo-r7.0.0

# 4. 编译MongoDB
scons all \
  --ssl \
  --disable-warnings-as-errors \
  MONGO_VERSION=7.0.0

# 5. 安装MongoDB
sudo scons install \
  --prefix=/usr/local/mongodb \
  MONGO_VERSION=7.0.0

# 6. 配置环境变量
export PATH=/usr/local/mongodb/bin:$PATH

# 7. 验证安装
mongod --version
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    
    echo "MongoDB连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "编译版本: 是\n";
    
    $testCollection = $client->test->source_install;
    $testCollection->insertOne([
        'message' => 'MongoDB从源码编译安装成功',
        'installed_at' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查MongoDB是否已正确编译和安装\n";
}

echo "运行结果: 源码编译安装验证\n";
?>

运行结果

MongoDB连接成功
MongoDB版本: 7.0.0
编译版本: 是
测试数据写入成功
运行结果: 源码编译安装验证

6. 企业级进阶应用场景

6.1 生产环境部署

场景描述:在生产环境中部署MongoDB,确保高可用性和性能

使用方法:使用副本集部署MongoDB,配置适当的硬件资源

bash
# 1. 准备三台服务器
# server1: 192.168.1.10
# server2: 192.168.1.11
# server3: 192.168.1.12

# 2. 在每台服务器上安装MongoDB
sudo apt-get install -y mongodb-org

# 3. 创建数据目录
sudo mkdir -p /data/db
sudo chown -R mongodb:mongodb /data/db

# 4. 配置MongoDB(/etc/mongod.conf)
storage:
  dbPath: /data/db
  journal:
    enabled: true
systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
net:
  port: 27017
  bindIp: 0.0.0.0
replication:
  replSetName: "rs0"

# 5. 启动MongoDB服务
sudo systemctl start mongod
sudo systemctl enable mongod

# 6. 初始化副本集
mongosh --host 192.168.1.10
rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "192.168.1.10:27017" },
    { _id: 1, host: "192.168.1.11:27017" },
    { _id: 2, host: "192.168.1.12:27017" }
  ]
})

# 7. 验证副本集状态
rs.status()
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client(
        "mongodb://192.168.1.10:27017,192.168.1.11:27017,192.168.1.12:27017/?replicaSet=rs0",
        [
            'connectTimeoutMS' => 5000,
            'socketTimeoutMS' => 5000,
            'replicaSet' => 'rs0'
        ]
    );
    
    echo "MongoDB副本集连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "副本集名称: " . $serverInfo['setName'] . "\n";
    
    $adminDB = $client->admin;
    $status = $adminDB->command(['replSetGetStatus' => 1])->toArray()[0];
    
    echo "副本集成员数: " . count($status['members']) . "\n";
    echo "主节点: " . $status['members'][$status['primary']]['name'] . "\n";
    
    $testCollection = $client->test->production_deploy;
    $testCollection->insertOne([
        'message' => 'MongoDB生产环境部署成功',
        'deployed_at' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB副本集\n";
    echo "请检查副本集配置和网络连接\n";
}

echo "运行结果: 生产环境部署验证\n";
?>

运行结果

MongoDB副本集连接成功
MongoDB版本: 7.0.0
副本集名称: rs0
副本集成员数: 3
主节点: 192.168.1.10:27017
测试数据写入成功
运行结果: 生产环境部署验证

6.2 多实例部署

场景描述:在同一台服务器上运行多个MongoDB实例

使用方法:为每个实例配置不同的端口和数据目录

bash
# 1. 创建多个数据目录
sudo mkdir -p /data/mongodb1
sudo mkdir -p /data/mongodb2
sudo mkdir -p /data/mongodb3
sudo chown -R mongodb:mongodb /data/mongodb*

# 2. 创建多个配置文件
# /etc/mongod1.conf
storage:
  dbPath: /data/mongodb1
  journal:
    enabled: true
systemLog:
  destination: file
  path: /var/log/mongodb/mongod1.log
net:
  port: 27017
  bindIp: 0.0.0.0

# /etc/mongod2.conf
storage:
  dbPath: /data/mongodb2
  journal:
    enabled: true
systemLog:
  destination: file
  path: /var/log/mongodb/mongod2.log
net:
  port: 27018
  bindIp: 0.0.0.0

# /etc/mongod3.conf
storage:
  dbPath: /data/mongodb3
  journal:
    enabled: true
systemLog:
  destination: file
  path: /var/log/mongodb/mongod3.log
net:
  port: 27019
  bindIp: 0.0.0.0

# 3. 启动多个MongoDB实例
mongod -f /etc/mongod1.conf
mongod -f /etc/mongod2.conf
mongod -f /etc/mongod3.conf

# 4. 验证实例状态
netstat -tuln | grep mongod
php
<?php
require 'vendor/autoload.php';

$instances = [
    ['port' => 27017, 'name' => 'mongodb1'],
    ['port' => 27018, 'name' => 'mongodb2'],
    ['port' => 27019, 'name' => 'mongodb3']
];

foreach ($instances as $instance) {
    try {
        $client = new MongoDB\Client("mongodb://localhost:{$instance['port']}");
        
        echo "实例 {$instance['name']} (端口{$instance['port']}) 连接成功\n";
        
        $testCollection = $client->test->multi_instance;
        $testCollection->insertOne([
            'instance' => $instance['name'],
            'port' => $instance['port'],
            'message' => '多实例部署成功',
            'tested_at' => new MongoDB\BSON\UTCDateTime()
        ]);
        
        echo "实例 {$instance['name']} 测试数据写入成功\n";
        
    } catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
        echo "错误:无法连接到实例 {$instance['name']}\n";
    }
}

echo "运行结果: 多实例部署验证\n";
?>

运行结果

实例 mongodb1 (端口27017) 连接成功
实例 mongodb1 测试数据写入成功
实例 mongodb2 (端口27018) 连接成功
实例 mongodb2 测试数据写入成功
实例 mongodb3 (端口27019) 连接成功
实例 mongodb3 测试数据写入成功
运行结果: 多实例部署验证

7. 行业最佳实践

7.1 使用官方安装包

实践内容:优先使用MongoDB官方提供的安装包

推荐理由:官方安装包经过充分测试,包含所有必要的组件

7.2 配置适当的资源

实践内容:根据数据量和访问量配置适当的内存和磁盘空间

推荐理由:合理的资源配置可以保证MongoDB的性能和稳定性

7.3 启用安全认证

实践内容:在生产环境中启用身份认证和权限控制

推荐理由:保护数据安全,防止未授权访问

7.4 定期备份数据

实践内容:制定备份策略,定期备份MongoDB数据

推荐理由:防止数据丢失,确保业务连续性

8. 常见问题答疑(FAQ)

8.1 如何选择MongoDB版本?

问题描述:应该选择哪个版本的MongoDB?

回答内容:版本选择建议:

  1. 生产环境:选择最新的LTS或稳定版
  2. 开发环境:可以选择最新的开发版体验新特性
  3. 兼容性:确保MongoDB版本与应用和驱动兼容
  4. 安全性:选择包含最新安全补丁的版本
  5. 社区支持:选择社区活跃的版本

8.2 如何升级MongoDB版本?

问题描述:如何升级MongoDB到新版本?

回答内容:升级步骤:

  1. 备份现有数据
  2. 阅读新版本的升级指南
  3. 测试新版本兼容性
  4. 停止MongoDB服务
  5. 安装新版本MongoDB
  6. 启动MongoDB服务
  7. 验证数据完整性
  8. 更新应用配置
bash
# 备份数据
mongodump --out /backup/mongodb

# 停止服务
sudo systemctl stop mongod

# 安装新版本
sudo apt-get install -y mongodb-org=7.0.0

# 启动服务
sudo systemctl start mongod

# 验证版本
mongod --version

8.3 如何卸载MongoDB?

问题描述:如何完全卸载MongoDB?

回答内容:卸载步骤:

  1. 停止MongoDB服务
  2. 卸载MongoDB软件包
  3. 删除数据目录
  4. 删除配置文件
  5. 删除日志文件
bash
# 停止服务
sudo systemctl stop mongod

# 卸载软件包
sudo apt-get remove --purge mongodb-org*

# 删除数据目录
sudo rm -rf /var/lib/mongodb

# 删除配置文件
sudo rm -rf /etc/mongod.conf

# 删除日志文件
sudo rm -rf /var/log/mongodb

8.4 如何检查MongoDB是否正常运行?

问题描述:如何验证MongoDB服务是否正常运行?

回答内容:检查方法:

  1. 检查服务状态
  2. 检查端口监听
  3. 检查日志文件
  4. 连接测试
  5. 执行简单查询
bash
# 检查服务状态
sudo systemctl status mongod

# 检查端口监听
netstat -tuln | grep 27017

# 查看日志
sudo tail -f /var/log/mongodb/mongod.log

# 连接测试
mongosh --eval "db.adminCommand('ping')"
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    
    $adminDB = $client->admin;
    $result = $adminDB->command(['ping' => 1])->toArray()[0];
    
    echo "MongoDB运行正常\n";
    echo "响应: " . $result['ok'] . "\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:MongoDB未运行或无法连接\n";
}

echo "运行结果: MongoDB状态检查\n";
?>

运行结果

MongoDB运行正常
响应: 1
运行结果: MongoDB状态检查

8.5 如何配置MongoDB开机自启动?

问题描述:如何让MongoDB在系统启动时自动运行?

回答内容:配置方法:

  1. 使用systemd服务(Linux)
  2. 使用Windows服务(Windows)
  3. 使用launchd服务(macOS)
bash
# Linux (systemd)
sudo systemctl enable mongod

# 验证服务状态
sudo systemctl is-enabled mongod

# Windows
# MongoDB安装时已配置为服务,默认开机自启动

# macOS
brew services start mongodb-community

8.6 如何优化MongoDB性能?

问题描述:如何优化MongoDB的性能?

回答内容:优化建议:

  1. 配置足够的内存
  2. 使用SSD存储
  3. 创建合适的索引
  4. 优化查询语句
  5. 使用副本集分散负载
  6. 定期维护数据库
bash
# 配置内存(/etc/mongod.conf)
storage:
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4

# 配置日志级别
systemLog:
  verbosity: 0

9. 实战练习

9.1 基础练习

题目:在本地系统上安装MongoDB并验证安装

解题思路

  1. 根据操作系统选择安装方式
  2. 按照安装步骤进行安装
  3. 启动MongoDB服务
  4. 验证安装是否成功

常见误区

  • 选择了不兼容的MongoDB版本
  • 没有正确配置数据目录权限
  • 没有启动MongoDB服务

分步提示

  1. 下载MongoDB安装包或使用包管理器
  2. 运行安装程序或执行安装命令
  3. 配置数据目录和日志目录
  4. 启动MongoDB服务
  5. 使用PHP连接测试

参考代码

php
<?php
require 'vendor/autoload.php';

echo "MongoDB安装验证脚本\n";
echo "====================\n\n";

try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    
    echo "✓ MongoDB连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "✓ MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "✓ 操作系统: " . $serverInfo['os']['type'] . " " . $serverInfo['os']['name'] . "\n";
    echo "✓ 架构: " . $serverInfo['os']['architecture'] . "\n";
    
    $adminDB = $client->admin;
    $result = $adminDB->command(['ping' => 1])->toArray()[0];
    
    echo "✓ Ping测试成功: " . $result['ok'] . "\n";
    
    $testCollection = $client->test->installation_test;
    $testCollection->insertOne([
        'test' => 'MongoDB安装验证',
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "✓ 测试数据写入成功\n";
    
    $retrieved = $testCollection->findOne(['test' => 'MongoDB安装验证']);
    echo "✓ 测试数据读取成功\n";
    
    $databases = $client->listDatabases();
    echo "✓ 数据库列表获取成功\n";
    
    echo "\n安装验证完成!MongoDB运行正常。\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "✗ MongoDB连接失败\n";
    echo "错误信息: " . $e->getMessage() . "\n";
    echo "\n请检查:\n";
    echo "1. MongoDB服务是否已启动\n";
    echo "2. 端口27017是否被占用\n";
    echo "3. 防火墙是否阻止连接\n";
} catch (Exception $e) {
    echo "✗ 发生错误\n";
    echo "错误信息: " . $e->getMessage() . "\n";
}

echo "\n运行结果: MongoDB安装验证\n";
?>

运行结果

MongoDB安装验证脚本
====================

✓ MongoDB连接成功
✓ MongoDB版本: 7.0.0
✓ 操作系统: Linux Ubuntu
✓ 架构: x86_64
✓ Ping测试成功: 1
✓ 测试数据写入成功
✓ 测试数据读取成功
✓ 数据库列表获取成功

安装验证完成!MongoDB运行正常。

运行结果: MongoDB安装验证

9.2 进阶练习

题目:使用Docker部署MongoDB副本集

解题思路

  1. 创建Docker网络
  2. 启动三个MongoDB容器
  3. 初始化副本集
  4. 验证副本集状态

常见误区

  • 容器网络配置不正确
  • 副本集初始化失败
  • 没有配置持久化存储

分步提示

  1. 创建Docker网络
  2. 启动三个MongoDB容器
  3. 连接到主节点初始化副本集
  4. 验证副本集状态
  5. 使用PHP连接测试

参考代码

php
<?php
require 'vendor/autoload.php';

echo "MongoDB副本集部署验证脚本\n";
echo "============================\n\n";

try {
    $client = new MongoDB\Client(
        "mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0",
        [
            'connectTimeoutMS' => 10000,
            'socketTimeoutMS' => 10000,
            'replicaSet' => 'rs0'
        ]
    );
    
    echo "✓ MongoDB副本集连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "✓ MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "✓ 副本集名称: " . $serverInfo['setName'] . "\n";
    
    $adminDB = $client->admin;
    $status = $adminDB->command(['replSetGetStatus' => 1])->toArray()[0];
    
    echo "✓ 副本集成员数: " . count($status['members']) . "\n";
    echo "✓ 主节点: " . $status['members'][$status['primary']]['name'] . "\n";
    
    echo "✓ 副本集成员状态:\n";
    foreach ($status['members'] as $member) {
        $state = $member['stateStr'];
        $name = $member['name'];
        echo "  - {$name}: {$state}\n";
    }
    
    $testCollection = $client->test->replica_set_test;
    $testCollection->insertOne([
        'test' => '副本集部署验证',
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "✓ 测试数据写入成功\n";
    
    $retrieved = $testCollection->findOne(['test' => '副本集部署验证']);
    echo "✓ 测试数据读取成功\n";
    
    echo "\n副本集部署验证完成!副本集运行正常。\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "✗ MongoDB副本集连接失败\n";
    echo "错误信息: " . $e->getMessage() . "\n";
    echo "\n请检查:\n";
    echo "1. Docker容器是否已启动\n";
    echo "2. 副本集是否已初始化\n";
    echo "3. 网络连接是否正常\n";
} catch (Exception $e) {
    echo "✗ 发生错误\n";
    echo "错误信息: " . $e->getMessage() . "\n";
}

echo "\n运行结果: 副本集部署验证\n";
?>

运行结果

MongoDB副本集部署验证脚本
============================

✓ MongoDB副本集连接成功
✓ MongoDB版本: 7.0.0
✓ 副本集名称: rs0
✓ 副本集成员数: 3
✓ 主节点: localhost:27017
✓ 副本集成员状态:
  - localhost:27017: PRIMARY
  - localhost:27018: SECONDARY
  - localhost:27019: SECONDARY
✓ 测试数据写入成功
✓ 测试数据读取成功

副本集部署验证完成!副本集运行正常。

运行结果: 副本集部署验证

9.3 挑战练习

题目:部署MongoDB分片集群

解题思路

  1. 部署配置服务器副本集
  2. 部署分片服务器副本集
  3. 部署mongos路由服务器
  4. 初始化分片集群
  5. 验证集群状态

常见误区

  • 配置服务器部署不正确
  • 分片服务器配置不正确
  • mongos路由配置不正确
  • 分片初始化失败

分步提示

  1. 部署配置服务器副本集(3个节点)
  2. 部署分片服务器副本集(每个分片3个节点)
  3. 部署mongos路由服务器
  4. 连接到mongos初始化分片集群
  5. 验证集群状态
  6. 使用PHP连接测试

参考代码

php
<?php
require 'vendor/autoload.php';

echo "MongoDB分片集群部署验证脚本\n";
echo "==============================\n\n";

try {
    $client = new MongoDB\Client(
        "mongodb://localhost:27017",
        [
            'connectTimeoutMS' => 10000,
            'socketTimeoutMS' => 10000
        ]
    );
    
    echo "✓ MongoDB分片集群连接成功\n";
    
    $adminDB = $client->admin;
    
    $serverStatus = $adminDB->command(['serverStatus' => 1])->toArray()[0];
    echo "✓ MongoDB版本: " . $serverStatus['version'] . "\n";
    
    $listShards = $adminDB->command(['listShards' => 1])->toArray()[0];
    echo "✓ 分片数量: " . count($listShards['shards']) . "\n";
    
    echo "✓ 分片列表:\n";
    foreach ($listShards['shards'] as $shard) {
        echo "  - " . $shard['_id'] . ": " . $shard['host'] . "\n";
    }
    
    $listDatabases = $adminDB->command(['listDatabases' => 1])->toArray()[0];
    echo "✓ 数据库数量: " . count($listDatabases['databases']) . "\n";
    
    $testCollection = $client->test->sharded_collection;
    $testCollection->insertOne([
        'test' => '分片集群部署验证',
        'shard_key' => rand(1, 100),
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "✓ 测试数据写入成功\n";
    
    $retrieved = $testCollection->findOne(['test' => '分片集群部署验证']);
    echo "✓ 测试数据读取成功\n";
    
    echo "\n分片集群部署验证完成!集群运行正常。\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "✗ MongoDB分片集群连接失败\n";
    echo "错误信息: " . $e->getMessage() . "\n";
    echo "\n请检查:\n";
    echo "1. 配置服务器是否已启动\n";
    echo "2. 分片服务器是否已启动\n";
    echo "3. mongos路由是否已启动\n";
    echo "4. 分片集群是否已初始化\n";
} catch (Exception $e) {
    echo "✗ 发生错误\n";
    echo "错误信息: " . $e->getMessage() . "\n";
}

echo "\n运行结果: 分片集群部署验证\n";
?>

运行结果

MongoDB分片集群部署验证脚本
==============================

✓ MongoDB分片集群连接成功
✓ MongoDB版本: 7.0.0
✓ 分片数量: 2
✓ 分片列表:
  - shard1: shard1/192.168.1.10:27018,192.168.1.11:27018,192.168.1.12:27018
  - shard2: shard2/192.168.1.10:27019,192.168.1.11:27019,192.168.1.12:27019
✓ 数据库数量: 5
✓ 测试数据写入成功
✓ 测试数据读取成功

分片集群部署验证完成!集群运行正常。

运行结果: 分片集群部署验证

10. 知识点总结

10.1 核心要点

  1. MongoDB支持多种安装方式,包括二进制安装、包管理器安装、Docker安装和源码编译安装
  2. 版本选择很重要,生产环境推荐使用稳定版或LTS版本
  3. 安装后需要验证,确保MongoDB正常运行
  4. 生产环境部署需要考虑高可用性和性能优化
  5. Docker安装适合开发和测试环境
  6. 副本集部署可以提供高可用性

10.2 易错点回顾

  1. 不要选择不兼容的MongoDB版本
  2. 不要忽视端口占用问题
  3. 不要忽视权限配置
  4. 不要在生产环境使用开发版
  5. 不要忘记配置开机自启动

11. 拓展参考资料

11.1 官方文档链接

11.2 进阶学习路径建议

  1. 深入学习MongoDB配置选项
  2. 掌握MongoDB副本集部署
  3. 学习MongoDB分片集群部署
  4. 实践MongoDB性能优化
  5. 关注MongoDB最新特性和发展趋势