一起學(xué)習(xí)Redis高可用

操作系統(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模式

從圖中看出,Redis Cluster模式下是有多個主節(jié)點,每個主節(jié)點可以有多個從節(jié)點,且Redis自身在Cluster模式也做了節(jié)點數(shù)限制,節(jié)點最小配置 6 個節(jié)點(3 主 3 從)。

3.優(yōu)缺點對比

在了解完上面兩種模式后,我們來對比一下這兩種模式各自的優(yōu)缺點

sentinel和cluster對比

二、搭建與配置演示

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ù)信息如下:

主從復(fù)制節(jié)點信息

從圖中可以看出,我們配置三個節(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é)果如下圖所示

哨兵機制下主從復(fù)制故障轉(zhuǎn)移驗證

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é)果如圖

redis cluster信息查看

從圖中我們可以看出:M代表Master節(jié)點,S代表slave節(jié)點,16384個槽平均分配在三個Master節(jié)點上,slave節(jié)點沒有槽。

驗證

我們停掉集群中的一個節(jié)點,來驗證

Redis cluster高可用驗證

其他配置

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

操作如下圖所示

Redis cluster下充分片

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容