第133集MongoDB、Kafka、Redis、MySQL多数据库运维实战 | 字数总计: 6.8k | 阅读时长: 34分钟 | 阅读量:
1. 多数据库架构概述 在现代企业应用中,往往需要同时使用多种数据库技术来满足不同的业务需求。MongoDB用于文档存储,Kafka用于消息队列,Redis用于缓存,MySQL用于关系型数据存储。本文将详细介绍多数据库环境的运维实战经验,包括环境部署、数据同步、统一监控、运维管理的完整解决方案。
1.1 核心功能
多数据库部署 : 统一部署MongoDB、Kafka、Redis、MySQL
数据同步 : 实现不同数据库间的数据同步和集成
统一监控 : 建立多数据库的统一监控体系
运维管理 : 提供多数据库的统一运维管理方案
高可用保障 : 确保多数据库系统的高可用性
1.2 技术架构 1 2 3 4 5 应用层 → MongoDB(文档) → Kafka(消息) → Redis(缓存) → MySQL(关系) ↓ ↓ ↓ ↓ ↓ 数据同步 → 消息传递 → 缓存更新 → 数据持久化 → 监控告警 ↓ ↓ ↓ ↓ ↓ 统一监控 → 运维管理 → 故障处理 → 性能优化 → 备份恢复
2. 环境准备 2.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 #!/bin/bash log () { echo "[$(date '+%Y-%m-%d %H:%M:%S') ] $1 " } check_system_environment () { log "开始检查多数据库系统环境..." if [[ "$OSTYPE " == "linux-gnu" * ]]; then OS_VERSION=$(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2) log "操作系统: $OS_VERSION " else log "错误: 不支持的操作系统 $OSTYPE " exit 1 fi TOTAL_MEM=$(free -h | grep "Mem:" | awk '{print $2}' ) AVAILABLE_MEM=$(free -h | grep "Mem:" | awk '{print $7}' ) CPU_CORES=$(nproc ) DISK_SPACE=$(df -h / | tail -1 | awk '{print $4}' ) log "系统资源检查:" log " 总内存: $TOTAL_MEM " log " 可用内存: $AVAILABLE_MEM " log " CPU核心数: $CPU_CORES " log " 可用磁盘空间: $DISK_SPACE " check_network_connectivity } check_network_connectivity () { log "检查网络连通性..." DB_NODES=("192.168.1.10" "192.168.1.11" "192.168.1.12" ) for node in "${DB_NODES[@]} " ; do if ping -c 3 $node > /dev/null 2>&1; then log "节点网络连通正常: $node " else log "警告: 节点网络连通异常: $node " fi done check_port_availability } check_port_availability () { log "检查多数据库端口可用性..." MONGODB_PORTS=(27017 27018 27019) KAFKA_PORTS=(9092 9093 9094) REDIS_PORTS=(6379 6380 6381) MYSQL_PORTS=(3306 3307 3308) ALL_PORTS=("${MONGODB_PORTS[@]} " "${KAFKA_PORTS[@]} " "${REDIS_PORTS[@]} " "${MYSQL_PORTS[@]} " ) for port in "${ALL_PORTS[@]} " ; do if netstat -tlnp | grep ":$port " > /dev/null; then log "警告: 端口 $port 已被占用" else log "端口 $port 可用" fi done } check_database_installation () { log "检查多数据库安装状态..." if command -v mongod > /dev/null 2>&1; then MONGODB_VERSION=$(mongod --version | head -1) log "MongoDB已安装: $MONGODB_VERSION " else log "MongoDB未安装,开始安装..." install_mongodb fi if [ -d "/opt/kafka" ]; then log "Kafka已安装" else log "Kafka未安装,开始安装..." install_kafka fi if command -v redis-server > /dev/null 2>&1; then REDIS_VERSION=$(redis-server --version | head -1) log "Redis已安装: $REDIS_VERSION " else log "Redis未安装,开始安装..." install_redis fi if command -v mysql > /dev/null 2>&1; then MYSQL_VERSION=$(mysql --version) log "MySQL已安装: $MYSQL_VERSION " else log "MySQL未安装,开始安装..." install_mysql fi } install_mongodb () { log "开始安装MongoDB..." wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list sudo apt-get update sudo apt-get install -y mongodb-org sudo systemctl start mongod sudo systemctl enable mongod log "MongoDB安装完成" } install_kafka () { log "开始安装Kafka..." wget https://downloads.apache.org/kafka/2.8.1/kafka_2.13-2.8.1.tgz tar -xzf kafka_2.13-2.8.1.tgz mv kafka_2.13-2.8.1 /opt/kafka sudo useradd -r -s /bin/false kafka sudo chown -R kafka:kafka /opt/kafka cat > /etc/systemd/system/kafka.service << EOF [Unit] Description=Apache Kafka After=network.target [Service] Type=simple User=kafka ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties Restart=always [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl start kafka sudo systemctl enable kafka log "Kafka安装完成" } install_redis () { log "开始安装Redis..." sudo apt-get update sudo apt-get install -y redis-server sudo systemctl start redis sudo systemctl enable redis log "Redis安装完成" } install_mysql () { log "开始安装MySQL..." sudo apt-get update sudo apt-get install -y mysql-server sudo systemctl start mysql sudo systemctl enable mysql sudo mysql_secure_installation log "MySQL安装完成" } main () { log "=== 多数据库环境检查开始 ===" check_system_environment check_database_installation log "=== 多数据库环境检查完成 ===" } main "$@ "
2.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 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 #!/bin/bash MONGODB_PORT=27017 KAFKA_PORT=9092 REDIS_PORT=6379 MYSQL_PORT=3306 backup_config_files () { log "备份多数据库配置文件..." 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 if [ -f "/opt/kafka/config/server.properties" ]; then sudo cp /opt/kafka/config/server.properties /opt/kafka/config/server.properties.backup.$(date +%Y%m%d_%H%M%S) log "Kafka配置文件已备份" fi if [ -f "/etc/redis/redis.conf" ]; then sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.backup.$(date +%Y%m%d_%H%M%S) log "Redis配置文件已备份" fi if [ -f "/etc/mysql/mysql.conf.d/mysqld.cnf" ]; then sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup.$(date +%Y%m%d_%H%M%S) log "MySQL配置文件已备份" fi } configure_mongodb () { log "配置MongoDB..." cat > /etc/mongod.conf << EOF # MongoDB配置 storage: dbPath: /var/lib/mongodb journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 2 journalCompressor: snappy directoryForIndexes: false collectionConfig: blockCompressor: snappy indexConfig: prefixCompression: true systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log logRotate: reopen net: port: $MONGODB_PORT bindIp: 0.0.0.0 maxIncomingConnections: 1000 processManagement: timeZoneInfo: /usr/share/zoneinfo replication: replSetName: rs0 security: authorization: enabled keyFile: /etc/mongodb-keyfile operationProfiling: slowOpThresholdMs: 100 mode: slowOp setParameter: enableLocalhostAuthBypass: false EOF log "MongoDB配置完成" } configure_kafka () { log "配置Kafka..." cat > /opt/kafka/config/server.properties << EOF # Kafka配置 broker.id=0 listeners=PLAINTEXT://0.0.0.0:$KAFKA_PORT advertised.listeners=PLAINTEXT://192.168.1.10:$KAFKA_PORT num.network.threads=3 num.io.threads=8 socket.send.buffer.bytes=102400 socket.receive.buffer.bytes=102400 socket.request.max.bytes=104857600 log.dirs=/opt/kafka/logs num.partitions=3 num.recovery.threads.per.data.dir=1 offsets.topic.replication.factor=3 transaction.state.log.replication.factor=3 transaction.state.log.min.isr=2 log.retention.hours=168 log.segment.bytes=1073741824 log.retention.check.interval.ms=300000 zookeeper.connect=localhost:2181 zookeeper.connection.timeout.ms=18000 group.initial.rebalance.delay.ms=0 EOF log "Kafka配置完成" } configure_redis () { log "配置Redis..." cat > /etc/redis/redis.conf << EOF # Redis配置 bind 0.0.0.0 port $REDIS_PORT timeout 300 tcp-keepalive 300 # 内存配置 maxmemory 2gb maxmemory-policy allkeys-lru # 持久化配置 save 900 1 save 300 10 save 60 10000 appendonly yes appendfsync everysec # 主从复制配置 replica-read-only yes replica-serve-stale-data yes # 安全配置 requirepass redis123 # 日志配置 loglevel notice logfile /var/log/redis/redis-server.log # 其他配置 daemonize yes pidfile /var/run/redis/redis-server.pid dir /var/lib/redis EOF log "Redis配置完成" } configure_mysql () { log "配置MySQL..." cat > /etc/mysql/mysql.conf.d/mysqld.cnf << EOF # MySQL配置 [mysqld] user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = $MYSQL_PORT basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking # 性能优化 key_buffer_size = 256M max_allowed_packet = 64M table_open_cache = 256 sort_buffer_size = 2M read_buffer_size = 2M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size = 64M tmp_table_size = 64M max_heap_table_size = 64M # 连接配置 max_connections = 1000 max_connect_errors = 1000 wait_timeout = 28800 interactive_timeout = 28800 # 日志配置 log-error = /var/log/mysql/error.log slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 # 二进制日志 log-bin = mysql-bin binlog_format = ROW expire_logs_days = 7 max_binlog_size = 100M # InnoDB配置 innodb_buffer_pool_size = 1G innodb_log_file_size = 256M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 [mysql] no-auto-rehash [myisamchk] key_buffer_size = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout EOF log "MySQL配置完成" } create_keyfile () { log "创建MongoDB认证密钥文件..." openssl rand -base64 756 > /etc/mongodb-keyfile chmod 600 /etc/mongodb-keyfile chown mongodb:mongodb /etc/mongodb-keyfile log "认证密钥文件创建完成" } start_services () { log "启动多数据库服务..." systemctl restart mongod systemctl enable mongod systemctl restart kafka systemctl enable kafka systemctl restart redis systemctl enable redis systemctl restart mysql systemctl enable mysql sleep 5 if systemctl is-active --quiet mongod; then log "MongoDB服务启动成功" else log "错误: MongoDB服务启动失败" fi if systemctl is-active --quiet kafka; then log "Kafka服务启动成功" else log "错误: Kafka服务启动失败" fi if systemctl is-active --quiet redis; then log "Redis服务启动成功" else log "错误: Redis服务启动失败" fi if systemctl is-active --quiet mysql; then log "MySQL服务启动成功" else log "错误: MySQL服务启动失败" fi } main () { log "=== 多数据库配置优化开始 ===" backup_config_files configure_mongodb configure_kafka configure_redis configure_mysql create_keyfile start_services log "=== 多数据库配置优化完成 ===" } 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 #!/bin/bash MONGODB_HOST="192.168.1.10:27017" KAFKA_HOST="192.168.1.10:9092" REDIS_HOST="192.168.1.10:6379" MYSQL_HOST="192.168.1.10:3306" MONGODB_USER="admin" MONGODB_PASSWORD="admin123" REDIS_PASSWORD="redis123" MYSQL_USER="root" MYSQL_PASSWORD="mysql123" check_database_connections () { log "检查多数据库连接..." if mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --eval "db.runCommand('ping')" > /dev/null 2>&1; then log "MongoDB连接正常" else log "错误: MongoDB连接失败" return 1 fi if /opt/kafka/bin/kafka-topics.sh --bootstrap-server $KAFKA_HOST --list > /dev/null 2>&1; then log "Kafka连接正常" else log "错误: Kafka连接失败" return 1 fi if redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD ping > /dev/null 2>&1; then log "Redis连接正常" else log "错误: Redis连接失败" return 1 fi if mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT 1;" > /dev/null 2>&1; then log "MySQL连接正常" else log "错误: MySQL连接失败" return 1 fi } sync_mongodb_to_mysql () { log "开始MongoDB到MySQL数据同步..." mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e " CREATE DATABASE IF NOT EXISTS sync_db; USE sync_db; CREATE TABLE IF NOT EXISTS mongodb_sync ( id VARCHAR(255) PRIMARY KEY, collection_name VARCHAR(255), document_data JSON, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); " mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --eval " use test_db; db.test_collection.find().forEach(function(doc) { var data = { id: doc._id.toString(), collection_name: 'test_collection', document_data: JSON.stringify(doc) }; // 这里应该调用MySQL插入操作 print('同步文档: ' + doc._id); }); " log "MongoDB到MySQL数据同步完成" } sync_mysql_to_redis () { log "开始MySQL到Redis数据同步..." mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e " USE sync_db; SELECT id, collection_name, document_data FROM mongodb_sync; " | while read id collection_name document_data; do if [ "$id " != "id" ]; then redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD set "sync:$id " "$document_data " log "同步数据到Redis: $id " fi done log "MySQL到Redis数据同步完成" } send_redis_to_kafka () { log "开始Redis到Kafka消息发送..." /opt/kafka/bin/kafka-topics.sh --bootstrap-server $KAFKA_HOST --create --topic redis_sync --partitions 3 --replication-factor 1 --if-not-exists redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD keys "sync:*" | while read key; do value=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD get "$key " ) echo "$value " | /opt/kafka/bin/kafka-console-producer.sh --bootstrap-server $KAFKA_HOST --topic redis_sync log "发送消息到Kafka: $key " done log "Redis到Kafka消息发送完成" } consume_kafka_to_mongodb () { log "开始Kafka到MongoDB消息消费..." /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server $KAFKA_HOST --topic redis_sync --from-beginning | while read message; do mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --eval " use sync_db; var doc = JSON.parse('$message '); db.kafka_sync.insertOne(doc); " log "消费消息并写入MongoDB: $message " done log "Kafka到MongoDB消息消费完成" } full_sync () { log "开始全量数据同步..." if ! check_database_connections; then log "错误: 数据库连接失败,无法进行数据同步" return 1 fi sync_mongodb_to_mysql sync_mysql_to_redis send_redis_to_kafka log "全量数据同步完成" } incremental_sync () { log "开始增量数据同步..." if ! check_database_connections; then log "错误: 数据库连接失败,无法进行数据同步" return 1 fi LAST_SYNC_TIME=$(date -d "1 hour ago" +"%Y-%m-%d %H:%M:%S" ) mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --eval " use test_db; db.test_collection.find({updated_at: {\$gte: new Date('$LAST_SYNC_TIME ')}}).forEach(function(doc) { print('增量同步文档: ' + doc._id); }); " log "增量数据同步完成" } main () { case $1 in "check" ) check_database_connections ;; "full" ) full_sync ;; "incremental" ) incremental_sync ;; "mongodb-mysql" ) sync_mongodb_to_mysql ;; "mysql-redis" ) sync_mysql_to_redis ;; "redis-kafka" ) send_redis_to_kafka ;; "kafka-mongodb" ) consume_kafka_to_mongodb ;; *) echo "用法: $0 {check|full|incremental|mongodb-mysql|mysql-redis|redis-kafka|kafka-mongodb}" echo " check - 检查数据库连接" echo " full - 全量数据同步" echo " incremental - 增量数据同步" echo " mongodb-mysql - MongoDB到MySQL同步" echo " mysql-redis - MySQL到Redis同步" echo " redis-kafka - Redis到Kafka同步" echo " kafka-mongodb - Kafka到MongoDB同步" ;; 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 #!/bin/bash MONGODB_HOST="192.168.1.10:27017" KAFKA_HOST="192.168.1.10:9092" REDIS_HOST="192.168.1.10:6379" MYSQL_HOST="192.168.1.10:3306" MONGODB_USER="admin" MONGODB_PASSWORD="admin123" REDIS_PASSWORD="redis123" MYSQL_USER="root" MYSQL_PASSWORD="mysql123" MONITOR_INTERVAL=30 LOG_FILE="/var/log/multi-db-sync-monitor.log" log_sync_data () { local timestamp=$(date '+%Y-%m-%d %H:%M:%S' ) local metric=$1 local value=$2 local database=$3 echo "[$timestamp ] Database:$database Metric:$metric Value:$value " >> $LOG_FILE } monitor_sync_status () { log "开始监控多数据库数据同步状态..." while true ; do MONGODB_STATUS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.runCommand('ping').ok; " ) log_sync_data "status" $MONGODB_STATUS "mongodb" KAFKA_TOPICS=$(/opt/kafka/bin/kafka-topics.sh --bootstrap-server $KAFKA_HOST --list | wc -l) log_sync_data "topics_count" $KAFKA_TOPICS "kafka" REDIS_STATUS=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD ping) log_sync_data "status" $REDIS_STATUS "redis" MYSQL_STATUS=$(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT 1;" 2>/dev/null | wc -l) log_sync_data "status" $MYSQL_STATUS "mysql" monitor_sync_lag sleep $MONITOR_INTERVAL done } monitor_sync_lag () { MONGODB_COUNT=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.test_collection.count(); " ) MYSQL_COUNT=$(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT COUNT(*) FROM sync_db.mongodb_sync;" 2>/dev/null | tail -1) if [ "$MONGODB_COUNT " != "$MYSQL_COUNT " ]; then SYNC_LAG=$((MONGODB_COUNT - MYSQL_COUNT)) log_sync_data "sync_lag" $SYNC_LAG "mongodb-mysql" fi REDIS_COUNT=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD keys "sync:*" | wc -l) if [ "$MYSQL_COUNT " != "$REDIS_COUNT " ]; then SYNC_LAG=$((MYSQL_COUNT - REDIS_COUNT)) log_sync_data "sync_lag" $SYNC_LAG "mysql-redis" fi } generate_sync_report () { local report_file="/var/log/multi-db-sync-report-$(date +%Y%m%d) .txt" log "生成多数据库同步报告: $report_file " cat > $report_file << EOF 多数据库同步监控报告 生成时间: $(date) ======================================== EOF echo "MongoDB状态:" >> $report_file echo "----------------------------------------" >> $report_file mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --eval "db.stats()" >> $report_file echo "" >> $report_file echo "Kafka状态:" >> $report_file echo "----------------------------------------" >> $report_file /opt/kafka/bin/kafka-topics.sh --bootstrap-server $KAFKA_HOST --list >> $report_file echo "" >> $report_file echo "Redis状态:" >> $report_file echo "----------------------------------------" >> $report_file redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD info >> $report_file echo "" >> $report_file echo "MySQL状态:" >> $report_file echo "----------------------------------------" >> $report_file mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW STATUS;" >> $report_file echo "" >> $report_file echo "同步统计:" >> $report_file echo "----------------------------------------" >> $report_file MONGODB_COUNT=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.test_collection.count(); " ) MYSQL_COUNT=$(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT COUNT(*) FROM sync_db.mongodb_sync;" 2>/dev/null | tail -1) REDIS_COUNT=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD keys "sync:*" | wc -l) echo "MongoDB文档数: $MONGODB_COUNT " >> $report_file echo "MySQL记录数: $MYSQL_COUNT " >> $report_file echo "Redis键数: $REDIS_COUNT " >> $report_file log "同步报告生成完成: $report_file " } setup_sync_alerts () { log "设置多数据库同步告警..." cat > /opt/multi-db-sync-alert.sh << 'EOF' MONGODB_HOST="192.168.1.10:27017" KAFKA_HOST="192.168.1.10:9092" REDIS_HOST="192.168.1.10:6379" MYSQL_HOST="192.168.1.10:3306" MONGODB_USER="admin" MONGODB_PASSWORD="admin123" REDIS_PASSWORD="redis123" MYSQL_USER="root" MYSQL_PASSWORD="mysql123" check_sync_alerts () { MONGODB_STATUS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.runCommand('ping').ok; " ) if [ "$MONGODB_STATUS " != "1" ]; then echo "告警: MongoDB连接失败" fi if ! /opt/kafka/bin/kafka-topics.sh --bootstrap-server $KAFKA_HOST --list > /dev/null 2>&1; then echo "告警: Kafka连接失败" fi REDIS_STATUS=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD ping) if [ "$REDIS_STATUS " != "PONG" ]; then echo "告警: Redis连接失败" fi if ! mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT 1;" > /dev/null 2>&1; then echo "告警: MySQL连接失败" fi MONGODB_COUNT=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.test_collection.count(); " ) MYSQL_COUNT=$(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT COUNT(*) FROM sync_db.mongodb_sync;" 2>/dev/null | tail -1) if [ "$MONGODB_COUNT " != "$MYSQL_COUNT " ]; then SYNC_LAG=$((MONGODB_COUNT - MYSQL_COUNT)) echo "告警: MongoDB到MySQL同步延迟过高 ($SYNC_LAG )" fi } while true ; do check_sync_alerts sleep 300 done EOF chmod +x /opt/multi-db-sync-alert.sh nohup /opt/multi-db-sync-alert.sh > /var/log/multi-db-sync-alert.log 2>&1 & log "同步告警设置完成" } main () { case $1 in "monitor" ) monitor_sync_status ;; "report" ) generate_sync_report ;; "alerts" ) setup_sync_alerts ;; *) echo "用法: $0 {monitor|report|alerts}" echo " monitor - 开始同步监控" echo " report - 生成同步报告" echo " alerts - 设置同步告警" ;; esac } main "$@ "
4. 统一监控管理 4.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 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 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 #!/bin/bash MONGODB_HOST="192.168.1.10:27017" KAFKA_HOST="192.168.1.10:9092" REDIS_HOST="192.168.1.10:6379" MYSQL_HOST="192.168.1.10:3306" MONGODB_USER="admin" MONGODB_PASSWORD="admin123" REDIS_PASSWORD="redis123" MYSQL_USER="root" MYSQL_PASSWORD="mysql123" MONITOR_INTERVAL=30 LOG_FILE="/var/log/multi-db-unified-monitor.log" log_monitor_data () { local timestamp=$(date '+%Y-%m-%d %H:%M:%S' ) local metric=$1 local value=$2 local database=$3 echo "[$timestamp ] Database:$database Metric:$metric Value:$value " >> $LOG_FILE } monitor_multi_db_status () { log "开始监控多数据库状态..." 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_monitor_data "system_load" $SYSTEM_LOAD "system" log_monitor_data "cpu_usage" $CPU_USAGE "system" log_monitor_data "memory_usage" $MEMORY_USAGE "system" monitor_mongodb_status monitor_kafka_status monitor_redis_status monitor_mysql_status sleep $MONITOR_INTERVAL done } monitor_mongodb_status () { if mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --eval "db.runCommand('ping')" > /dev/null 2>&1; then MONGODB_CONNECTIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.serverStatus().connections.current; " ) MONGODB_OPERATIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.serverStatus().opcounters.total; " ) MONGODB_MEMORY=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.serverStatus().mem.resident; " ) log_monitor_data "connections" $MONGODB_CONNECTIONS "mongodb" log_monitor_data "operations" $MONGODB_OPERATIONS "mongodb" log_monitor_data "memory_usage" $MONGODB_MEMORY "mongodb" else log_monitor_data "status" "down" "mongodb" fi } monitor_kafka_status () { if /opt/kafka/bin/kafka-topics.sh --bootstrap-server $KAFKA_HOST --list > /dev/null 2>&1; then KAFKA_TOPICS=$(/opt/kafka/bin/kafka-topics.sh --bootstrap-server $KAFKA_HOST --list | wc -l) KAFKA_CONSUMER_GROUPS=$(/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server $KAFKA_HOST --list | wc -l) log_monitor_data "topics_count" $KAFKA_TOPICS "kafka" log_monitor_data "consumer_groups" $KAFKA_CONSUMER_GROUPS "kafka" else log_monitor_data "status" "down" "kafka" fi } monitor_redis_status () { if redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD ping > /dev/null 2>&1; then REDIS_CONNECTIONS=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD info clients | grep "connected_clients:" | cut -d: -f2 | tr -d '\r' ) REDIS_OPERATIONS=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD info stats | grep "total_commands_processed:" | cut -d: -f2 | tr -d '\r' ) REDIS_MEMORY=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD info memory | grep "used_memory_human:" | cut -d: -f2 | tr -d '\r' ) log_monitor_data "connections" $REDIS_CONNECTIONS "redis" log_monitor_data "operations" $REDIS_OPERATIONS "redis" log_monitor_data "memory_usage" $REDIS_MEMORY "redis" else log_monitor_data "status" "down" "redis" fi } monitor_mysql_status () { if mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT 1;" > /dev/null 2>&1; then MYSQL_CONNECTIONS=$(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null | tail -1 | awk '{print $2}' ) MYSQL_OPERATIONS=$(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW STATUS LIKE 'Queries';" 2>/dev/null | tail -1 | awk '{print $2}' ) MYSQL_MEMORY=$(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW STATUS LIKE 'Innodb_buffer_pool_pages_data';" 2>/dev/null | tail -1 | awk '{print $2}' ) log_monitor_data "connections" $MYSQL_CONNECTIONS "mysql" log_monitor_data "operations" $MYSQL_OPERATIONS "mysql" log_monitor_data "memory_usage" $MYSQL_MEMORY "mysql" else log_monitor_data "status" "down" "mysql" fi } generate_unified_report () { local report_file="/var/log/multi-db-unified-report-$(date +%Y%m%d) .txt" log "生成多数据库统一监控报告: $report_file " cat > $report_file << EOF 多数据库统一监控报告 生成时间: $(date) ======================================== EOF echo "系统性能信息:" >> $report_file echo "----------------------------------------" >> $report_file uptime >> $report_file free -h >> $report_file echo "" >> $report_file echo "MongoDB状态:" >> $report_file echo "----------------------------------------" >> $report_file mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --eval "db.serverStatus()" >> $report_file echo "" >> $report_file echo "Kafka状态:" >> $report_file echo "----------------------------------------" >> $report_file /opt/kafka/bin/kafka-topics.sh --bootstrap-server $KAFKA_HOST --list >> $report_file echo "" >> $report_file echo "Redis状态:" >> $report_file echo "----------------------------------------" >> $report_file redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD info >> $report_file echo "" >> $report_file echo "MySQL状态:" >> $report_file echo "----------------------------------------" >> $report_file mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW STATUS;" >> $report_file echo "" >> $report_file echo "统一统计:" >> $report_file echo "----------------------------------------" >> $report_file MONGODB_CONNECTIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.serverStatus().connections.current; " ) REDIS_CONNECTIONS=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD info clients | grep "connected_clients:" | cut -d: -f2 | tr -d '\r' ) MYSQL_CONNECTIONS=$(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null | tail -1 | awk '{print $2}' ) TOTAL_CONNECTIONS=$((MONGODB_CONNECTIONS + REDIS_CONNECTIONS + MYSQL_CONNECTIONS)) echo "MongoDB连接数: $MONGODB_CONNECTIONS " >> $report_file echo "Redis连接数: $REDIS_CONNECTIONS " >> $report_file echo "MySQL连接数: $MYSQL_CONNECTIONS " >> $report_file echo "总连接数: $TOTAL_CONNECTIONS " >> $report_file log "统一监控报告生成完成: $report_file " } setup_unified_alerts () { log "设置多数据库统一告警..." cat > /opt/multi-db-unified-alert.sh << 'EOF' MONGODB_HOST="192.168.1.10:27017" KAFKA_HOST="192.168.1.10:9092" REDIS_HOST="192.168.1.10:6379" MYSQL_HOST="192.168.1.10:3306" MONGODB_USER="admin" MONGODB_PASSWORD="admin123" REDIS_PASSWORD="redis123" MYSQL_USER="root" MYSQL_PASSWORD="mysql123" check_unified_alerts () { SYSTEM_LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//' ) if (( $(echo "$SYSTEM_LOAD > 5.0 " | bc -l) )); then echo "告警: 系统负载过高 ($SYSTEM_LOAD )" fi MONGODB_STATUS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.runCommand('ping').ok; " ) if [ "$MONGODB_STATUS " != "1" ]; then echo "告警: MongoDB连接失败" fi MONGODB_CONNECTIONS=$(mongo -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase admin --host $MONGODB_HOST --quiet --eval " db.serverStatus().connections.current; " ) if [ $MONGODB_CONNECTIONS -gt 800 ]; then echo "告警: MongoDB连接数过高 ($MONGODB_CONNECTIONS )" fi if ! /opt/kafka/bin/kafka-topics.sh --bootstrap-server $KAFKA_HOST --list > /dev/null 2>&1; then echo "告警: Kafka连接失败" fi REDIS_STATUS=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD ping) if [ "$REDIS_STATUS " != "PONG" ]; then echo "告警: Redis连接失败" fi REDIS_CONNECTIONS=$(redis-cli -h $REDIS_HOST -p 6379 -a $REDIS_PASSWORD info clients | grep "connected_clients:" | cut -d: -f2 | tr -d '\r' ) if [ $REDIS_CONNECTIONS -gt 500 ]; then echo "告警: Redis连接数过高 ($REDIS_CONNECTIONS )" fi if ! mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT 1;" > /dev/null 2>&1; then echo "告警: MySQL连接失败" fi MYSQL_CONNECTIONS=$(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW STATUS LIKE 'Threads_connected';" 2>/dev/null | tail -1 | awk '{print $2}' ) if [ $MYSQL_CONNECTIONS -gt 200 ]; then echo "告警: MySQL连接数过高 ($MYSQL_CONNECTIONS )" fi } while true ; do check_unified_alerts sleep 300 done EOF chmod +x /opt/multi-db-unified-alert.sh nohup /opt/multi-db-unified-alert.sh > /var/log/multi-db-unified-alert.log 2>&1 & log "统一告警设置完成" } main () { case $1 in "monitor" ) monitor_multi_db_status ;; "report" ) generate_unified_report ;; "alerts" ) setup_unified_alerts ;; *) echo "用法: $0 {monitor|report|alerts}" echo " monitor - 开始统一监控" echo " report - 生成统一报告" echo " alerts - 设置统一告警" ;; esac } main "$@ "
5. 总结 5.1 多数据库运维最佳实践
统一部署 : 统一部署MongoDB、Kafka、Redis、MySQL,确保版本兼容性
数据同步 : 建立完善的数据同步机制,确保数据一致性
统一监控 : 建立多数据库的统一监控体系,及时发现和处理问题
运维管理 : 提供多数据库的统一运维管理方案
高可用保障 : 确保多数据库系统的高可用性
5.2 关键指标监控
系统性能 : 监控CPU、内存、磁盘使用情况
数据库状态 : 监控各数据库的连接数、操作数、内存使用
数据同步 : 监控数据同步延迟和一致性
故障转移 : 监控故障转移事件和恢复时间
性能指标 : 监控各数据库的性能指标
5.3 运维工具推荐
监控工具 : Prometheus + Grafana, 自定义监控脚本
告警工具 : Alertmanager, 统一告警机制
管理工具 : 各数据库原生管理工具, 统一管理脚本
备份工具 : 各数据库备份工具, 统一备份方案
诊断工具 : 各数据库诊断工具, 统一诊断脚本
通过本文的MongoDB、Kafka、Redis、MySQL多数据库运维实战指南,您可以建立完善的多数据库运维体系,确保系统的高可用性和数据一致性。记住,多数据库的运维需要统一管理,确保各数据库之间的协调工作。