第132集文档数据库服务副本集三节点4核8GB极速型SSD50GB运维实战 | 字数总计: 5.9k | 阅读时长: 28分钟 | 阅读量:
1. MongoDB副本集三节点4核8GB极速型SSD概述 在4核8GB极速型SSD50GB的高性能服务器环境下部署MongoDB副本集三节点架构,需要特别关注SSD性能优化、资源分配和副本集配置。本文将详细介绍在4核8GB极速型SSD环境下部署MongoDB副本集三节点的运维实战经验,包括资源分配、性能调优、SSD优化、监控告警的完整解决方案。
1.1 核心功能
资源优化 : 在4核8GB环境下合理分配系统资源
SSD优化 : 充分利用极速型SSD的高性能特性
三节点架构 : 一主两从的副本集架构,确保高可用性
性能调优 : 针对高性能服务器的MongoDB性能优化
监控告警 : 全面的监控体系,确保系统稳定运行
1.2 技术架构 1 2 3 4 5 4核8GB极速型SSD → MongoDB主节点 → MongoDB从节点1 → MongoDB从节点2 ↓ ↓ ↓ ↓ 系统监控 → 资源分配 → 数据同步 → 故障转移 ↓ ↓ ↓ ↓ SSD优化 → 性能调优 → 副本集管理 → 监控告警
2. 环境准备 2.1 4核8GB极速型SSD环境检查 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 #!/bin/bash log () { echo "[$(date '+%Y-%m-%d %H:%M:%S') ] $1 " } check_system_resources () { log "检查4核8GB极速型SSD系统资源..." CPU_CORES=$(nproc ) log "CPU核心数: $CPU_CORES " if [ $CPU_CORES -lt 4 ]; then log "警告: CPU核心数不足4核" fi TOTAL_MEM=$(free -h | grep "Mem:" | awk '{print $2}' ) AVAILABLE_MEM=$(free -h | grep "Mem:" | awk '{print $7}' ) USED_MEM=$(free -h | grep "Mem:" | awk '{print $3}' ) log "总内存: $TOTAL_MEM " log "已用内存: $USED_MEM " log "可用内存: $AVAILABLE_MEM " TOTAL_MEM_KB=$(free | grep "Mem:" | awk '{print $2}' ) TOTAL_MEM_GB=$((TOTAL_MEM_KB / 1024 / 1024 )) if [ $TOTAL_MEM_GB -lt 8 ]; then log "警告: 系统内存不足8GB (当前: ${TOTAL_MEM_GB} GB)" else log "系统内存充足: ${TOTAL_MEM_GB} GB" fi check_disk_info } check_disk_info () { log "检查磁盘信息..." DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//' ) DISK_AVAILABLE=$(df -h / | tail -1 | awk '{print $4}' ) DISK_TOTAL=$(df -h / | tail -1 | awk '{print $2}' ) log "磁盘总容量: $DISK_TOTAL " log "磁盘使用率: $DISK_USAGE %" log "可用磁盘空间: $DISK_AVAILABLE " if [ $DISK_USAGE -gt 80 ]; then log "警告: 磁盘使用率过高" fi DISK_TYPE=$(lsblk -d -o name,rota | grep -v NAME | head -1 | awk '{print $2}' ) if [ "$DISK_TYPE " = "0" ]; then log "磁盘类型: SSD (极速型)" else log "磁盘类型: HDD (机械硬盘)" fi check_disk_performance } check_disk_performance () { log "检查磁盘性能..." if command -v iostat > /dev/null 2>&1; then log "磁盘IO统计:" iostat -x 1 3 | tail -n +4 else log "iostat未安装,跳过磁盘IO检查" fi log "测试磁盘读写速度..." WRITE_SPEED=$(dd if =/dev/zero of=/tmp/test_write bs=1M count=100 2>&1 | grep "copied" | awk '{print $8, $9}' ) log "磁盘写入速度: $WRITE_SPEED " READ_SPEED=$(dd if =/tmp/test_write of=/dev/null bs=1M 2>&1 | grep "copied" | awk '{print $8, $9}' ) log "磁盘读取速度: $READ_SPEED " rm -f /tmp/test_write check_ssd_optimization } check_ssd_optimization () { log "检查SSD优化参数..." if command -v fstrim > /dev/null 2>&1; then log "TRIM支持: 已启用" else log "警告: TRIM支持未启用" fi SSD_SCHEDULER=$(cat /sys/block/sda/queue/scheduler 2>/dev/null | grep -o '\[.*\]' | tr -d '[]' ) log "SSD调度器: $SSD_SCHEDULER " SSD_QUEUE_DEPTH=$(cat /sys/block/sda/queue/nr_requests 2>/dev/null) log "SSD队列深度: $SSD_QUEUE_DEPTH " } check_system_load () { log "检查系统负载..." LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//' ) log "系统负载: $LOAD_AVG " if (( $(echo "$LOAD_AVG > 3.0 " | bc -l) )); then log "警告: 系统负载过高" else log "系统负载正常" fi PROCESS_COUNT=$(ps aux | wc -l) log "当前进程数: $PROCESS_COUNT " if [ $PROCESS_COUNT -gt 400 ]; then log "警告: 进程数量过多" fi } check_network_connections () { log "检查网络连接..." TCP_CONNECTIONS=$(netstat -an | grep tcp | wc -l) log "TCP连接数: $TCP_CONNECTIONS " if [ $TCP_CONNECTIONS -gt 3000 ]; then log "警告: TCP连接数过多" fi LISTENING_PORTS=$(netstat -tlnp | grep LISTEN | wc -l) log "监听端口数: $LISTENING_PORTS " MONGODB_PORTS=(27017 27018 27019) for port in "${MONGODB_PORTS[@]} " ; do if netstat -tlnp | grep ":$port " > /dev/null; then log "端口 $port 已被占用" else log "端口 $port 可用" fi done } check_system_limits () { log "检查系统限制..." FD_LIMIT=$(ulimit -n) log "文件描述符限制: $FD_LIMIT " if [ $FD_LIMIT -lt 65536 ]; then log "警告: 文件描述符限制过低" fi PROCESS_LIMIT=$(ulimit -u) log "进程数限制: $PROCESS_LIMIT " MEMORY_LIMIT=$(ulimit -m) if [ $MEMORY_LIMIT != "unlimited" ]; then log "内存限制: $MEMORY_LIMIT KB" else log "内存限制: 无限制" fi } optimize_system_parameters () { log "优化系统参数(4核8GB极速型SSD环境)..." cat >> /etc/sysctl.conf << EOF # MongoDB优化参数 - 4核8GB极速型SSD环境 net.core.somaxconn = 65535 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 vm.overcommit_memory = 1 vm.swappiness = 1 vm.dirty_ratio = 15 vm.dirty_background_ratio = 5 vm.max_map_count = 262144 fs.file-max = 2097152 # SSD优化参数 vm.dirty_writeback_centisecs = 1500 vm.dirty_expire_centisecs = 3000 EOF sysctl -p cat >> /etc/security/limits.conf << EOF # MongoDB用户限制 - 4核8GB极速型SSD环境 mongodb soft nofile 65535 mongodb hard nofile 65535 mongodb soft nproc 32768 mongodb hard nproc 32768 root soft nofile 65535 root hard nofile 65535 EOF log "系统参数优化完成" } main () { log "=== MongoDB三节点4核8GB极速型SSD环境检查开始 ===" check_system_resources check_system_load check_network_connections check_system_limits optimize_system_parameters log "=== MongoDB三节点4核8GB极速型SSD环境检查完成 ===" } main "$@ "
2.2 三节点4核8GB极速型SSD MongoDB配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 #!/bin/bash REPLICA_SET_NAME="rs0" PRIMARY_NODE="192.168.1.10:27017" SECONDARY_NODES=("192.168.1.11:27017" "192.168.1.12:27017" ) MONGODB_PORT=27017 MONGODB_DATA_DIR="/var/lib/mongodb" MONGODB_LOG_DIR="/var/log/mongodb" CACHE_SIZE_GB="2" SYSTEM_MEMORY="6gb" backup_config_files () { log "备份MongoDB配置文件..." if [ -f "/etc/mongod.conf" ]; then sudo cp /etc/mongod.conf /etc/mongod.conf.backup.$(date +%Y%m%d_%H%M%S) log "MongoDB配置文件已备份" fi } configure_primary_node_4c8g () { log "配置MongoDB主节点(4核8GB极速型SSD优化)..." cat > /etc/mongod.conf << EOF # MongoDB主节点配置 - 4核8GB极速型SSD优化 storage: dbPath: $MONGODB_DATA_DIR journal: enabled: true commitIntervalMs: 100 wiredTiger: engineConfig: cacheSizeGB: $CACHE_SIZE_GB journalCompressor: snappy directoryForIndexes: false eviction: (threads_min=1,threads_max=4) collectionConfig: blockCompressor: snappy indexConfig: prefixCompression: true statisticsLog: path: $MONGODB_LOG_DIR/wiredTigerStats.log verbosity: 0 systemLog: destination: file logAppend: true path: $MONGODB_LOG_DIR/mongod.log logRotate: reopen verbosity: 0 component: accessControl: verbosity: 0 command: verbosity: 0 net: port: $MONGODB_PORT bindIp: 0.0.0.0 maxIncomingConnections: 2000 compression: compressors: snappy,zstd processManagement: timeZoneInfo: /usr/share/zoneinfo fork: true pidFilePath: /var/run/mongodb/mongod.pid replication: replSetName: $REPLICA_SET_NAME oplogSizeMB: 1024 security: authorization: enabled keyFile: /etc/mongodb-keyfile operationProfiling: slowOpThresholdMs: 100 mode: slowOp setParameter: enableLocalhostAuthBypass: false logLevel: 1 maxLogSizeKB: 10 cursorTimeoutMillis: 600000 wiredTigerConcurrentReadTransactions: 128 wiredTigerConcurrentWriteTransactions: 128 EOF log "主节点配置完成" } configure_secondary_node_4c8g () { local node_ip=$1 log "配置MongoDB从节点(4核8GB极速型SSD优化): $node_ip ..." cat > /etc/mongod.conf << EOF # MongoDB从节点配置 - 4核8GB极速型SSD优化 storage: dbPath: $MONGODB_DATA_DIR journal: enabled: true commitIntervalMs: 100 wiredTiger: engineConfig: cacheSizeGB: $CACHE_SIZE_GB journalCompressor: snappy directoryForIndexes: false eviction: (threads_min=1,threads_max=4) collectionConfig: blockCompressor: snappy indexConfig: prefixCompression: true statisticsLog: path: $MONGODB_LOG_DIR/wiredTigerStats.log verbosity: 0 systemLog: destination: file logAppend: true path: $MONGODB_LOG_DIR/mongod.log logRotate: reopen verbosity: 0 component: accessControl: verbosity: 0 command: verbosity: 0 net: port: $MONGODB_PORT bindIp: 0.0.0.0 maxIncomingConnections: 2000 compression: compressors: snappy,zstd processManagement: timeZoneInfo: /usr/share/zoneinfo fork: true pidFilePath: /var/run/mongodb/mongod.pid replication: replSetName: $REPLICA_SET_NAME oplogSizeMB: 1024 security: authorization: enabled keyFile: /etc/mongodb-keyfile operationProfiling: slowOpThresholdMs: 100 mode: slowOp setParameter: enableLocalhostAuthBypass: false logLevel: 1 maxLogSizeKB: 10 cursorTimeoutMillis: 600000 wiredTigerConcurrentReadTransactions: 128 wiredTigerConcurrentWriteTransactions: 128 EOF log "从节点 $node_ip 配置完成" } create_keyfile () { log "创建MongoDB认证密钥文件..." openssl rand -base64 756 > /etc/mongodb-keyfile chmod 600 /etc/mongodb-keyfile chown mongodb:mongodb /etc/mongodb-keyfile log "认证密钥文件创建完成" } create_admin_user () { log "创建MongoDB管理员用户..." sleep 10 mongo --eval " use admin; db.createUser({ user: 'admin', pwd: 'admin123', roles: [ { role: 'userAdminAnyDatabase', db: 'admin' }, { role: 'readWriteAnyDatabase', db: 'admin' }, { role: 'dbAdminAnyDatabase', db: 'admin' }, { role: 'clusterAdmin', db: 'admin' } ] }); " log "管理员用户创建完成" } initialize_three_node_replica_set () { log "初始化MongoDB三节点副本集..." sleep 15 mongo --eval " rs.initiate({ _id: '$REPLICA_SET_NAME ', members: [ { _id: 0, host: '$PRIMARY_NODE ', priority: 3 }, { _id: 1, host: '${SECONDARY_NODES[0]} ', priority: 2 }, { _id: 2, host: '${SECONDARY_NODES[1]} ', priority: 1 } ] }); " log "三节点副本集初始化完成" } optimize_ssd_performance () { log "优化SSD性能..." if command -v fstrim > /dev/null 2>&1; then fstrim -v / log "TRIM已执行" fi echo noop > /sys/block/sda/queue/scheduler 2>/dev/null || true log "SSD调度器已设置为noop" echo 32 > /sys/block/sda/queue/nr_requests 2>/dev/null || true log "SSD队列深度已设置为32" echo 1 > /sys/block/sda/queue/write_cache 2>/dev/null || true log "SSD写入缓存已禁用" } start_services () { log "启动MongoDB服务..." systemctl restart mongod systemctl enable mongod sleep 5 if systemctl is-active --quiet mongod; then log "MongoDB服务启动成功" else log "错误: MongoDB服务启动失败" exit 1 fi } main () { log "=== MongoDB三节点4核8GB极速型SSD配置开始 ===" backup_config_files configure_primary_node_4c8g create_keyfile optimize_ssd_performance start_services create_admin_user initialize_three_node_replica_set log "=== MongoDB三节点4核8GB极速型SSD配置完成 ===" } main "$@ "
3. 性能优化 3.1 性能优化脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 #!/bin/bash REPLICA_SET_NAME="rs0" PRIMARY_NODE="192.168.1.10:27017" SECONDARY_NODES=("192.168.1.11:27017" "192.168.1.12:27017" ) MONGODB_USER="admin" MONGODB_PASSWORD="admin123" check_performance_metrics () { log "检查MongoDB性能指标(三节点4核8GB环境)..." log "主节点性能指标:" mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --eval " print('=== 主节点性能指标 ==='); print('连接数: ' + db.serverStatus().connections.current); print('总操作数: ' + db.serverStatus().opcounters.total); print('每秒操作数: ' + db.serverStatus().opcounters.total / db.serverStatus().uptime); print('内存使用: ' + db.serverStatus().mem.resident + 'MB'); print('缓存使用: ' + db.serverStatus().wiredTiger.cache['bytes currently in the cache'] / 1024 / 1024 + 'MB'); print('索引命中率: ' + (db.serverStatus().wiredTiger.cache['pages read into cache'] - db.serverStatus().wiredTiger.cache['pages written from cache']) / db.serverStatus().wiredTiger.cache['pages read into cache'] * 100 + '%'); " for node in "${SECONDARY_NODES[@]} " ; do log "从节点 $node 性能指标:" mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $node --eval " print('=== 从节点 $node 性能指标 ==='); print('连接数: ' + db.serverStatus().connections.current); print('总操作数: ' + db.serverStatus().opcounters.total); print('每秒操作数: ' + db.serverStatus().opcounters.total / db.serverStatus().uptime); print('内存使用: ' + db.serverStatus().mem.resident + 'MB'); print('缓存使用: ' + db.serverStatus().wiredTiger.cache['bytes currently in the cache'] / 1024 / 1024 + 'MB'); " done } optimize_performance_config () { log "优化MongoDB性能配置(三节点4核8GB环境)..." mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --eval " // 优化WiredTiger缓存 db.adminCommand({setParameter: 1, wiredTigerConcurrentReadTransactions: 128}); db.adminCommand({setParameter: 1, wiredTigerConcurrentWriteTransactions: 128}); // 优化连接数 db.adminCommand({setParameter: 1, maxIncomingConnections: 2000}); // 优化日志级别 db.adminCommand({setParameter: 1, logLevel: 1}); // 优化慢查询阈值 db.adminCommand({setParameter: 1, slowOpThresholdMs: 100}); print('主节点性能配置优化完成'); " for node in "${SECONDARY_NODES[@]} " ; do mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $node --eval " // 优化WiredTiger缓存 db.adminCommand({setParameter: 1, wiredTigerConcurrentReadTransactions: 128}); db.adminCommand({setParameter: 1, wiredTigerConcurrentWriteTransactions: 128}); // 优化连接数 db.adminCommand({setParameter: 1, maxIncomingConnections: 2000}); // 优化日志级别 db.adminCommand({setParameter: 1, logLevel: 1}); // 优化慢查询阈值 db.adminCommand({setParameter: 1, slowOpThresholdMs: 100}); print('从节点 $node 性能配置优化完成'); " done } performance_stress_test () { log "执行MongoDB性能压力测试(三节点4核8GB环境)..." mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --eval " use performance_test; db.createCollection('test_collection'); // 创建索引 db.test_collection.createIndex({field1: 1}); db.test_collection.createIndex({field2: 1}); db.test_collection.createIndex({field3: 1}); print('测试数据库和集合创建完成'); " log "执行写入压力测试..." mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --eval " use performance_test; var start = new Date(); var count = 0; for (var i = 0; i < 10000; i++) { db.test_collection.insert({ field1: 'value' + i, field2: Math.random(), field3: new Date(), data: 'x'.repeat(1000) }); count++; } var end = new Date(); var duration = end - start; var opsPerSec = count / (duration / 1000); print('写入压力测试完成:'); print('写入文档数: ' + count); print('耗时: ' + duration + 'ms'); print('每秒操作数: ' + opsPerSec.toFixed(2)); " log "执行读取压力测试..." mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --eval " use performance_test; var start = new Date(); var count = 0; for (var i = 0; i < 10000; i++) { db.test_collection.findOne({field1: 'value' + Math.floor(Math.random() * 10000)}); count++; } var end = new Date(); var duration = end - start; var opsPerSec = count / (duration / 1000); print('读取压力测试完成:'); print('读取文档数: ' + count); print('耗时: ' + duration + 'ms'); print('每秒操作数: ' + opsPerSec.toFixed(2)); " log "执行更新压力测试..." mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --eval " use performance_test; var start = new Date(); var count = 0; for (var i = 0; i < 5000; i++) { db.test_collection.updateOne( {field1: 'value' + Math.floor(Math.random() * 10000)}, {\$set: {field2: Math.random(), updated: new Date()}} ); count++; } var end = new Date(); var duration = end - start; var opsPerSec = count / (duration / 1000); print('更新压力测试完成:'); print('更新文档数: ' + count); print('耗时: ' + duration + 'ms'); print('每秒操作数: ' + opsPerSec.toFixed(2)); " mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --eval " use performance_test; db.dropDatabase(); print('测试数据清理完成'); " log "性能压力测试完成" } optimize_system_parameters () { log "优化系统参数(三节点4核8GB环境)..." cat >> /etc/sysctl.conf << EOF # MongoDB性能优化参数 - 三节点4核8GB环境 net.core.somaxconn = 65535 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 vm.overcommit_memory = 1 vm.swappiness = 1 vm.dirty_ratio = 15 vm.dirty_background_ratio = 5 vm.max_map_count = 262144 fs.file-max = 2097152 # SSD优化参数 vm.dirty_writeback_centisecs = 1500 vm.dirty_expire_centisecs = 3000 # MongoDB优化参数 vm.zone_reclaim_mode = 0 vm.min_free_kbytes = 65536 EOF sysctl -p cat >> /etc/security/limits.conf << EOF # MongoDB用户限制 - 三节点4核8GB环境 mongodb soft nofile 65535 mongodb hard nofile 65535 mongodb soft nproc 32768 mongodb hard nproc 32768 root soft nofile 65535 root hard nofile 65535 EOF log "系统参数优化完成" } main () { case $1 in "check" ) check_performance_metrics ;; "optimize" ) optimize_performance_config ;; "test" ) performance_stress_test ;; "system" ) optimize_system_parameters ;; *) echo "用法: $0 {check|optimize|test|system}" echo " check - 检查性能指标" echo " optimize - 优化性能配置" echo " test - 性能压力测试" echo " system - 优化系统参数" ;; esac } main "$@ "
3.2 性能监控脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 #!/bin/bash REPLICA_SET_NAME="rs0" PRIMARY_NODE="192.168.1.10:27017" SECONDARY_NODES=("192.168.1.11:27017" "192.168.1.12:27017" ) MONGODB_USER="admin" MONGODB_PASSWORD="admin123" MONITOR_INTERVAL=30 LOG_FILE="/var/log/mongodb-performance-monitor-3node-4c8g.log" log_performance_data () { local timestamp=$(date '+%Y-%m-%d %H:%M:%S' ) local metric=$1 local value=$2 local node=$3 echo "[$timestamp ] Node:$node Metric:$metric Value:$value " >> $LOG_FILE } monitor_performance_metrics () { log "开始监控MongoDB性能指标(三节点4核8GB环境)..." while true ; do SYSTEM_LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//' ) CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//' ) MEMORY_USAGE=$(free | grep "Mem:" | awk '{printf "%.2f", $3/$2 * 100.0}' ) log_performance_data "system_load" $SYSTEM_LOAD "system" log_performance_data "cpu_usage" $CPU_USAGE "system" log_performance_data "memory_usage" $MEMORY_USAGE "system" PRIMARY_CONNECTIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().connections.current; " ) PRIMARY_OPERATIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().opcounters.total; " ) PRIMARY_MEMORY=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().mem.resident; " ) PRIMARY_CACHE=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().wiredTiger.cache['bytes currently in the cache'] / 1024 / 1024; " ) log_performance_data "connections" $PRIMARY_CONNECTIONS "primary" log_performance_data "operations" $PRIMARY_OPERATIONS "primary" log_performance_data "memory_usage" $PRIMARY_MEMORY "primary" log_performance_data "cache_usage" $PRIMARY_CACHE "primary" for node in "${SECONDARY_NODES[@]} " ; do SECONDARY_CONNECTIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().connections.current; " --host $node ) SECONDARY_OPERATIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().opcounters.total; " --host $node ) SECONDARY_MEMORY=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().mem.resident; " --host $node ) SECONDARY_CACHE=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().wiredTiger.cache['bytes currently in the cache'] / 1024 / 1024; " --host $node ) log_performance_data "connections" $SECONDARY_CONNECTIONS $node log_performance_data "operations" $SECONDARY_OPERATIONS $node log_performance_data "memory_usage" $SECONDARY_MEMORY $node log_performance_data "cache_usage" $SECONDARY_CACHE $node done REPLICA_SET_STATUS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " rs.status().ok; " ) log_performance_data "replica_set_status" $REPLICA_SET_STATUS "replica_set" sleep $MONITOR_INTERVAL done } generate_performance_report () { local report_file="/var/log/mongodb-performance-report-3node-4c8g-$(date +%Y%m%d) .txt" log "生成MongoDB性能报告(三节点4核8GB环境): $report_file " cat > $report_file << EOF MongoDB性能监控报告 - 三节点4核8GB环境 生成时间: $(date) ======================================== EOF echo "系统性能信息:" >> $report_file echo "----------------------------------------" >> $report_file uptime >> $report_file free -h >> $report_file echo "" >> $report_file echo "主节点 ($PRIMARY_NODE ) 性能信息:" >> $report_file echo "----------------------------------------" >> $report_file mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --eval "db.serverStatus()" >> $report_file echo "" >> $report_file for node in "${SECONDARY_NODES[@]} " ; do echo "从节点 ($node ) 性能信息:" >> $report_file echo "----------------------------------------" >> $report_file mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $node --eval "db.serverStatus()" >> $report_file echo "" >> $report_file done echo "性能统计:" >> $report_file echo "----------------------------------------" >> $report_file PRIMARY_OPS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().opcounters.total; " ) echo "主节点总操作数: $PRIMARY_OPS " >> $report_file PRIMARY_CONNECTIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().connections.current; " ) echo "主节点当前连接数: $PRIMARY_CONNECTIONS " >> $report_file PRIMARY_MEMORY=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().mem.resident; " ) echo "主节点内存使用: ${PRIMARY_MEMORY} MB" >> $report_file PRIMARY_CACHE=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().wiredTiger.cache['bytes currently in the cache'] / 1024 / 1024; " ) echo "主节点缓存使用: ${PRIMARY_CACHE} MB" >> $report_file log "性能报告生成完成: $report_file " } setup_performance_alerts () { log "设置MongoDB性能告警(三节点4核8GB环境)..." cat > /opt/mongodb-performance-alert-3node-4c8g.sh << 'EOF' REPLICA_SET_NAME="rs0" PRIMARY_NODE="192.168.1.10:27017" SECONDARY_NODES=("192.168.1.11:27017" "192.168.1.12:27017" ) MONGODB_USER="admin" MONGODB_PASSWORD="admin123" check_performance_alerts () { SYSTEM_LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//' ) if (( $(echo "$SYSTEM_LOAD > 3.0 " | bc -l) )); then echo "告警: 系统负载过高 ($SYSTEM_LOAD )" fi PRIMARY_CONNECTIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().connections.current; " ) if [ $PRIMARY_CONNECTIONS -gt 1500 ]; then echo "告警: 主节点连接数过高 ($PRIMARY_CONNECTIONS )" fi PRIMARY_OPERATIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().opcounters.total; " ) if [ $PRIMARY_OPERATIONS -gt 1000000 ]; then echo "告警: 主节点操作数过高 ($PRIMARY_OPERATIONS )" fi PRIMARY_MEMORY=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().mem.resident; " ) if [ $PRIMARY_MEMORY -gt 6000 ]; then echo "告警: 主节点内存使用过高 (${PRIMARY_MEMORY} MB)" fi for node in "${SECONDARY_NODES[@]} " ; do SECONDARY_CONNECTIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().connections.current; " --host $node ) if [ $SECONDARY_CONNECTIONS -gt 1500 ]; then echo "告警: 从节点 $node 连接数过高 ($SECONDARY_CONNECTIONS )" fi SECONDARY_OPERATIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().opcounters.total; " --host $node ) if [ $SECONDARY_OPERATIONS -gt 1000000 ]; then echo "告警: 从节点 $node 操作数过高 ($SECONDARY_OPERATIONS )" fi SECONDARY_MEMORY=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " db.serverStatus().mem.resident; " --host $node ) if [ $SECONDARY_MEMORY -gt 6000 ]; then echo "告警: 从节点 $node 内存使用过高 (${SECONDARY_MEMORY} MB)" fi done REPLICA_SET_STATUS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --quiet --eval " rs.status().ok; " ) if [ "$REPLICA_SET_STATUS " != "1" ]; then echo "告警: 副本集状态异常 ($REPLICA_SET_STATUS )" fi } while true ; do check_performance_alerts sleep 300 done EOF chmod +x /opt/mongodb-performance-alert-3node-4c8g.sh nohup /opt/mongodb-performance-alert-3node-4c8g.sh > /var/log/mongodb-performance-alert-3node-4c8g.log 2>&1 & log "性能告警设置完成" } main () { case $1 in "monitor" ) monitor_performance_metrics ;; "report" ) generate_performance_report ;; "alerts" ) setup_performance_alerts ;; *) echo "用法: $0 {monitor|report|alerts}" echo " monitor - 开始性能监控" echo " report - 生成性能报告" echo " alerts - 设置性能告警" ;; esac } main "$@ "
4. 总结 4.1 三节点4核8GB极速型SSD环境最佳实践
资源分配 : 合理分配内存,每个节点2GB缓存,系统保留6GB内存
SSD优化 : 充分利用极速型SSD的高性能特性,优化IO性能
三节点架构 : 一主两从的副本集架构,确保高可用性和数据冗余
性能调优 : 针对4核8GB环境的MongoDB性能优化策略
监控告警 : 建立全面的监控体系,确保系统稳定运行
4.2 关键指标监控
系统负载 : 监控CPU和内存使用情况
MongoDB性能 : 监控连接数、操作数、内存使用、缓存使用
副本集状态 : 监控主从节点状态和同步情况
SSD性能 : 监控磁盘IO性能和SSD优化参数
故障转移 : 监控故障转移事件和恢复时间
4.3 运维工具推荐
监控工具 : MongoDB Compass, MongoDB Atlas, 自定义监控脚本
告警工具 : 完善的告警机制,及时发现问题
管理工具 : mongo shell, MongoDB Ops Manager
备份工具 : mongodump, mongorestore
诊断工具 : mongostat, mongotop, 性能分析脚本
通过本文的MongoDB副本集三节点4核8GB极速型SSD运维实战指南,您可以在高性能服务器上建立高效的MongoDB副本集架构,充分利用4核8GB和极速型SSD的性能优势,确保系统的高性能和高可用性。记住,在资源充足的环境中,需要更加精细的资源管理和性能优化。