中间件一键部署脚本: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 并启动
- 检查运行状态
脚本运行方式
其中:
--master=<IP>
指定 Redis 主节点 IP--nodes=<IP1>,<IP2>
指定 Redis 从节点列表(逗号分隔)
脚本逻辑
- 解析传入的
master
和nodes
参数 - 判断当前服务器 IP 是否匹配
master
或nodes
- 部署 Redis Master 和 Sentinel 或 部署 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 "当前节点部署完成" |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程