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 "$@"

posted @ 2025-06-02 13:54  昆仑葫芦  阅读(1)  评论(0)    收藏  举报