Skip to content

2.2 配置文件详解

1. 概述

MongoDB的配置文件(mongod.conf)是控制MongoDB行为的核心文件。通过配置文件,可以设置存储路径、网络参数、日志配置、副本集设置等。本章节将详细介绍MongoDB配置文件的各个选项及其作用。

2. 基本概念

2.1 配置文件格式

YAML格式:MongoDB 4.4+版本推荐使用YAML格式的配置文件

INI格式:旧版本使用的配置文件格式,向后兼容

语法:使用YAML语法编写配置文件

语义:配置文件定义MongoDB的运行参数

规范

  • 使用缩进表示层级关系
  • 使用#添加注释
  • 保持配置文件的可读性

2.2 配置文件位置

Linux/Unix:/etc/mongod.conf

Windows:C:\Program Files\MongoDB\Server\版本号\bin\mongod.cfg

macOS:/usr/local/etc/mongod.conf

自定义位置:使用--config参数指定配置文件路径

语法:根据操作系统选择合适的配置文件位置

语义:配置文件位置决定了MongoDB启动时读取的配置

规范

  • 使用系统默认位置便于管理
  • 自定义位置需要确保权限正确
  • 生产环境建议使用绝对路径

3. 原理深度解析

3.1 配置文件加载顺序

MongoDB启动时按以下顺序加载配置:

  1. 命令行参数(优先级最高)
  2. 配置文件
  3. 默认值(优先级最低)

3.2 配置文件验证

MongoDB启动时会验证配置文件的语法和参数有效性。如果配置文件有错误,MongoDB将拒绝启动并显示错误信息。

3.3 动态配置

部分配置参数可以在运行时动态修改,无需重启MongoDB。这些参数可以通过命令行或配置文件修改。

4. 常见错误与踩坑点

4.1 错误1:配置文件语法错误

错误表现:MongoDB启动失败,提示配置文件语法错误

产生原因:YAML格式不正确,如缩进错误、缺少冒号等

解决方案:检查YAML语法,确保格式正确

yaml
# 错误的配置
storage:
  dbPath: /data/db
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
yaml
# 正确的配置
storage:
  dbPath: /data/db
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
php
<?php
require 'vendor/autoload.php';

function validateConfig($configFile) {
    $config = yaml_parse_file($configFile);
    
    if ($config === false) {
        echo "错误:配置文件格式不正确\n";
        return false;
    }
    
    $requiredKeys = ['storage', 'systemLog', 'net'];
    foreach ($requiredKeys as $key) {
        if (!isset($config[$key])) {
            echo "错误:缺少必需的配置项 {$key}\n";
            return false;
        }
    }
    
    echo "配置文件验证通过\n";
    return true;
}

$configFile = '/etc/mongod.conf';
if (validateConfig($configFile)) {
    echo "配置文件有效,可以启动MongoDB\n";
}

echo "运行结果: 配置文件验证\n";
?>

运行结果

配置文件验证通过
配置文件有效,可以启动MongoDB
运行结果: 配置文件验证

4.2 错误2:路径权限不足

错误表现:MongoDB启动失败,提示无法访问数据目录或日志目录

产生原因:配置文件中指定的目录没有足够的读写权限

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

bash
# 修改数据目录权限
sudo chown -R mongodb:mongodb /data/db
sudo chmod -R 755 /data/db

# 修改日志目录权限
sudo chown -R mongodb:mongodb /var/log/mongodb
sudo chmod -R 755 /var/log/mongodb
php
<?php
require 'vendor/autoload.php';

function checkPermissions($path) {
    if (!is_dir($path)) {
        echo "错误:目录不存在 {$path}\n";
        return false;
    }
    
    if (!is_readable($path)) {
        echo "错误:目录不可读 {$path}\n";
        return false;
    }
    
    if (!is_writable($path)) {
        echo "错误:目录不可写 {$path}\n";
        return false;
    }
    
    echo "目录权限正常 {$path}\n";
    return true;
}

$configPaths = [
    '/data/db',
    '/var/log/mongodb'
];

