操作系統(tǒng):CentOS-7.8
redis版本:6.0.5
本篇錘子將和大家一起學(xué)習(xí)redis高可用,文章中會介紹和演示兩種redis高可用服務(wù)的基本原理和搭建方式,幫助大家快速學(xué)習(xí)搭建使用redis服務(wù)。對redis不太熟悉的朋友可以參考上一篇《一起學(xué)習(xí)Redis基礎(chǔ)》
一、高可用方案
redis 服務(wù)實現(xiàn)高可用主要有兩種方式:主從復(fù)制(Replication-Sentinel)和Redis集群(Redis Cluster)。下面對兩種高可用方案進行原理介紹
1.主從復(fù)制與哨兵機制
單純Redis主從復(fù)制并不是一個高可用方案,Redis主從復(fù)制模式下MASTER節(jié)點宕機后是沒有重新選主機制,也就意味的服務(wù)部分功能不可用,而哨兵機制Redis中提供了監(jiān)控節(jié)點健康狀態(tài)的機制,所以主從復(fù)制模式結(jié)合哨兵機制才是一個真正高可用服務(wù)方案
主從復(fù)制
主從復(fù)制模式下redis多個節(jié)點分為兩種類型:主節(jié)點(Master)和從節(jié)點(Slave)。主節(jié)點負責(zé)讀寫工作,而從節(jié)點僅負責(zé)讀工作,所以當(dāng)主節(jié)點故障后,則服務(wù)就不可寫了。
主從復(fù)制模式下有以下特點:
Master節(jié)點既可以讀也可以寫,Slave節(jié)點只能讀,不可以寫
Master實例與Slave實例之間的數(shù)據(jù)是實時同步的,即 Master中有數(shù)據(jù)變更時會與Slave進行交互,以便于將自身數(shù)據(jù)的變更復(fù)制給 Slave
Slave與Master斷開連接,過一段時間后再次連接Master時會同步自己斷開時間段中Master中數(shù)據(jù)的更改部分,若無法部分同步數(shù)據(jù),則Slave會請求全量同步數(shù)據(jù)
服務(wù)故障時,若Slave節(jié)點宕機,則讀寫服務(wù)可繼續(xù)提供,若Master節(jié)點宕機,則只有讀服務(wù)可繼續(xù)提供
整個服務(wù)的讀性能高,寫性能受Master節(jié)點性能限制
整個服務(wù)存儲上限受Master節(jié)點機器存儲限制(多個節(jié)點數(shù)據(jù)互為副本,Master存儲滿了就無法繼續(xù)存儲)
哨兵機制
哨兵機制(Redis Sentinel)是Redis社區(qū)提供的高可用解決方案,哨兵是一個獨立的進程,它會實時監(jiān)控Redis節(jié)點的健康狀態(tài),當(dāng)Master不可用時會觸發(fā)選主機制,從多個Slave節(jié)點中選出一個節(jié)點作為新的Master。
由于哨兵是獨立的進程,所以在使用哨兵機制實現(xiàn)高可用時是需要部署兩套集群即:哨兵集群和 Redis主從復(fù)制集群。
哨兵集群是由多個哨兵組成的分布式集群,主要有以下特點
監(jiān)控redis節(jié)點的健康狀況,發(fā)現(xiàn)節(jié)點故障
發(fā)現(xiàn)Redis節(jié)點故障時,可以發(fā)送提醒通知
當(dāng)發(fā)現(xiàn)Master節(jié)點故障時,會進行故障自動轉(zhuǎn)移,從Slave節(jié)點中重新選主,保證Redis服務(wù)集群可用
哨兵節(jié)點個數(shù)需滿足奇數(shù)個,且至少為3個
一個哨兵集群可監(jiān)控多套Redis服務(wù)集群
哨兵模式下還有兩個概念:主觀下線和客觀下線
主觀下線是在指定時間內(nèi)哨兵(Sentinel) 沒有收到目標節(jié)點的有效回復(fù),則會判定該節(jié)點為主觀下線,當(dāng)大于等于半數(shù)個哨兵都將目標節(jié)點標記為主觀下線,此時會判定目標節(jié)點客觀下線,對于客觀下線的節(jié)點若是主節(jié)點則會進行故障轉(zhuǎn)移
2.集群模式
Redis集群模式是社區(qū)推出的 Redis 分布式集群解決方案,這樣的一個集群是由多個主從節(jié)點群組成的分布式服務(wù)器群,它具有復(fù)制、高可用和分片特性。
相對于主從復(fù)制模式來說,Redis cluster模式是多主節(jié)點,且各個主節(jié)點的數(shù)據(jù)也不一樣,數(shù)據(jù)采用分片的方式由多個主節(jié)點共同管理,每個主節(jié)點只管理部分數(shù)據(jù)。Redis默認劃分了16384個hash槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽,集群的每主節(jié)點只負責(zé)一部分hash槽的管理,這樣也可以達到負載均衡的目的。
在Redis Cluster模式下的主節(jié)點提供讀寫操作,從節(jié)點作為備用節(jié)點不接收服務(wù)請求,只作為故障轉(zhuǎn)移使用,在主節(jié)點與從節(jié)點之間也是采用主從復(fù)制機制,即一個主節(jié)點可以有多個從節(jié)點,當(dāng)主節(jié)點故障時,會從當(dāng)前主節(jié)點下的從節(jié)點中選主成為主節(jié)點繼續(xù)服務(wù)。
Redis Cluster 的一個簡略示意圖如下所示
從圖中看出,Redis Cluster模式下是有多個主節(jié)點,每個主節(jié)點可以有多個從節(jié)點,且Redis自身在Cluster模式也做了節(jié)點數(shù)限制,節(jié)點最小配置 6 個節(jié)點(3 主 3 從)。
3.優(yōu)缺點對比
在了解完上面兩種模式后,我們來對比一下這兩種模式各自的優(yōu)缺點
二、搭建與配置演示
1.Replication-Sentinel
環(huán)境準備
三臺主機:RedisMaster(192.168.56.91)、RedisSlave1(192.168.56.92)、RedisSlave2(192.168.56.93)
主節(jié)點一個為RedisMaster,從節(jié)點兩個為RedisSlave1和RedisSlave2
三個節(jié)點redis先進行基礎(chǔ)安裝(下載源碼,解壓,編譯,基礎(chǔ)配置等),基礎(chǔ)安裝參照《學(xué)習(xí)必備——redis安裝》
配置操作
a)主從復(fù)制配置
三個節(jié)點的redis.conf配置如下
# 服務(wù)器端口號,默認就是6379
port 6379
# 運行所有ip訪問服務(wù)
bind 0.0.0.0
# reids的密碼
requirepass "123456"
# 主節(jié)點redis器密碼
masterauth "123456"
# 下面配置只需要配置slave節(jié)點
# 配置主服務(wù)器地址、端口號
replicaof 192.168.56.91
三個節(jié)點配置完成后,啟動redis,使用客戶端連接redis,查看三個節(jié)點服務(wù)信息如下:
從圖中可以看出,我們配置三個節(jié)點正確運行,第一個為Mater節(jié)點后兩個為slave節(jié)點
b)哨兵配置
在redis的編譯目錄下有 sentinel.conf 文件,三個節(jié)點配置sentinel.conf如下
#哨兵監(jiān)聽端口
port 26379
#哨兵啟動后運行在后臺
daemonize yes
# 配置哨兵,主節(jié)點名稱(可自定義,但要與后面配置與其他節(jié)點哨兵一致),主節(jié)點ip,主節(jié)點redis端口,2個以上哨兵認為主節(jié)點不可用時進行故障轉(zhuǎn)移
sentinel monitor redis-master 127.0.0.1 6379 2
# redis認證密碼
sentinel auth-pass redis-mater 123456
# 被sentinel認定為不可用的間隔時間,單位毫秒
sentinel down-after-milliseconds redis-master 30000
# 剩余的slaves重新和新的master做同步時,進行同步的slave的并行個數(shù)
sentinel parallel-syncs redis-master 1
# 故障轉(zhuǎn)移轉(zhuǎn)移的超時時間,若執(zhí)行故障轉(zhuǎn)移的哨兵超過該時間仍未進行主節(jié)點切換,則會由其他的哨兵來處理
sentinel failover-timeout redis-master 180000
編譯目錄下啟動哨兵:./src/redis-sentinel sentinel.conf
驗證
經(jīng)過以上配置在所有都啟動的情況下,我們停止掉redis-master(192.168.56.91)
經(jīng)過哨兵故障轉(zhuǎn)移結(jié)果如下圖所示
2.Redis Cluster
環(huán)境準備
六臺主機:Redis81(192.168.56.81)、Redis82(192.168.56.82)、Redis83(192.168.56.83),Redis84(192.168.56.84)、Redis85(192.168.56.85、Redis86(192.168.56.86)
六個節(jié)點redis先進行基礎(chǔ)安裝(下載源碼,解壓,編譯,基礎(chǔ)配置等),基礎(chǔ)安裝參照《學(xué)習(xí)必備——redis安裝》
配置操作
對6個節(jié)點的redis.conf進行配置如下:
#redis監(jiān)聽端口
port 6379
#redis在后臺運行
daemonize yes
#設(shè)置redis運行為非保護模式
protected-mode no
#開啟集群模式
cluster-enabled yes
#節(jié)點配置文件,每個節(jié)點都有一個,由redis自己維護,在創(chuàng)建新集群時需把原來舊的刪除
cluster-config-file node-6379.conf
#節(jié)點檢測超時時間,超過改時間不能通信則認為節(jié)點宕機
cluster-node-timeout 5000
#開啟aof持久化
appendonly yes
啟動六個節(jié)點的redis服務(wù),
構(gòu)建redis cluster
#-a 認證密碼,沒有設(shè)置密碼可以不用該參數(shù)
#--cluster create 創(chuàng)建集群
#--cluster-replicas 集群副本節(jié)點數(shù)
redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.56.81:6379 192.168.56.82:6379 192.168.56.83:6379 192.168.56.84:6379 192.168.56.85:6379 192.168.56.86:6379
查看集群信息
#-a 認證密碼,沒有設(shè)密碼,不用該參數(shù)
#--cluster check 指定集群中一個節(jié)點
redis-cli -a 123456 --cluster check 192.168.56.81:6379
查看結(jié)果如圖
從圖中我們可以看出:M代表Master節(jié)點,S代表slave節(jié)點,16384個槽平均分配在三個Master節(jié)點上,slave節(jié)點沒有槽。
驗證
我們停掉集群中的一個節(jié)點,來驗證
其他配置
1.reshard
默認分片機制是均分,也就是多個master節(jié)點均分16834個槽,當(dāng)默認均分策略不滿足需求時,可以使用reshard調(diào)整分片,命令如下
#-a 認證密碼,無密碼不使用該參數(shù)
#--cluster reshard 進行分片槽調(diào)整操作,指定集群中任意節(jié)點
redis-cli -a 123456 --cluster reshard 192.168.56.81:6379
操作如下圖所示
2.節(jié)點管理
首先配置安裝上面集群模式方式安裝配置一個新的節(jié)點,然后使用如下命令將新節(jié)點添加到集群中
#添加節(jié)點
#newNodeIP:newNodePort 新節(jié)點ip和端口
#clusterNodeIp:clusterNodePort 原有集群中任意一個節(jié)點的ip和端口
redis-cli -a 123456 --cluster add-node newNodeIP:newNodePort clusterNodeIp:clusterNodePort
經(jīng)過如上配置將節(jié)點加入集群,若將新增節(jié)點作為主節(jié)點則使用reshard給新加入節(jié)點分配槽即可,若將該節(jié)點作為從節(jié)點,則使用redis-cli連接新節(jié)點,使用cluster replicate <MasterNodeId> 將新節(jié)點指定某個主機的從節(jié)點
從集群中移除一個節(jié)點使用如下命令
#clusterNodeIp:clusterNodePort 集群中任意一個節(jié)點的ip和端口
#removeNodeId 要移除的節(jié)點id
redis-cli -a 123456 --cluster del-node clusterNodeIp:clusterNodePort removeNodeId
總結(jié)
到這里本篇內(nèi)容結(jié)束,在本篇中主要介紹redis的兩種高可用搭建方式,對其概念和理論進行介紹,同時也進行了演示兩者redis高可用服務(wù)搭建方式并進行了驗證。在下一篇中錘子將和大家一起學(xué)習(xí)在java中如何使用Redis
個人公眾號【愛做夢的錘子】,全網(wǎng)同id,個站 http://te-amo.site,歡迎關(guān)注,里面會分享更多有用知識
覺得不錯就點個贊叭QAQ