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

1. Redis 介绍及部署模式

Redis 是一个高性能的键值存储数据库,广泛用于缓存、消息队列等场景。根据应用需求,Redis 可采用以下几种部署模式:

  1. 单机模式:所有数据存储在一个 Redis 实例中,适用于小规模、低并发的业务场景。
  2. 主从模式(Master-Slave):通过 slaveof 机制,主节点(Master)负责读写操作,从节点(Slave)同步主节点数据,只提供读操作,提高读性能。
  3. 哨兵模式(Sentinel):在主从模式的基础上引入 Redis Sentinel(哨兵),监控 Redis 主节点的运行状态,并在主节点故障时自动完成主从切换,保障高可用性。
  4. 集群模式(Cluster):多个 Redis 节点分片存储数据,并支持自动故障转移,适用于大规模分布式场景。

2. Redis 哨兵模式

Redis 哨兵模式在主从模式的基础上增加了高可用能力:

  • 自动故障转移:当主节点宕机时,哨兵会自动选举新的主节点,并通知所有从节点重新同步数据。
  • 监控:实时检测 Redis 节点状态。
  • 通知:当主节点发生变化时,哨兵可以通知客户端。

3. Redis 哨兵模式一键部署脚本

为了简化 Redis 哨兵模式的部署,本文提供了一个 一键安装脚本,能够自动完成:

  • 解析参数,确定 Master 和 Slave 节点
  • 配置 Master 和 Slave 节点
  • 部署 Redis Server 并启动
  • 部署 Redis Sentinel 并启动
  • 检查运行状态

脚本运行方式

./deploy_redis_sentinel.sh --master=1.1.1.1 --nodes=2.2.2.2,3.3.3.3

其中:

  • --master=<IP> 指定 Redis 主节点 IP
  • --nodes=<IP1>,<IP2> 指定 Redis 从节点列表(逗号分隔)

脚本逻辑

  • 解析传入的 masternodes 参数
  • 判断当前服务器 IP 是否匹配 masternodes
  • 部署 Redis MasterSentinel 或 部署 Redis Slave 和 Sentinel
  • 输出部署进程信息,确保 Redis 及 Sentinel 运行正常

脚本内容:cat deploy_redis_sentinel.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/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 "当前节点部署完成"

  

posted @   瘦阿瘦  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示