13 · 数据库运维¶
PostgreSQL 文档:https://www.postgresql.org/docs/ Redis 文档:https://redis.io/docs/ PgBouncer 文档:https://www.pgbouncer.org/
1. PostgreSQL 运维¶
常用诊断查询¶
-- 活跃连接数 & 等待情况
SELECT state, wait_event_type, wait_event, count(*)
FROM pg_stat_activity
GROUP BY state, wait_event_type, wait_event
ORDER BY count DESC;
-- 慢查询(执行超 1 秒)
SELECT pid, now() - query_start as duration, query, state
FROM pg_stat_activity
WHERE state != 'idle' AND now() - query_start > interval '1 second'
ORDER BY duration DESC;
-- 表大小排名
SELECT schemaname, tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 20;
-- 索引使用率(找未使用的索引)
SELECT schemaname, tablename, indexname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;
-- 锁等待(排障关键)
SELECT bl.pid AS blocked_pid, a.query AS blocked_query,
kl.pid AS blocking_pid, ka.query AS blocking_query
FROM pg_catalog.pg_locks bl
JOIN pg_catalog.pg_stat_activity a ON a.pid = bl.pid
JOIN pg_catalog.pg_locks kl ON kl.transactionid = bl.transactionid AND kl.pid != bl.pid
JOIN pg_catalog.pg_stat_activity ka ON ka.pid = kl.pid
WHERE NOT bl.granted;
-- 终止指定 PID
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid = 12345;
-- 终止所有空闲超过 10 分钟的连接
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE state = 'idle' AND now() - state_change > interval '10 minutes';
PgBouncer 连接池配置¶
# /etc/pgbouncer/pgbouncer.ini
# 官方文档:https://www.pgbouncer.org/config.html
[databases]
igaming = host=rds-endpoint.amazonaws.com port=5432 dbname=igaming
[pgbouncer]
listen_port = 5432
listen_addr = 0.0.0.0
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction # 事务级连接池(推荐,比 session 效率高)
max_client_conn = 1000 # 最大客户端连接
default_pool_size = 25 # 每个数据库+用户的池大小
reserve_pool_size = 5 # 保留连接(突发用)
server_idle_timeout = 600 # 服务端空闲连接超时
# 状态查看
PGPASSWORD=xxx psql -p 5432 -U pgbouncer pgbouncer -c "SHOW POOLS;"
PGPASSWORD=xxx psql -p 5432 -U pgbouncer pgbouncer -c "SHOW CLIENTS;"
备份脚本¶
#!/bin/bash
# pg_backup.sh - 每日全量备份到 S3
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="igaming"
S3_BUCKET="s3://igaming-db-backups"
# 备份
PGPASSWORD=$DB_PASSWORD pg_dump \
-h $DB_HOST -U $DB_USER -d $DB_NAME \
--format=custom \
--compress=9 \
-f /tmp/${DB_NAME}_${DATE}.dump
# 上传 S3
aws s3 cp /tmp/${DB_NAME}_${DATE}.dump \
${S3_BUCKET}/postgres/${DATE}/${DB_NAME}.dump \
--storage-class STANDARD_IA
# 清理本地
rm -f /tmp/${DB_NAME}_${DATE}.dump
# 验证
aws s3 ls ${S3_BUCKET}/postgres/ | tail -5
echo "备份完成:${DB_NAME}_${DATE}.dump"
2. Redis 运维¶
常用命令¶
redis-cli -h $REDIS_HOST -a $REDIS_PASSWORD
# 状态查看
INFO all # 全面状态
INFO memory # 内存使用
INFO replication # 主从状态
INFO stats # 统计信息
# 慢日志分析
SLOWLOG GET 10 # 最近10条慢命令
SLOWLOG LEN # 慢日志数量
CONFIG SET slowlog-log-slower-than 1000 # 超过1ms记录
# Key 分析(生产谨慎使用)
DBSIZE # Key 总数
SCAN 0 COUNT 100 MATCH "odds:*" # 安全遍历(代替 KEYS)
# 内存分析
MEMORY USAGE key:name # 单个 key 内存占用
MEMORY DOCTOR # 内存问题诊断建议
Redis 集群管理¶
# 查看集群状态
redis-cli -h $REDIS_HOST -a $REDIS_PASSWORD cluster info
redis-cli -h $REDIS_HOST -a $REDIS_PASSWORD cluster nodes
# 检查集群健康
redis-cli --cluster check $REDIS_HOST:6379 -a $REDIS_PASSWORD
# 博彩场景 Key 设计规范
odds:{match_id}:{market} TTL=5s # 实时赔率
session:{session_id} TTL=1800s # 用户 Session
ratelimit:{ip}:{minute} TTL=60s # 速率限制
user:{user_id}:wallet TTL=300s # 钱包缓存
官方文档¶
- PostgreSQL 文档:https://www.postgresql.org/docs/current/
- Redis 命令参考:https://redis.io/commands/
- PgBouncer 文档:https://www.pgbouncer.org/
- Redis University 免费课程:https://university.redis.com/
- Percona 监控(PMM):https://www.percona.com/software/database-tools/percona-monitoring-and-management
- redis-insight(可视化):https://github.com/RedisInsight/RedisInsight
最后更新:2025-04