目錄
一、Redis主從復制
1.概念
2.作用
2.1?數據冗余
2.2?故障恢復
2.3?負載均衡
2.4?高可用
3.缺點
4.流程
4.1 第一步
4.2 第二步
4.3 第三步
4.4 第四步
5.搭建
5.1 主
5.2 從
6.驗證
二、Reids哨兵模式
1.概念
2.作用
2.1 監控
2.2 自動故障轉移
2.3 通知(提醒)
3.缺點
4.結構
4.1 哨兵節點
4.2 數據節點
5.搭建
6.驗證
三、Redis集群
1.概述
2.原理
3.架構細節
3.1 細節一
3.2?細節二
3.3?細節三
3.4?細節四
4.選舉過程
5.搭建
5.1 基礎搭建
5.2?分別修改配置文件中
5.3?啟動服務
5.4?構建集群
5.4.1?將其他節點加入集群
5.4.2?分配slot
5.4.3?建立主從關系
5.5?查看命令
5.6?重置集群命令
一、Redis主從復制
1.概念
是指將一臺Redis服務器的數據,復制到其他的Redis服務器。前者稱為主節點(Master),后者稱為從節點(Slave);數據的復制是單向的,只能由主節點到從節點。
2.作用
2.1?數據冗余
主從復制實現了數據的熱備份,是持久化之外的一種數據冗余方式。
2.2?故障恢復
當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗余。
2.3?負載均衡
在主從復制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis數據時應用連接主節點,讀Redis數據時應用連接從節點),分擔服務器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis服務器的并發量。
2.4?高可用
除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎,因此說主從復制是Redis高可用的基礎。
3.缺點
- 故障恢復無法自動化
- 寫操作無法負載均衡
- 存儲能力受到單機的限制
4.流程
4.1 第一步
若啟動一個Slave機器進程,則它會向Master機器發送一個“sync command”命令,請求同步連接。
4.2 第二步
無論是第一次連接還是重新連接,Master機器都會啟動一個后臺進程,將數據快照保存到數據文件中(執行rdb操作),同時Master還會記錄修改數據的所有命令并緩存在數據文件中。?
4.3 第三步
后臺進程完成緩存操作之后,Maste機器就會向Slave機器發送數據文件,Slave端機器將數據文件保存到硬盤上,然后將其加載到內存中,接著Master機器就會將修改數據的所有操作一并發送給Slave端機器。若Slave出現故障導致宕機,則恢復正常后會自動重新連接。
4.4 第四步
Master機器收到Slave端機器的連接后,將其完整的數據文件發送給Slave端機器,如果Mater同時收到多個Slave發來的同步請求,則Master會在后臺啟動一個進程以保存數據文件,然后將其發送給所有的Slave端機器,確保所有的Slave端機器都正常。
5.搭建
5.1 主
修改配置文件
?? ?bind ?0.0.0.0
?? ?port ?6379
?? ?protected-mode = no
?? ?daemonize = yes
5.2 從
修改配置文件
?? ?bind ?0.0.0.0
?? ?port ?6380
?? ?protected-mode = no
?? ?daemonize = yes
?? ?slaveof 192.168.115.160 6379
6.驗證
使用redis-cli命令行登錄redis服務器,輸入role指令查看狀態
在master節點上,錄入數據,在slave節點上查看到對應數據即可
?
?
?
二、Reids哨兵模式
1.概念
是一個分布式系統,用于對主從結構中的每臺服務器進行監控,當出現故障時通過投票機制選擇新的 Master 并將所有 Slave 連接到新的 Master。所以整個運行哨兵的集群的數量不得少于3個節點。
注:依托于主從模式
2.作用
2.1 監控
哨兵會不斷地檢查主節點和從節點是否運作正常。
2.2 自動故障轉移
當主節點不能正常工作時,哨兵會開始自動故障轉移操作,它會將失效主節點的其中一個從節點升級為新的主節點,并讓其他從節點改為復制新的主節點。
2.3 通知(提醒)
哨兵可以將故障轉移的結果發送給客戶端。
3.缺點
- 寫操作無法負載均衡
- 存儲能力受到單機的限制
- 哨兵無法對從節點進行自動故障轉移,在讀寫分離場景下,從節點故障會導致讀服務不可用,需要對從節點做額外的監控、切換操作。
4.結構
4.1 哨兵節點
哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不存儲數據。
4.2 數據節點
主節點和從節點都是數據節點。
5.搭建
vim /etc/redis-sentinel.conf
????????bind 0.0.0.0
????????port 26379????????????????????????Redis哨兵默認的監聽端口
????????protected-mode no? ? ? ? ? ?關閉保護模式
????????daemonize ?yes
????????sentinel monitor mymaster 主IP?6379 2??
????????修改 指定該哨兵節點監控ip:6379這個主節點,該主節點的名稱是mymaster,最后的2的含義? ? ? ? ? 與主節點的故障判定有關:至少需要2個哨兵節點同意,才能判定主節點故障并進行故障轉移????????
????????sentinel down-after-milliseconds mymaster 30000????????判定服務器down掉的時間周期,默認? ? ? ? ? 30000毫秒
????????sentinel failover-timeout mymaster 180000????????故障節點的最大超時時間為180000毫秒
?
?
指定日志存放路徑
logfile "/var/log/sentinel.log"
指定數據庫存放路徑
dir "/var/lib/redis"
6.驗證
停止master后,slave會通過選舉產生新的master
哨兵配置文件會自動修改監聽的master節點地址為新的master節點地址
?
?
?
?
?
?
三、Redis集群
1.概述
Redis3.0版本以上開始支持cluster,采用的是hashslot(hash槽),可以將多個Redis實例整合在一起,形成一個群集,也就是將數據分散到群集的多臺機器上。
2.原理
Redis Cluster是一個無中心的結構,每個節點都保存數據和整個群集的狀態。每個節點都會保存其他節點的信息,知道其他節點所負責的槽,并且會與其他節點定時發送心跳信息,能夠及時感知群集中異常的節點。
3.架構細節
3.1 細節一
所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
3.2?細節二
節點的失效(fail)在群集中超過半數的主(master)節點檢測失效時才生效。
3.3?細節三
客戶端與 redis 節點直連,不需要中間代理(proxy)層,客戶端不需要連接群集所有節點,連接群集中任何一個可用節點即可。
3.4?細節四
redis-cluster 把所有的物理節點映射到【0-16383】slot 上,cluster 負責維護 node<->slot<->key。
4.選舉過程
- 選舉過程是群集中所有master參與,如果半數以上master節點與當前 master 節點通信超時(cluster—node—timeout),認為當前 master 節點掛掉。以下兩種情況為整個群集不可用(cluster_state:fail),當群集不可用時,所有對群集的操作都不可用,收到((error)CLUSTEFDOWN The cluster is down)錯誤。
- 如果群集任意 master掛掉,且當前 master 沒有 slave,則群集進入 fail狀態,也可以理解成群集的slot映射【0 ~16383】不完整時進入fail狀態。
- 如果群集中超過半數的master掛掉,無論是否有slave,群集都進入 fail狀態。
- 默認情況下,每個群集的節點都使用兩個TCP端口.一個是6379,一個是16379;6379服務于客戶端的連接,16379 用于群集總線,即使用二進制協議的節點到節點通信通道。節點使用群集總線進行故障檢測、配置更新、故障轉移授權等。如果開啟了防火墻,需要開放這兩個端口。
5.搭建
5.1 基礎搭建
mkdir /etc/redis
mv /etc/redis.conf /etc/redis/6379.conf
cd /etc/redis
for i in {0..4};do cp ./6379.conf ./638${i}.conf;done
for i in {0..4};do sed -i "s/port 6379/port 638${i}/" ./638${i}.conf;done
sed -i "s/dir \/var\/lib\/redis/dir \/var\/lib\/redis\/6379/" ./6379.conf
for i in {0..4};do sed -i "s/dir \"\/var\/lib\/redis\/6379\"/dir \"\/var\/lib\/redis\/638${i}\"/" ./638${i}.conf;done
cd /var/lib/redis
mkdir 6379 638{0..4}
5.2?分別修改配置文件
port
cluster-enabled yes
cluster-config-file nodes-【6379~6384】.conf
cluster-node-timeout 15000
5.3?啟動服務
for((i=6379;i<=6384;i++));do redis-server /etc/redis/${i}.conf;done
5.4?構建集群
5.4.1?將其他節點加入集群
?CLUSTER MEET 192.168.42.138 6380
?CLUSTER MEET 192.168.42.138 6381
?CLUSTER MEET 192.168.42.138 6382
?CLUSTER MEET 192.168.42.138 6383
?CLUSTER MEET 192.168.42.138 6384
注:只此步驟在某數據庫內部執行
5.4.2?分配slot
redis-cli -h 192.168.42.138 -p 6379 cluster addslots {0..5461}
redis-cli?-h 192.168.42.138 -p 6381 cluster addslots {5462..10922}
redis-cli -h 192.168.42.138 -p 6383 cluster addslots {10923..16383}
5.4.3?建立主從關系
redis-cli -h 192.168.42.138 -p 6380 cluster replicate?
redis-cli -h 192.168.42.138 -p 6382 cluster replicate ?redis-cli -h 192.168.42.138 -p 6384 cluster replicate?
5.5?查看命令
cluster nodes????????查看所有群集節點
cluster info? ? ? ? ? ??查看群集狀態
?
5.6?重置集群命令
cluster reset
數據的key不能相同
注:每個節都要重置