中間件一鍵部署腳本: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
#!/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 "當前節點部署完成"
浙公網安備 33010602011771號