中间件一键部署脚本: redis主从+哨兵模式

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 "当前节点部署完成"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值