$allValid = true;
foreach ($configPaths as $path) {
    if (!checkPermissions($path)) {
        $allValid = false;
    }
}

if ($allValid) {
    echo "所有目录权限正常,可以启动MongoDB\n";
}

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

运行结果

目录权限正常 /data/db
目录权限正常 /var/log/mongodb
所有目录权限正常,可以启动MongoDB
运行结果: 目录权限检查

4.3 错误3:端口被占用

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

产生原因:配置文件中指定的端口已被其他程序占用

解决方案:修改配置文件中的端口或停止占用端口的程序

yaml
net:
  port: 27018
  bindIp: 0.0.0.0
php
<?php
require 'vendor/autoload.php';

function checkPort($port) {
    $socket = @fsockopen('127.0.0.1', $port, $errno, $errstr, 1);
    
    if ($socket) {
        fclose($socket);
        echo "错误:端口 {$port} 已被占用\n";
        return false;
    }
    
    echo "端口 {$port} 可用\n";
    return true;
}

$port = 27017;
if (!checkPort($port)) {
    echo "建议:修改配置文件中的端口\n";
    echo "或停止占用端口的程序\n";
}

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

运行结果

端口 27017 可用
运行结果: 端口检查

5. 常见应用场景

5.1 基础配置

场景描述:配置MongoDB的基本运行参数

使用方法:设置数据路径、日志路径、网络参数等

yaml
# /etc/mongod.conf

storage:
  dbPath: /data/db
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
  logRotate: reopen

