文章目錄
- 前言
- 一、Redis 主從復制
- 1.概述
- 2.作用
- 3.流程
- 三、搭建 Redis 主從復制
- 1.安裝 Redis
- 2.修改 Redis 組態檔
- 3.驗證主從效果
- 三、Redis 哨兵模式
- 1.原理及作用
- 2.結構組成
- 3.作業程序
- 4.搭建 Redis 哨兵模式
- 4.1 修改 Redis 哨兵模式的組態檔
- 4.2 啟動哨兵模式
- 4.3 查看哨兵資訊
- 4.4 模擬故障
- 4.5 驗證結果
- 四、Redis 群集模式
- 1.概述
- 2.作用
- 2.1 資料磁區
- 2.2 高可用
- 2.2.1 Redis 集群的資料分片
- 2.2.2 Redis 集群的主從復制模型
- 五、搭建 Redis 群集模式
- 1.準備
- 2開啟群集功能
- 3.啟動 redis 節點
- 4.啟動集群
- 5.測驗集群
前言
主從復制:
- 主從復制是高可用 Redis 的基礎,哨兵和集群都是在主從復制基礎上實作高可用的
- 主從復制主要實作了資料的多機備份,以及對于讀操作的負載均衡和簡單的故障恢復
- 缺陷是故障恢復無法自動化,寫操作無法負載均衡,且存盤能力受到單機的限制
哨兵:
- 在主從復制的基礎上,哨兵實作了自動化的故障恢復
- 缺陷是寫操作無法負載均衡,存盤能力受到單機的限制
- 且哨兵無法對從節點進行自動故障轉移,在讀寫分離場景下,從節點故障會導致讀服務不可用,需要對從節點欄位外的監控、切換操作
集群:
- 通過集群,Redis 解決了寫操作無法負載均衡,以及存盤能力受到單機限制的問題
- 實作了較為完善的高可用方案
一、Redis 主從復制
1.概述
- 主從復制,是指將一臺 Redis 服務器的資料,復制到其他的 Redis 服務器,前者稱為主節點(Master),后者稱為從節點(Slave)
- 資料的復制是單向的,只能由主節點到從節點
- 默認情況下,每臺 Redis 服務器都是主節點,且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點
2.作用
資料冗余:
- 主從復制實作了資料的熱備份
- 是持久化之外的種資料冗余方式
故障恢復:
- 當主節點出現問題時,可以由從節點提供服務,實作快速的故障恢復
- 實際上是一種服務的冗余
負載均衡:
- 在主從復制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫 Redis 資料時應用連接主節點,實 Redis 資料時應用連接從節點),分擔服務器負載
- 尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高 Redis 服務
器的并發量
高可用基石:
- 除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎
- 因此說主從復制是 Redis 高可用的基礎
3.流程
- 若啟動一個 Slave 機器行程,則它會向 Master 機器發送一個"sync command"命令,請求同步連接
- 無論是第一次連接還是重新連接,Master 機器都會啟動一個后臺行程,將資料快照保存到資料檔案中(執行 RDB 操作),同時 Master 還會記錄修改資料的所有命令并快取在資料檔案中
- 后臺行程完成快取操作之后,Master 機器就會向 Slave 機器發送資料檔案,Slave 端機器將資料檔案保存到硬碟上,然后將其加載到記憶體中,接著 Master 機器就會將修改資料的所有操作一并發送給Slave端機器;若 Slave 出現故障導致宕機,則恢復正常后會自動重新連接
- Master 機器收到 Slave 端機器的連接后,將其完整的資料檔案發送給 Slave 端機器,如果 Mater 同時收到多個 Slave 發來的同步請求,則 Master 會在后臺啟動一個行程以保存資料檔案,然后將其發送給所有的 Slave 端機器,確保所有的 Slave 端機器都正常

