1. Redis 介绍及部署模式
Redis 是一个高性能的键值存储数据库,广泛用于缓存、消息队列等场景。根据应用需求,Redis 可采用以下几种部署模式:
单机模式:所有数据存储在一个 Redis 实例中,适用于小规模、低并发的业务场景。
主从模式(Master-Slave):通过 slaveof 机制,主节点(Master)负责读写操作,从节点(Slave)同步主节点数据,只提供读操作,提高读性能。
哨兵模式(Sentinel):在主从模式的基础上引入 Redis Sentinel(哨兵),监控 Redis 主节点的运行状态,并在主节点故障时自动完成主从切换,保障高可用性。
集群模式(Cluster):多个 Redis 节点分片存储数据,并支持自动故障转移,适用于大规模分布式场景。
2. Redis 哨兵模式
Redis 哨兵模式在主从模式的基础上增加了高可用能力:
自动故障转移:当主节点宕机时,哨兵会自动选举新的主节点,并通知所有从节点重新同步数据。
监控:实时检测 Redis 节点状态。
通知:当主节点发生变化时,哨兵可以通知客户端。
3. Redis 哨兵模式一键部署脚本
为了简化 Redis 哨兵模式的部署,本文提供了一个 一键安装脚本,能够自动完成:
解析参数,确定 Master 和 Slave 节点
配置 Master 和 Slave 节点
部署 Redis Server 并启动
部署 Redis Sentinel 并启动
检查运行状态
4.脚本运行方式
./deploy_redis_sentinel.sh --master=1.1.1.1 --nodes=2.2.2.2,3.3.3.3
其中:
–master= 指定 Redis 主节点 IP
–nodes=, 指定 Redis 从节点列表(逗号分隔)
脚本逻辑
- 解析传入的 master 和 nodes 参数
- 判断当前服务器 IP 是否匹配 master 或 nodes
- 部署 Redis Master 和 Sentinel 或 部署 Redis Slave 和 Sentinel
- 输出部署进程信息,确保 Redis 及 Sentinel 运行正常
cat deploy_redis_sentinel.sh
#!/bin/bash
#部署redis 哨兵模式
#获取节点信息
master=""
nodes=""
currentdir=""
tar_name=$(ls redis-bin*)
if [[ -z "${tar_name}" ]]; then
echo "未找到 redis 二进制安装包"
exit 1
fi
#解析参数
for arg in "$@"; do
case "$arg" in
--master=* )
master="${arg#*=}"
shift
;;
--nodes=* )
nodes="${arg#*=}"
shift
;;
*)
echo "Unknown option: $arg"
exit 1
;;
esac
done
# 若未指定 master 和 nodes,则退出
if [ -z "$master" ] || [ -z "$nodes" ]; then
echo "Usage: $0 --master=<node1> --nodes=<node2>,<node3>"
exit 1
fi
#将 nodes 逗号分隔转换为数组
IFS=',' read -r -a nodes_array <<< "$nodes"
master_deployment(){
tar -xzf $tar_name && mv redis-bin redis_bin_cluster
cd redis_bin_cluster
currentdir=$(pwd)
#master配置文件
cat >redis.conf<<EOF
bind 0.0.0.0
port 6379
pidfile $currentdir/6379.pid
logfile $currentdir/6379.log
dir $currentdir
requirepass Wiseco#2024
masterauth Wiseco#2024
slave-serve-stale-data no
repl-disable-tcp-nodelay no
daemonize yes
maxmemory 3221225472
appendonly yes
appendfilename "appendonly.aof"
protected-mode no
EOF
#启动redis-server
echo "redis-server staring......"
$currentdir/redis-server $currentdir/redis.conf
}
slave_deployment(){
tar -xzf $tar_name && mv redis-bin redis_bin_cluster
cd redis_bin_cluster
currentdir=$(pwd)
#slave配置文件
cat >redis.conf<<EOF
bind 0.0.0.0
port 6379
pidfile $currentdir/6379.pid
logfile $currentdir/6379.log
dir $currentdir
requirepass Wiseco#2024
slave-serve-stale-data no
repl-disable-tcp-nodelay no
slaveof $master 6379
masterauth Wiseco#2024
daemonize yes
maxmemory 3221225472
appendonly yes
appendfilename "appendonly.aof"
protected-mode no
EOF
#启动redis-server
echo "redis-server staring......"
$currentdir/redis-server $currentdir/redis.conf
}
sentinel_deployment(){
cd $currentdir
# sentinel配置文件
cat >redis-sentinel.conf<<EOF
bind 0.0.0.0
port 26379
logfile $currentdir/sentinel.log
pidfile $currentdir/sentinel.pid
daemonize yes
sentinel monitor mymaster $master 6379 2
sentinel auth-pass mymaster Wiseco#2024
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 2
sentinel failover-timeout mymaster 180000
EOF
# 启动 sentinel
echo "redis-sentinel staring........"
$currentdir/redis-sentinel $currentdir/redis-sentinel.conf
}
#判断当前服务器是否在节点中
##获取当前节点的 IP(多个 IP 会用空格分隔)
current_ip_list=$(hostname -I)
#判断是不是master节点
is_master=$(echo "$current_ip_list"|tr ' ' '\n' |grep -Fxf - <(echo "$master"|tr ' ' '\n'))
is_slave=$(echo "$current_ip_list"|tr ' ' '\n' |grep -Fxf - <(echo "${nodes_array[@]}"|tr ' ' '\n'))
if [[ -n $is_master ]]; then
echo "the server is master node, ip $is_master"
master_deployment
sentinel_deployment
elif [[ -n $is_slave ]]; then
echo "the server is slave node, ip $is_slave"
slave_deployment
sentinel_deployment
else
echo "当前服务器没有匹配的节点IP, 退出脚本"
exit 1
fi
echo "查看进程..."
ps -aef|grep redis |grep -v 'grep'| grep -v "$0"
echo "当前节点部署完成"