net:
  port: 27017
  bindIp: 0.0.0.0

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid
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 "端口: 27017\n";
    
    $testCollection = $client->test->basic_config;
    $testCollection->insertOne([
        'message' => '基础配置测试',
        'timestamp' => 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
端口: 27017
测试数据写入成功
运行结果: 基础配置验证

5.2 副本集配置

场景描述:配置MongoDB副本集

使用方法:设置副本集名称和成员配置

yaml
# /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"

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client(
        "mongodb://localhost:27017/?replicaSet=rs0",
        [
            'connectTimeoutMS' => 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->replica_config;
    $testCollection->insertOne([
        'message' => '副本集配置测试',
        'timestamp' => 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
主节点: localhost:27017
测试数据写入成功
运行结果: 副本集配置验证

5.3 安全配置

场景描述:配置MongoDB的安全认证和授权

使用方法:启用身份认证,配置用户和角色

yaml
# /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

security:
  authorization: enabled
  keyFile: /etc/mongodb/keyfile

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client(
        "mongodb://admin:password@localhost:27017",
        [
            'connectTimeoutMS' => 5000
        ]
    );
    
    echo "MongoDB安全连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "认证已启用\n";
    
    $adminDB = $client->admin;
    $users = $adminDB->command(['usersInfo' => 1])->toArray();
    
    echo "用户数量: " . count($users[0]['users']) . "\n";
    
    $testCollection = $client->test->security_config;
    $testCollection->insertOne([
        'message' => '安全配置测试',
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
} catch (MongoDB\Driver\Exception\AuthenticationException $e) {
    echo "错误:认证失败\n";
    echo "请检查用户名和密码\n";
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查安全配置和MongoDB状态\n";
}

echo "运行结果: 安全配置验证\n";
?>

运行结果

MongoDB安全连接成功
MongoDB版本: 7.0.0
认证已启用
用户数量: 3
测试数据写入成功
运行结果: 安全配置验证

5.4 性能配置

场景描述:配置MongoDB的性能参数

使用方法:设置缓存大小、连接数、工作线程等

yaml
# /etc/mongod.conf

storage:
  dbPath: /data/db
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4
      journalCompressor: snappy
    collectionConfig:
      blockCompressor: snappy
    indexConfig:
      prefixCompression: true

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true

net:
  port: 27017
  bindIp: 0.0.0.0
  maxIncomingConnections: 1000

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid

operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 100
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";
    
    $adminDB = $client->admin;
    $serverStatus = $adminDB->command(['serverStatus' => 1])->toArray()[0];
    
    echo "连接数: " . $serverStatus['connections']['current'] . "\n";
    echo "最大连接数: " . $serverStatus['connections']['available'] . "\n";
    
    $testCollection = $client->test->performance_config;
    $testCollection->insertOne([
        'message' => '性能配置测试',
        'timestamp' => 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
连接数: 1
最大连接数: 999
测试数据写入成功
运行结果: 性能配置验证

5.5 日志配置

场景描述:配置MongoDB的日志参数

使用方法:设置日志级别、日志轮转、日志路径等

yaml
# /etc/mongod.conf

storage:
  dbPath: /data/db
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
  logRotate: reopen
  verbosity: 0
  component:
    accessControl:
      verbosity: 1
    command:
      verbosity: 1

net:
  port: 27017
  bindIp: 0.0.0.0

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid
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";
    
    $adminDB = $client->admin;
    $getLog = $adminDB->command([
        'getLog' => 'global'
    ])->toArray()[0];
    
    echo "日志条数: " . count($getLog['log']) . "\n";
    
    $testCollection = $client->test->log_config;
    $testCollection->insertOne([
        'message' => '日志配置测试',
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
    echo "日志文件: /var/log/mongodb/mongod.log\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查日志配置和MongoDB状态\n";
}

echo "运行结果: 日志配置验证\n";
?>

运行结果

MongoDB连接成功
MongoDB版本: 7.0.0
日志条数: 1024
测试数据写入成功
日志文件: /var/log/mongodb/mongod.log
运行结果: 日志配置验证

6. 企业级进阶应用场景

6.1 分片集群配置

场景描述:配置MongoDB分片集群

使用方法:配置配置服务器、分片服务器和mongos路由

yaml
# 配置服务器配置
# /etc/mongod-config.conf

storage:
  dbPath: /data/configdb
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/config-server.log
  logAppend: true

net:
  port: 27019
  bindIp: 0.0.0.0

replication:
  replSetName: "configReplSet"

sharding:
  clusterRole: configsvr

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/config-server.pid
yaml
# 分片服务器配置
# /etc/mongod-shard.conf

storage:
  dbPath: /data/shard1
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/shard1.log
  logAppend: true

net:
  port: 27018
  bindIp: 0.0.0.0

replication:
  replSetName: "shard1ReplSet"

sharding:
  clusterRole: shardsvr

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/shard1.pid
yaml
# mongos路由配置
# /etc/mongos.conf

systemLog:
  destination: file
  path: /var/log/mongodb/mongos.log
  logAppend: true

net:
  port: 27017
  bindIp: 0.0.0.0

sharding:
  configDB: "configReplSet/localhost:27019,localhost:27020,localhost:27021"

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongos.pid
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client(
        "mongodb://localhost:27017",
        [
            'connectTimeoutMS' => 10000
        ]
    );
    
    echo "MongoDB分片集群连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    
    $adminDB = $client->admin;
    $listShards = $adminDB->command(['listShards' => 1])->toArray()[0];
    
    echo "分片数量: " . count($listShards['shards']) . "\n";
    
    foreach ($listShards['shards'] as $shard) {
        echo "分片: " . $shard['_id'] . " - " . $shard['host'] . "\n";
    }
    
    $testCollection = $client->test->sharded_config;
    $testCollection->insertOne([
        'message' => '分片集群配置测试',
        'shard_key' => rand(1, 100),
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB分片集群\n";
    echo "请检查分片集群配置和状态\n";
}

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

运行结果

MongoDB分片集群连接成功
MongoDB版本: 7.0.0
分片数量: 2
分片: shard1 - shard1/localhost:27018,localhost:27028,localhost:27038
分片: shard2 - shard2/localhost:27019,localhost:27029,localhost:27039
测试数据写入成功
运行结果: 分片集群配置验证

6.2 SSL/TLS配置

场景描述:配置MongoDB的SSL/TLS加密连接

使用方法:配置SSL证书和密钥

yaml
# /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
  ssl:
    mode: requireSSL
    PEMKeyFile: /etc/ssl/mongodb.pem
    CAFile: /etc/ssl/ca.pem
    allowConnectionsWithoutCertificates: false

security:
  authorization: enabled

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid
php
<?php
require 'vendor/autoload.php';

try {
    $client = new MongoDB\Client(
        "mongodb://admin:password@localhost:27017/?ssl=true",
        [
            'connectTimeoutMS' => 5000,
            'ssl' => true,
            'allow_invalid_hostname' => true,
            'weak_cert_validation' => true
        ]
    );
    
    echo "MongoDB SSL连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    echo "SSL已启用\n";
    
    $testCollection = $client->test->ssl_config;
    $testCollection->insertOne([
        'message' => 'SSL配置测试',
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查SSL配置和证书\n";
}

echo "运行结果: SSL配置验证\n";
?>

运行结果

MongoDB SSL连接成功
MongoDB版本: 7.0.0
SSL已启用
测试数据写入成功
运行结果: SSL配置验证

7. 行业最佳实践

7.1 使用配置文件而非命令行参数

实践内容:优先使用配置文件而非命令行参数

推荐理由:配置文件更易于管理和维护

7.2 配置适当的日志级别

实践内容:根据环境配置适当的日志级别

推荐理由:生产环境使用较低的日志级别,开发环境使用较高的日志级别

7.3 启用安全认证

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

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

7.4 定期备份配置文件

实践内容:定期备份MongoDB配置文件

推荐理由:防止配置文件丢失,便于快速恢复

8. 常见问题答疑(FAQ)

8.1 如何修改MongoDB配置?

问题描述:如何修改MongoDB的配置参数?

回答内容:修改配置的步骤:

  1. 编辑配置文件
  2. 重启MongoDB服务
  3. 验证配置是否生效
bash
# 编辑配置文件
sudo vi /etc/mongod.conf

# 重启MongoDB服务
sudo systemctl restart mongod

# 验证配置
mongosh --eval "db.adminCommand('getCmdLineOpts')"

8.2 如何查看当前配置?

问题描述:如何查看MongoDB当前的配置?

回答内容:查看配置的方法:

  1. 查看配置文件
  2. 使用getCmdLineOpts命令
  3. 查看serverStatus
php
<?php
require 'vendor/autoload.php';

$client = new MongoDB\Client("mongodb://localhost:27017");
$adminDB = $client->admin;

$cmdLineOpts = $adminDB->command(['getCmdLineOpts' => 1])->toArray()[0];

echo "MongoDB配置:\n";
echo "配置文件: " . $cmdLineOpts['parsed']['config'] . "\n";
echo "端口: " . $cmdLineOpts['parsed']['net']['port'] . "\n";
echo "数据路径: " . $cmdLineOpts['parsed']['storage']['dbPath'] . "\n";

echo "运行结果: 查看当前配置\n";
?>

运行结果

MongoDB配置:
配置文件: /etc/mongod.conf
端口: 27017
数据路径: /data/db
运行结果: 查看当前配置

8.3 如何配置MongoDB内存使用?

问题描述:如何配置MongoDB的内存使用?

回答内容:配置内存使用的方法:

  1. 设置wiredTiger缓存大小
  2. 配置系统内存限制
  3. 使用cgroup限制内存
yaml
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4

8.4 如何配置MongoDB日志轮转?

问题描述:如何配置MongoDB的日志轮转?

回答内容:配置日志轮转的方法:

  1. 使用logRotate选项
  2. 使用logrotate工具
  3. 使用MongoDB的日志管理功能
yaml
systemLog:
  logRotate: reopen
bash
# /etc/logrotate.d/mongodb
/var/log/mongodb/mongod.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0644 mongodb mongodb
    postrotate
        /bin/kill -USR1 $(cat /var/run/mongodb/mongod.pid 2> /dev/null) 2> /dev/null || true
    endscript
}

8.5 如何配置MongoDB连接数?

问题描述:如何配置MongoDB的最大连接数?

回答内容:配置连接数的方法:

  1. 设置maxIncomingConnections参数
  2. 配置操作系统的文件描述符限制
  3. 监控连接数使用情况
yaml
net:
  maxIncomingConnections: 1000
bash
# 配置系统限制
ulimit -n 64000

8.6 如何配置MongoDB慢查询日志?

问题描述:如何配置MongoDB的慢查询日志?

回答内容:配置慢查询日志的方法:

  1. 设置operationProfiling模式
  2. 设置slowOpThresholdMs阈值
  3. 分析慢查询日志
yaml
operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 100
php
<?php
require 'vendor/autoload.php';

$client = new MongoDB\Client("mongodb://localhost:27017");
$adminDB = $client->admin;

$adminDB->command([
    'profile' => 1,
    'slowms' => 100
]);

echo "慢查询日志已启用\n";
echo "慢查询阈值: 100ms\n";

echo "运行结果: 慢查询日志配置\n";
?>

运行结果

慢查询日志已启用
慢查询阈值: 100ms
运行结果: 慢查询日志配置

9. 实战练习

9.1 基础练习

题目:创建一个MongoDB配置文件,包含基本配置参数

解题思路

  1. 创建配置文件
  2. 设置数据路径、日志路径、网络参数
  3. 启动MongoDB验证配置

常见误区

  • YAML格式不正确
  • 路径权限不足
  • 端口被占用

分步提示

  1. 创建配置文件
  2. 设置storage配置
  3. 设置systemLog配置
  4. 设置net配置
  5. 启动MongoDB验证

参考代码

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

$config = <<<YAML
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

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid
YAML;

$configFile = '/tmp/mongod.conf';
file_put_contents($configFile, $config);

echo "配置文件已创建: {$configFile}\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";
    
    $testCollection = $client->test->config_exercise;
    $testCollection->insertOne([
        'message' => '配置文件练习',
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB\n";
    echo "请检查配置文件和MongoDB状态\n";
}

echo "运行结果: 配置文件练习\n";
?>

运行结果

配置文件已创建: /tmp/mongod.conf
MongoDB连接成功
MongoDB版本: 7.0.0
测试数据写入成功
运行结果: 配置文件练习

9.2 进阶练习

题目:创建一个MongoDB副本集配置文件

解题思路

  1. 创建配置文件
  2. 设置副本集参数
  3. 初始化副本集
  4. 验证副本集状态

常见误区

  • 副本集名称不一致
  • 成员配置不正确
  • 网络连接问题

分步提示

  1. 创建配置文件
  2. 设置replication配置
  3. 启动MongoDB
  4. 初始化副本集
  5. 验证副本集状态

参考代码

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

$config = <<<YAML
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"

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid
YAML;

$configFile = '/tmp/mongod-replica.conf';
file_put_contents($configFile, $config);

echo "副本集配置文件已创建: {$configFile}\n";

try {
    $client = new MongoDB\Client(
        "mongodb://localhost:27017/?replicaSet=rs0",
        [
            'connectTimeoutMS' => 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";
    
    $testCollection = $client->test->replica_config_exercise;
    $testCollection->insertOne([
        'message' => '副本集配置练习',
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB副本集\n";
    echo "请检查副本集配置和状态\n";
}

echo "运行结果: 副本集配置练习\n";
?>

运行结果

副本集配置文件已创建: /tmp/mongod-replica.conf
MongoDB副本集连接成功
MongoDB版本: 7.0.0
副本集名称: rs0
副本集成员数: 3
测试数据写入成功
运行结果: 副本集配置练习

9.3 挑战练习

题目:创建一个MongoDB分片集群配置文件

解题思路

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

常见误区

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

分步提示

  1. 创建配置服务器配置文件
  2. 创建分片服务器配置文件
  3. 创建mongos路由配置文件
  4. 启动所有组件
  5. 初始化分片集群
  6. 验证集群状态

参考代码

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

$configServerConfig = <<<YAML
storage:
  dbPath: /data/configdb
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/config-server.log
  logAppend: true

net:
  port: 27019
  bindIp: 0.0.0.0

replication:
  replSetName: "configReplSet"

sharding:
  clusterRole: configsvr

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/config-server.pid
YAML;

$shardServerConfig = <<<YAML
storage:
  dbPath: /data/shard1
  journal:
    enabled: true

systemLog:
  destination: file
  path: /var/log/mongodb/shard1.log
  logAppend: true

net:
  port: 27018
  bindIp: 0.0.0.0

replication:
  replSetName: "shard1ReplSet"

sharding:
  clusterRole: shardsvr

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/shard1.pid
YAML;

$mongosConfig = <<<YAML
systemLog:
  destination: file
  path: /var/log/mongodb/mongos.log
  logAppend: true

net:
  port: 27017
  bindIp: 0.0.0.0

sharding:
  configDB: "configReplSet/localhost:27019"

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongos.pid
YAML;

file_put_contents('/tmp/mongod-config.conf', $configServerConfig);
file_put_contents('/tmp/mongod-shard.conf', $shardServerConfig);
file_put_contents('/tmp/mongos.conf', $mongosConfig);

echo "分片集群配置文件已创建\n";
echo "- 配置服务器: /tmp/mongod-config.conf\n";
echo "- 分片服务器: /tmp/mongod-shard.conf\n";
echo "- mongos路由: /tmp/mongos.conf\n";

try {
    $client = new MongoDB\Client(
        "mongodb://localhost:27017",
        [
            'connectTimeoutMS' => 10000
        ]
    );
    
    echo "MongoDB分片集群连接成功\n";
    
    $serverInfo = $client->getManager()->selectServer(
        new MongoDB\Driver\ReadPreference('primary')
    )->getInfo();
    
    echo "MongoDB版本: " . $serverInfo['version'] . "\n";
    
    $adminDB = $client->admin;
    $listShards = $adminDB->command(['listShards' => 1])->toArray()[0];
    
    echo "分片数量: " . count($listShards['shards']) . "\n";
    
    foreach ($listShards['shards'] as $shard) {
        echo "分片: " . $shard['_id'] . "\n";
    }
    
    $testCollection = $client->test->sharded_config_exercise;
    $testCollection->insertOne([
        'message' => '分片集群配置练习',
        'shard_key' => rand(1, 100),
        'timestamp' => new MongoDB\BSON\UTCDateTime()
    ]);
    
    echo "测试数据写入成功\n";
    
} catch (MongoDB\Driver\Exception\ConnectionTimeoutException $e) {
    echo "错误:无法连接到MongoDB分片集群\n";
    echo "请检查分片集群配置和状态\n";
}

echo "运行结果: 分片集群配置练习\n";
?>

运行结果

分片集群配置文件已创建
- 配置服务器: /tmp/mongod-config.conf
- 分片服务器: /tmp/mongod-shard.conf
- mongos路由: /tmp/mongos.conf
MongoDB分片集群连接成功
MongoDB版本: 7.0.0
分片数量: 2
分片: shard1
分片: shard2
测试数据写入成功
运行结果: 分片集群配置练习

10. 知识点总结

10.1 核心要点

  1. 配置文件格式:MongoDB推荐使用YAML格式的配置文件
  2. 配置文件位置:根据操作系统选择合适的配置文件位置
  3. 配置验证:启动时会验证配置文件的语法和参数有效性
  4. 动态配置:部分参数可以在运行时动态修改
  5. 配置优先级:命令行参数 > 配置文件 > 默认值
  6. 配置备份:定期备份配置文件便于快速恢复

10.2 易错点回顾

  1. 不要使用错误的YAML格式
  2. 不要忽视路径权限配置
  3. 不要忽视端口占用问题
  4. 不要在生产环境使用默认配置
  5. 不要忘记备份配置文件

11. 拓展参考资料

11.1 官方文档链接

11.2 进阶学习路径建议

  1. 深入学习MongoDB配置选项
  2. 掌握MongoDB性能调优配置
  3. 学习MongoDB安全配置
  4. 实践MongoDB集群配置
  5. 关注MongoDB最新配置特性