Appearance
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启动时按以下顺序加载配置:
- 命令行参数(优先级最高)
- 配置文件
- 默认值(优先级最低)
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: trueyaml
# 正确的配置
storage:
dbPath: /data/db
journal:
enabled: true
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: truephp
<?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/mongodbphp
<?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.0php
<?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.pidphp
<?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.pidphp
<?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.pidphp
<?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: 100php
<?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.pidphp
<?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.pidyaml
# 分片服务器配置
# /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.pidyaml
# 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.pidphp
<?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.pidphp
<?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的配置参数?
回答内容:修改配置的步骤:
- 编辑配置文件
- 重启MongoDB服务
- 验证配置是否生效
bash
# 编辑配置文件
sudo vi /etc/mongod.conf
# 重启MongoDB服务
sudo systemctl restart mongod
# 验证配置
mongosh --eval "db.adminCommand('getCmdLineOpts')"8.2 如何查看当前配置?
问题描述:如何查看MongoDB当前的配置?
回答内容:查看配置的方法:
- 查看配置文件
- 使用getCmdLineOpts命令
- 查看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的内存使用?
回答内容:配置内存使用的方法:
- 设置wiredTiger缓存大小
- 配置系统内存限制
- 使用cgroup限制内存
yaml
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 48.4 如何配置MongoDB日志轮转?
问题描述:如何配置MongoDB的日志轮转?
回答内容:配置日志轮转的方法:
- 使用logRotate选项
- 使用logrotate工具
- 使用MongoDB的日志管理功能
yaml
systemLog:
logRotate: reopenbash
# /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的最大连接数?
回答内容:配置连接数的方法:
- 设置maxIncomingConnections参数
- 配置操作系统的文件描述符限制
- 监控连接数使用情况
yaml
net:
maxIncomingConnections: 1000bash
# 配置系统限制
ulimit -n 640008.6 如何配置MongoDB慢查询日志?
问题描述:如何配置MongoDB的慢查询日志?
回答内容:配置慢查询日志的方法:
- 设置operationProfiling模式
- 设置slowOpThresholdMs阈值
- 分析慢查询日志
yaml
operationProfiling:
mode: slowOp
slowOpThresholdMs: 100php
<?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配置文件,包含基本配置参数
解题思路:
- 创建配置文件
- 设置数据路径、日志路径、网络参数
- 启动MongoDB验证配置
常见误区:
- YAML格式不正确
- 路径权限不足
- 端口被占用
分步提示:
- 创建配置文件
- 设置storage配置
- 设置systemLog配置
- 设置net配置
- 启动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副本集配置文件
解题思路:
- 创建配置文件
- 设置副本集参数
- 初始化副本集
- 验证副本集状态
常见误区:
- 副本集名称不一致
- 成员配置不正确
- 网络连接问题
分步提示:
- 创建配置文件
- 设置replication配置
- 启动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
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分片集群配置文件
解题思路:
- 创建配置服务器配置
- 创建分片服务器配置
- 创建mongos路由配置
- 初始化分片集群
- 验证集群状态
常见误区:
- 配置服务器配置不正确
- 分片服务器配置不正确
- mongos路由配置不正确
- 分片初始化失败
分步提示:
- 创建配置服务器配置文件
- 创建分片服务器配置文件
- 创建mongos路由配置文件
- 启动所有组件
- 初始化分片集群
- 验证集群状态
参考代码:
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 核心要点
- 配置文件格式:MongoDB推荐使用YAML格式的配置文件
- 配置文件位置:根据操作系统选择合适的配置文件位置
- 配置验证:启动时会验证配置文件的语法和参数有效性
- 动态配置:部分参数可以在运行时动态修改
- 配置优先级:命令行参数 > 配置文件 > 默认值
- 配置备份:定期备份配置文件便于快速恢复
10.2 易错点回顾
- 不要使用错误的YAML格式
- 不要忽视路径权限配置
- 不要忽视端口占用问题
- 不要在生产环境使用默认配置
- 不要忘记备份配置文件
11. 拓展参考资料
11.1 官方文档链接
- MongoDB配置文件: https://www.mongodb.com/docs/manual/reference/configuration-options/
- MongoDB配置示例: https://www.mongodb.com/docs/manual/reference/configuration-options/
- MongoDB命令行选项: https://www.mongodb.com/docs/manual/reference/program/mongod/
11.2 进阶学习路径建议
- 深入学习MongoDB配置选项
- 掌握MongoDB性能调优配置
- 学习MongoDB安全配置
- 实践MongoDB集群配置
- 关注MongoDB最新配置特性
