Redis持久化配置与监控脚本
!/bin/bash
Redis持久化管理脚本 - 章亦春风格
简洁、高效、可靠
颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
Redis配置
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"
REDIS_PASSWORD=""
REDIS_CONFIG="/etc/redis/redis.conf"
REDIS_DATA_DIR="/var/lib/redis"
BACKUP_DIR="/opt/redis-backups"
日志文件
LOG_FILE="/var/log/redis-persistence.log"
检查工具是否可用
check_tools() {
if ! command -v redis-cli &> /dev/null; then
echo -e "\({RED}错误: redis-cli 命令不可用,请安装Redis客户端\){NC}"
exit 1
fi
}
日志函数
log() {
local message="\(1"
local timestamp=\)(date "+%Y-%m-%d %H:%M:%S")
echo -e "${timestamp} - ${message}" | tee -a $LOG_FILE
}
获取Redis连接命令
get_redis_cmd() {
local cmd="redis-cli -h $REDIS_HOST -p $REDIS_PORT"
if [ ! -z "\(REDIS_PASSWORD" ]; then
cmd="\)cmd -a $REDIS_PASSWORD"
fi
echo "$cmd"
}
检查Redis连接
check_redis_connection() {
local redis_cmd=$(get_redis_cmd)
if ! \(redis_cmd ping > /dev/null; then
echo -e "\){RED}错误: 无法连接到Redis服务器${NC}"
exit 1
fi
echo -e "\({GREEN}成功连接到Redis服务器\){NC}"
}
配置Redis持久化
configure_persistence() {
echo -e "\({BLUE}配置Redis持久化...\){NC}"
备份原始配置
local timestamp=$(date "+%Y%m%d%H%M%S")
cp \(REDIS_CONFIG "\){REDIS_CONFIG}.${timestamp}.bak"
应用持久化配置
cat << EOF > /tmp/redis-persistence.conf
Redis持久化配置 - 由脚本生成
AOF配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
RDB配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir $REDIS_DATA_DIR
EOF
更新Redis配置
cat /tmp/redis-persistence.conf >> $REDIS_CONFIG
rm /tmp/redis-persistence.conf
echo -e "\({GREEN}Redis持久化配置已更新,需要重启Redis服务以应用更改\){NC}"
echo -e "\({YELLOW}建议使用: systemctl restart redis-server\){NC}"
}
获取Redis持久化状态
get_persistence_status() {
echo -e "\({BLUE}Redis持久化状态:\){NC}"
local redis_cmd=$(get_redis_cmd)
echo -e "\n\({YELLOW}RDB状态:\){NC}"
$redis_cmd info persistence | grep rdb
echo -e "\n\({YELLOW}AOF状态:\){NC}"
$redis_cmd info persistence | grep aof
获取数据目录信息
echo -e "\n\({YELLOW}数据文件信息:\){NC}"
ls -lh $REDIS_DATA_DIR/.rdb $REDIS_DATA_DIR/.aof 2>/dev/null || echo "没有找到持久化文件"
}
创建Redis数据备份
create_backup() {
echo -e "\({BLUE}创建Redis数据备份...\){NC}"
创建备份目录
mkdir -p $BACKUP_DIR
生成备份文件名
local timestamp=\((date "+%Y%m%d%H%M%S") local backup_file="\){BACKUP_DIR}/redis-backup-${timestamp}.rdb"
执行SAVE命令
local redis_cmd=$(get_redis_cmd)
$redis_cmd save
复制RDB文件
cp $REDIS_DATA_DIR/dump.rdb $backup_file
压缩备份
gzip $backup_file
echo -e "${GREEN}备份已创建: \({backup_file}.gz\){NC}"
保留最近10个备份
ls -t \({BACKUP_DIR}/redis-backup-*.gz | tail -n +11 | xargs -r rm
echo -e "\){GREEN}已清理旧备份,保留最近10个${NC}"
}
恢复备份
restore_backup() {
echo -e "\({BLUE}可用备份:\){NC}"
列出所有备份
local backups=(${BACKUP_DIR}/redis-backup-*.gz)
if [ \({#backups[@]} -eq 0 ]; then
echo -e "\){RED}没有找到可用备份${NC}"
return
fi
for i in "\({!backups[@]}"; do
echo "\)((i+1)). \({backups[\)i]}"
done
选择备份
read -p "选择要恢复的备份编号 (1-${#backups[@]}): " choice
if [[ ! \(choice =~ ^[0-9]+\) ]] || [ $choice -lt 1 ] || [ $choice -gt \({#backups[@]} ]; then
echo -e "\){RED}无效的选择${NC}"
return
fi
local selected_backup=\({backups[\)((choice-1))]}
echo -e "${YELLOW}将恢复: \(selected_backup\){NC}"
解压备份
local temp_file="/tmp/redis-restore.rdb"
gunzip -c $selected_backup > $temp_file
停止Redis
echo -e "\({YELLOW}停止Redis服务...\){NC}"
systemctl stop redis-server
复制备份文件
cp $temp_file $REDIS_DATA_DIR/dump.rdb
chown redis:redis $REDIS_DATA_DIR/dump.rdb
启动Redis
echo -e "\({YELLOW}启动Redis服务...\){NC}"
systemctl start redis-server
清理临时文件
rm $temp_file
echo -e "\({GREEN}备份恢复完成\){NC}"
}
监控持久化状态
monitor_persistence() {
echo -e "\({BLUE}监控Redis持久化状态 (每5秒更新,按Ctrl+C退出)...\){NC}"
local redis_cmd=$(get_redis_cmd)
while true; do
clear
echo -e "${BLUE}Redis持久化监控 - \((date)\){NC}"
echo "------------------------------------------------"
获取RDB信息
local rdb_last_save=\((\)redis_cmd info persistence | grep rdb_last_save_time | cut -d: -f2 | tr -d '\r')
local rdb_changes=\((\)redis_cmd info persistence | grep rdb_changes_since_last_save | cut -d: -f2 | tr -d '\r')
获取AOF信息
local aof_enabled=\((\)redis_cmd info persistence | grep aof_enabled | cut -d: -f2 | tr -d '\r')
local aof_size=\((\)redis_cmd info persistence | grep aof_current_size | cut -d: -f2 | tr -d '\r')
local aof_buffer=\((\)redis_cmd info persistence | grep aof_pending_rewrite | cut -d: -f2 | tr -d '\r')
显示信息
echo -e "\({YELLOW}RDB信息:\){NC}"
echo "上次保存时间: \((date -d @\)rdb_last_save)"
echo "上次保存后的更改: $rdb_changes"
if [ "\(aof_enabled" == "1" ]; then
echo -e "\n\){YELLOW}AOF信息:${NC}"
echo "AOF大小: \(((\)aof_size/1024/1024)) MB"
echo "AOF等待重写: $aof_buffer"
fi
sleep 5
done
}
使用说明
usage() {
echo -e "\({BLUE}Redis持久化管理工具\){NC}"
echo "用法: $0 [命令]"
echo ""
echo "命令:"
echo " status - 显示Redis持久化状态"
echo " configure - 配置Redis持久化设置"
echo " backup - 创建Redis数据备份"
echo " restore - 恢复Redis数据备份"
echo " monitor - 实时监控Redis持久化状态"
echo " help - 显示此帮助信息"
echo ""
echo "示例:"
echo " $0 status"
echo " $0 configure"
echo " $0 backup"
exit 1
}
主函数
main() {
# 检查工具是否可用
check_tools
检查参数
if [ $# -eq 0 ]; then
usage
fi
处理命令
case "\(1" in
status)
check_redis_connection
get_persistence_status
;;
configure)
configure_persistence
;;
backup)
check_redis_connection
create_backup
;;
restore)
check_redis_connection
restore_backup
;;
monitor)
check_redis_connection
monitor_persistence
;;
help|--help|-h)
usage
;;
*)
echo -e "\){RED}错误: 未知命令${NC}"
usage
;;
esac
}
执行主函数
main "$@"

浙公网安备 33010602011771号