三、搭建 Redis 主從復制
| 主機 | 主機名 | 作業系統 | IP 地址 | 主要軟體 |
|---|---|---|---|---|
| Master | CentOS 7-1 | CentOS 7 | 192.168.126.11 | squid-3.5.28.tar.gz |
| Slave1 | CentOS 7-2 | CentOS 7 | 192.168.126.12 | squid-3.5.28.tar.gz |
| Slave2 | CentOS 7-3 | CentOS 7 | 192.168.126.13 | squid-3.5.28.tar.gz |
1.安裝 Redis
- 三臺主機都需安裝 Redis
- 下載軟體包傳送門:redis-5.0.7.tar.gz(提取碼:qwer)
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yum -y install gcc gcc-c++ make
cd /opt
#將軟體包傳至該目錄下
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd redis-5.0.7/
make -j 4 && make PREFIX=/usr/local/redis install
cd /opt/redis-5.0.7/utils/
./install_server.sh
#回車,直到出現以下選項,手動修改為“/usr/local/redis/bin/redis-server”
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server
ln -s /usr/local/redis/bin/* /usr/local/bin/
netstat -natp | grep "redis"
#當 install_server.sh 腳本運行完畢,Redis 服務就已經啟動,默認偵聽埠為 6379
2.修改 Redis 組態檔
Master:
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,注釋掉 bind 項,默認監聽所有網卡
daemonize yes #137行,開啟守護行程
logfile /var/1og/redis_ 6379.1og #172行,指定日志檔案目錄
dir /var/lib/redis/6379 #264行,指定作業目錄
appendonly yes #700行,開啟 AOF 持久化功能
Slave:
vim /etc/redis/6379. conf
bind 0.0.0.0 #70行,修改監聽地址為 0.0.0.0
daemonize yes #137行,開啟守護行程
logfile /var/log/redis_ 6379. log #172行,指定日志檔案目錄
dir /var/lib/redis/6379 #264行,指定作業目錄
replicaof 192.168.126.11 6379 #288行,指定要同步的 Master 節點 IP 和埠
appendonly yes #700行,開啟 AOF 持久化功能
/etc/init.d/redis_6379 restart
#重啟服務使配置生效
3.驗證主從效果
在 Master 上看日志:
tail -f /var/log/redis_6379.log

在 Master 上驗證從節點:
redis-cli info replication

- 且在此時,只能在 Master
三、Redis 哨兵模式
哨兵的核心功能就是在主從復制的基礎上,哨兵引入了主節點的自動故障轉移
1.原理及作用
哨兵模式的原理:
- 哨兵(Sentinel)是一個分布式系統,用于對主從結構中的每臺服務器進行監控,當出現故障時通過投票機制選擇新的 Master 并將所有 slave 連接到新的 Master
- 整個運行哨兵的集群的數量不得少于 3 個節點
哨兵模式的作用:
- 監控:哨兵會不斷地檢查主節點和從節點是否運作正常
- 自動故障轉移:當主節點不能正常作業時,哨兵會開始自動故障轉移操作,它會將失效主節點的其中一個從節點升級為新的主節點,并讓其他從節點改為復制新的主節點
- 通知(提醒):哨兵可以將故障轉移的結果發送給客戶端
2.結構組成
哨兵結構由兩部分組成,哨兵節點和資料節點:
- 哨兵節點:哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的 redis 節點,不存盤資料
- 資料節點:主節點和從節點都是資料節點

3.作業程序
- 哨兵的啟動依賴于主從模式,所以須把主從模式安裝好的情況下再去做哨兵模式,所有節點上都需要部署哨兵模式,哨兵模式會監控所有的 Redis 作業節點是否正常
- 當 Master 出現問題的時候,因為其他節點與主節點失去聯系,因此會投票,投票過半就認為這個 Master 的確出現問題,然后會通知哨兵間會推選出一個哨兵來進行故障轉移作業(由該哨兵來指定哪個 slave 來做新的 master),然后從 Slaves 中選取一個作為新的 Master
- 篩選方式是哨兵互相發送訊息,并且參與投票,票多者當選

- 需要特別注意的是,客觀下線是主節點才有的概念,即如果從節點和哨兵節點發生故障,被哨兵主觀下線后,將不會再有后續的客觀下線和故障轉移操作(及哨兵模式只負責 Master 的方面,而不管 Slaves)
- 當某個哨兵發現主服務器掛掉了,會將 master 中的 SentinelRedistance 中的 master 改為SRI_S_DOWN(主觀下線),并通知其他哨兵,告訴他們發現 master 掛掉了
- 其他哨兵在接收到該哨兵發送的資訊后,也會嘗試去連接 master,如果超過半數(組態檔中設定的)確認 master 掛掉后,會將 master 中的 SentinelRedistance 中的 master 改為 SRI_O_DOWN(客觀下線)

4.搭建 Redis 哨兵模式
4.1 修改 Redis 哨兵模式的組態檔
vim /opt/redis-5.0.7/sentinel.conf
protected- mode no #17行,關閉保護模式
port 26379 #21行,Redis哨兵默認的監聽埠
daemonize yes #26行,指定sentinel為后臺啟動
logfile "/var/log/sentinel.log" #36行,指定日志存放路徑
dir "/var/lib/redis/6379" #65行,指定資料庫存放路徑
sentinel monitor mymaster 192.168.126.11 6379 2
#84行,修改,指定該哨兵節點監控 192.168.126.11:6379 這個主節點,該主節點的名稱是 mymaster
#最后的 2 的含義與主節點的故障判定有關:至少需要 2 個哨兵節點同意,才能判定主節點故障并進行故障轉移
sentinel down-after -milliseconds mymaster 30000#113行,判定服務器 down 掉的時間周期,默認 30000毫秒 (30秒)
sentinel failover-timeout mymaster 180000 #146行,故障節點的最大超時時間為 180000 (180秒)
4.2 啟動哨兵模式
先啟動 Master,再啟動 Slave
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &



4.3 查看哨兵資訊
redis-cli -p 26379 info Sentinel



4.4 模擬故障
ps -ef | grep "redis"
#查看 redis-server 的行程號
kill -9 [行程號]
#殺死 Master 節點上的 redis-server 的行程號

4.5 驗證結果
tail /var/log/sentinel.log

redis-cli -p 26379 info Sentinel



四、Redis 群集模式
1.概述
- 集群,即 Redis Cluster, 是 Redis 3.0 開始引入的分布式存盤方案
- 集群由多個節點(Node)組成,Redis 的資料分布在這些節點中,
- 集群中的節點分為主節點和從節點:只有主節點負責讀寫請求和集群資訊的維護,從節點只進行主節點資料和狀態資訊的復制
2.作用
2.1 資料磁區
- 資料磁區(或稱資料分片)是集群最核心的功能
- 集群將資料分散到多個節點,一方面突破了 Redis 單機記憶體大小的限制,存盤容量大大增加,另一方面每個主節點都可以對外提供讀服務和寫服務,大大提高了集群的回應能力
- Redis 單機記憶體大小受限問題,在介紹持久化和主從復制時都有提及
- 例如,如果單機記憶體太大,bgsave 和 bgrewriteaof 的 fork 操作可能導致主行程阻塞,主從環境下主機切換時可能導致從節點長時間無法提供服務,全量復制階段主節點的復制緩沖區可能溢位
2.2 高可用
- 集群支持主從復制和主節點的自動故障轉移(與哨兵類似),當任意節點發送故障時,集群仍然可以對外提供服務
2.2.1 Redis 集群的資料分片
- Redis 集群引入了哈希槽的概念,有 16384 個哈希槽(編號 0~16383)
- 集群的每個節點負責一部分哈希槽,每個 Key 通過 CRC16 校驗后對 16384 取余來決定放置哪個哈希槽,通過這個值,去找到對應的插槽所對應的節點,然后直接自動跳轉到這個對應的節點上進行存取操作
- 以 3 個節點組成的集群為例:
- 節點 A 包含 0~5469 號的哈希槽
- 節點 B 包含 5461~10922 號的哈希槽
- 節點 C 包含 10923~16383 號的哈希槽

2.2.2 Redis 集群的主從復制模型
- 集群中具有 A、B、C 三個節點,如果節點 B 失敗了,整個集群就會因為缺少 5461~10922 這個范圍的槽而不可用
- 為每個節點添加一個從節點(a、b、c),即整個集群便有了三個 Master 節點和三個 slave 節點,在節點 B 失敗后,集群選舉 b 為主節點繼續服務,當 B 和 b 都失敗后,整個集群將不可用
五、搭建 Redis 群集模式
1.準備
- redis 的集群一般需要 6 個節點(3 主 3 從)
- 方便起見,這里所有節點在同一臺服務器上模擬,以埠號進行區分:3 個主節點埠號為 6001/6002/6003,對應的從節點埠號為 6004/6005/6006
cd /etc/redis/
mkdir -P redis-cluster/redis600{1..6)
#
for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done
ls -R
2開啟群集功能
#其他五個檔案夾的組態檔以此類推修改,注意六個埠都不一樣
cd /etc/redis/redis-cluster/redis6001
vim redis. conf
#bind 127.0.0.1 #69行,注釋掉 bind 項,默認監聽所有網卡
protected-mode no #88行,修改,關閉保護模式
port 6001 #92行,修改,redis 監聽埠,
daemonize yes #136行,開啟守護行程,以獨立行程啟動
appendonly yes #699行,修改,開啟 AOF 持久化
cluster-enabled yes #832行,取消注釋,開啟群集功能
cluster-config-file nodes-6001.conf #840行,取消注釋,群集名稱檔案設定
cluster-node-t imeout 15000 #846行,取消注釋群集超時時間設定
3.啟動 redis 節點
#分別進入那六個檔案夾,執行命令"redis-server redis.conf"來啟動 redis 節點
cd /etc/redis/redis-cluster/redis6001
redis-server redis.conf
for i in {1..6}
do
cd /etc/redis/redis-cluster/redis600$i
redis-server redis.conf
done
ps -ef | grep "redis"

4.啟動集群
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
#六個實體分為三組,每組一主一從,前面的做主節點,后面的做從節點
#下面互動的時候需要輸入 yes 才可以創建
#-replicas 1 表示每個主節點有一個從節點
5.測驗集群
redis-cli -p 6001 -c
#加 -c 引數,節點之間就可以互相跳轉
127.0.0.1:6001> CLUSTER SLOTS
#查看節點的哈希槽編號范圍

127.0.0.1:6001> set name wanger
-> Redirected to slot [5798] located at 127.0.0.1:6002
OK
#新建一個鍵的值
127.0.0.1:6002> CLUSTER KEYSLOT name
(integer) 5798
#查看 name 鍵的槽編號
ctrl+c
#退出
redis-cli -p 6001 -c
127.0.0.1:6001> KEYS *
(empty list or set)
127.0.0.1:6001>
ctrl+c
redis-cli -p 6005 -c
127.0.0.1:6005> KEYS *
1) "name"
#可以發現,對應的 slave 節點也有這條資料,但是別的節點沒有
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/263865.html
標籤:其他
