文章目錄
- 什么是哨兵模式
- 哨兵模式的優缺點
- 主觀下線和客觀下線
- 投票選舉
- 哨兵模式場景應用
- Redis version 6.0.5 集群搭建
- 下載文件
- 環境安裝
- 解壓
- 編譯
- 配置文件
- 啟動
- 關閉
- 密碼設置
什么是哨兵模式
哨兵模式是Redis的高可用解決方案之一,它旨在提供自動故障轉移和故障檢測的功能。在傳統的Redis部署中,單個Redis節點可能成為單點故障,一旦該節點宕機,整個系統將不可用。為了解決這個問題,哨兵模式引入了多個Redis節點,其中一個節點被選為主節點,其他節點作為從節點。
在上面模式中,哨兵主要有幾個作用:
- 監控狀態:會向所有監控對象每秒發送ping命令,通過是否有響應來判斷master和所有slave節點狀態。
- 故障轉移:當一旦發現Master節點異常,它將嘗試進行故障轉移,選擇新的slave節點為master節點,并通過發布訂閱的方式通知其他slave節點修改配置。
但在上面的模式中,哨兵節點也存在單點故障。因此,為防止Sentinel發生意外,Sentinel也需要實現集群高可用。
哨兵模式的優缺點
優點:
自動故障轉移,提高系統的高可用性。
具有主從復制模式的所有優點,如數據冗余和讀寫分離。
缺點:
配置和管理相對復雜。
依然無法實現數據分片,受單節點內存限制。
主觀下線和客觀下線
主觀下線是指一個哨兵節點認為主節點不可用,但它并不確定其他哨兵節點是否也認為主節點不可用。當一個哨兵節點在一定時間(配置參數:down-after-milliseconds)內無法與主節點通信(比如發送PING命令沒有收到響應),它會認為主節點下線。但在這個階段,其他哨兵節點并不知道這個節點的狀態,僅有一個哨兵主觀地認為主節點宕機。
客觀下線是指一個主節點被多數哨兵節點認定為不可用。當一個哨兵節點認為主節點宕機后,它會向其他哨兵節點詢問對主節點的狀態,并請求其他哨兵進行確認。如果多數(大多數至少需要半數加1)的哨兵節點都認為主節點不可用,那么主節點就會被判定為客觀下線。客觀下線意味著主節點的狀態在整個哨兵集群中得到了確認。
主觀下線和客觀下線的引入是為了避免誤判。如果只有一個哨兵節點認為主節點下線,那么很可能是網絡抖動等原因導致的,此時并不應該進行故障轉移。只有多數的哨兵節點都確認主節點下線,才能確保故障轉移的正確性,保證整個集群的穩定性。
哨兵模式使用主觀下線和客觀下線狀態的組合來實現可靠的主節點故障檢測和故障轉移,從而確保Redis集群的高可用性。
投票選舉
在多Sentinel模式下,各節點會相互監控主從節點的健康狀態。當主節點發生故障時,首先由Sentinel節點之間基于Raft算法進行投票選舉,按照誰發現主節點故障誰去處理的原則,選舉出一個領頭Sentinel節點(Leader Sentinel)。這個領頭Sentinel節點負責進行故障轉移操作。
故障轉移過程中,領頭Sentinel節點會根據一定的規則在所有從節點中選擇一個最優的從節點作為新的主節點(Master)。一般會選擇復制偏移量最大且優先級較高的從節點作為新的主節點。然后,領頭Sentinel節點通過發布訂閱功能,通知其他從節點更改配置文件,將它們的連接從原來的主節點轉移到新的主節點上。
對于客戶端來說,連接Redis集群時首先連接到Sentinel節點,通過Sentinel節點查詢主節點的地址。一旦主節點發生故障并進行了故障轉移,Sentinel節點會將最新的主節點地址告知客戶端。這樣,客戶端無需重啟,就可以自動連接到新的主節點,實現高可用性的數據交互。
哨兵模式場景應用
高可用性要求較高的場景:通過自動故障轉移,確保服務的持續可用。
數據備份和容災恢復:在主從復制的基礎上,提供自動故障轉移功能。
總結:哨兵模式在主從復制模式的基礎上實現了自動故障轉移,提高了系統的高可用性。然而,它仍然無法實現數據分片。如果需要實現數據分片和負載均衡,可以考慮使用Cluster模式。
Redis version 6.0.5 集群搭建
下載文件
下載 命令 url 可找官網 復制
wget http://download.redis.io/releases/redis-6.0.5.tar.gz
環境安裝
yum install gcc-c++
yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
解壓
創建redis文件夾
cd /home
mkdir redis
cd redis
解壓
tar -zxvf redis-6.0.5.tar.gz
重命名
mv redis-6.0.5 redis-1
復制
cp -r redis-1 redis-2
cp -r redis-1 redis-3
編譯
cd /home/redis/redis-1
每一個redis執行下行命令
scl enable devtoolset-9 bash
如果以以下編譯安裝 的命令失敗 基本上是因為 環境安裝問題 可以直接百度 相關更全面的安裝環境
make MALLOC=lib
make install
配置文件
重要的配置看截圖,ip地址以及格式請注意
master redis.conf 配置
vim /home/redis/redis-1/redis.conf
bind 0.0.0.0
protected-mode yes
port 16379
supervised no
pidfile "/home/redis/pid/16379.pid"
loglevel notice
logfile "/home/redis/log/16379.log"
databases 16
dir "/home/redis/data"
dbfilename dump16379.rdb
appendonly yes # 開啟 aof 默認不開啟
appendfilename "appendonly_16379.aof"
daemonize yes
混合持久化模式的開啟
master sentinel.conf 配置
bind 0.0.0.0
port 26379
pidfile /home/redis/pid/-sentinel-26379.pid
logfile "/home/redis/log/sentinel-26379.log"
下面配置的ip 配置公網ip port 配置 master redis.conf 配置中的port
sentinel monitor mymaster ip 16379 2slave redis.confbind 0.0.0.0
port 16380
daemonize yes
pidfile "/home/redis/pid/16380.pid"
logfile "/home/redis/log/16380.log"
dir "/home/redis/data"
appendonly yes # 開啟 aof 默認不開啟
appendfilename "appendonly_16380.aof"
slaveof masterIp masterPortslave sentinel.conf 配置bind 0.0.0.0
port 26380
daemonize yes
pidfile "/home/redis/pid/sentinel-26380.pid"
logfile "/home/redis/log/sentinel-26380.log"
下面配置的ip 配置公網ip port 配置 master redis.conf 配置中的port
sentinel monitor mymaster MasterIP MasterPort 2
啟動
啟動腳本
#!/bin/bash# 啟動 Redis-Server
echo "Star Redis-Server ..."redis-1/src/redis-server redis-1/redis.conf &# sleep 1 睡眠1秒
# sleep 1s 睡眠1秒
# sleep 1m 睡眠1分
# sleep 1h 睡眠1小時
sleep 3redis-2/src/redis-server redis-2/redis.conf &
redis-3/src/redis-server redis-3/redis.conf &# 啟動 Redis-Sentinel
echo "Star Redis-Sentinel ..."redis-1/src/redis-sentinel redis-1/sentinel.conf &
redis-2/src/redis-sentinel redis-2/sentinel.conf &
redis-3/src/redis-sentinel redis-3/sentinel.conf &
關閉
關閉腳本
#!/bin/bash
# 停止 Redis-Server
echo "Shutdown Redis-Sentinel ..."
redis-1/src/redis-cli -h 公網ip -p 16379 shutdown
redis-2/src/redis-cli -h 公網ip -p 16380 shutdown
redis-3/src/redis-cli -h 公網ip -p 16381 shutdown
# 停止 Redis-Server
echo "Shutdown Redis-Server ..."
redis-1/src/redis-cli -h 公網ip -p 26379 -a 123456 shutdown
redis-2/src/redis-cli -h 公網ip -p 26380 -a 123456 shutdown
redis-3/src/redis-cli -h 公網ip -p 26381 -a 123456 shutdown
密碼設置
# 兩臺機器一臺master,一臺slave,兩個sentinel
#master修改
#1. redis.conf
requirepass 123456 #添加密碼
#2. sentinel.conf
sentinel auth-pass mymaster 123456 #連接master密碼
#slave修改
#1. redis.conf
masterauth 123456 #連接master密碼
slaveof 10.100.134.109 6379 #slaveof表示該機器是slave,后邊ip為master地址和端口
#2. sentinel.conf
sentinel auth-pass mymaster 123456 #連接master密碼,這個配置一定要在sentinel monitor 配置之后