Redis--叢集搭建

高高2020…發表於2020-10-18

為什麼要搭建叢集

  1. 通常,為了提高網站響應速度,總是把熱點資料儲存在記憶體中而不是直接從後端資料庫中讀取。 Redis是一個很好的Cache工具。大型網站應用,熱點資料量往往巨大,幾十G上百G是很正常的事兒。
  2. 由於記憶體大小的限制,使用一臺 Redis 例項顯然無法滿足需求,這時就需要使用多臺.Redis作為快取資料庫。但是如何保證資料儲存的一致性呢,這時就需要搭建redis叢集.採用合理的機制,保證使用者的正常的訪問需求.
  3. 採用redis叢集,可以保證資料分散儲存,同時保證資料儲存的一致性.並且在內部實現高可用的機制.實現了服務故障的自動遷移.

redis分片特點:

1.可以實現Redis記憶體資料的擴容.
2.redis分片本身沒有高可用效果的.如果當機將直接影響使用者的使用.

redis哨兵特點:

1.Redis哨兵可以實現Redis節點的高可用.但是哨兵本身沒有實現高可用機制.(最好不要引入第三方)
2.Redis哨兵有主從的結構 實現了記憶體資料的備份. 但是沒有實現記憶體擴容的效果.

升級:

需要Redis內容擴容同時需要Redis高可用性所以應該使用Redis叢集.

叢集搭建

1 準備叢集資料夾

1.準備叢集資料夾

Mkdir cluster

2.在cluster資料夾中分別建立7000-7005資料夾
在這裡插入圖片描述

2.複製配置檔案

說明:
將redis根目錄中的redis.conf檔案複製到cluster/7000/ 並以原名儲存

cp redis.conf cluster/7000/

3 .編輯配置檔案

  1. 註釋本地繫結IP地址
    在這裡插入圖片描述
  2. 關閉保護模式
    在這裡插入圖片描述
  3. 修改埠號
    在這裡插入圖片描述
  4. 啟動後臺啟動
    在這裡插入圖片描述
  5. 修改pid檔案
    在這裡插入圖片描述
  6. 修改持久化檔案路徑
    在這裡插入圖片描述
  7. 設定記憶體優化策略
    在這裡插入圖片描述
  8. 關閉AOF模式
    在這裡插入圖片描述
  9. 開啟叢集配置
    在這裡插入圖片描述
    1. 開啟叢集配置檔案
      在這裡插入圖片描述
  10. 修改叢集超時時間
    在這裡插入圖片描述
  11. 修改叢集超時時間
    在這裡插入圖片描述

4 複製修改後的配置檔案

說明:將7000資料夾下的redis.conf檔案分別複製到7001-7005中

[root@localhost cluster]# cp 7000/redis.conf  7001/
[root@localhost cluster]# cp 7000/redis.conf  7002/
[root@localhost cluster]# cp 7000/redis.conf  7003/
[root@localhost cluster]# cp 7000/redis.conf  7004/
[root@localhost cluster]# cp 7000/redis.conf  7005/

5 批量修改

說明:分別將7001-7005檔案中的7000改為對應的埠號的名稱,
修改時注意方向鍵的使用
在這裡插入圖片描述

6 通過指令碼編輯啟動/關閉指令

1.	建立啟動指令碼  vim start.sh

在這裡插入圖片描述
2. 編輯關閉的指令碼 vim shutdown.sh
在這裡插入圖片描述
3. 啟動redis節點

sh start.sh
  1. 檢查redis節點啟動是否正常
    在這裡插入圖片描述

7 建立redis叢集

5.0版本執行 使用C語言內部管理叢集

redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005

在這裡插入圖片描述
在這裡插入圖片描述

8 Redis叢集高可用測試

  1. 關閉redis主機.檢查是否自動實現故障遷移.
  2. 再次啟動關閉的主機.檢查是否能夠實現自動的掛載.
    一般情況下 能夠實現主從掛載
    個別情況: 當機後的節點重啟,可能掛載到其他主節點中(7001-7002) 正確的
    在這裡插入圖片描述

9.關於Redis叢集搭建問題說明

前提條件: redis.conf的配置檔案首先應該配置正確 碼雲中有redis配置.

搭建步驟:

1.關閉所有的redis伺服器

sh stop.sh

在這裡插入圖片描述
2.刪除多餘的檔案
由於搭建叢集之後,所有的叢集的資訊都會寫入nodes.conf檔案中,如果下次重啟會讀取其中的配置資訊實現redis叢集的主從的搭建. 所以如果需要重新搭建叢集,則必須刪除該檔案重新生成.
在這裡插入圖片描述
3.重啟redis伺服器 執行掛載命令

redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005

10. SpringBoot整合Redis叢集

redis叢集的入門案例
jedisCluster 操作整個redis叢集,連結redis的所有的節點

 @Test
    public void testCluster(){
        Set<HostAndPort> sets = new HashSet<>();
        sets.add(new HostAndPort("192.168.126.129", 7000));
        sets.add(new HostAndPort("192.168.126.129", 7001));
        sets.add(new HostAndPort("192.168.126.129", 7002));
        sets.add(new HostAndPort("192.168.126.129", 7003));
        sets.add(new HostAndPort("192.168.126.129", 7004));
        sets.add(new HostAndPort("192.168.126.129", 7005));
        JedisCluster jedisCluster = new JedisCluster(sets);
        jedisCluster.set("cluster", "叢集測試");
        System.out.println(jedisCluster.get("cluster"));
    }

Redis叢集原理

Redis叢集高可用推選原理

Redis的所有節點都會儲存當前redis叢集中的全部主從狀態資訊.並且每個節點都能夠相互通訊.當一個節點發生當機現象.則叢集中的其他節點通過PING-PONG檢測機制檢查Redis節點是否當機.當有半數以上的節點認為當機.則認為主節點當機.同時由Redis剩餘的主節點進入選舉機制.投票選舉連結當機的主節點的從機.實現故障遷移.

在這裡插入圖片描述

Redis叢集當機條件

特點:叢集中如果主機當機,那麼從機可以繼續提供服務,
當主機中沒有從機時,則向其它主機借用多餘的從機.繼續提供服務.如果主機當機時沒有從機可用,則叢集崩潰.
在這裡插入圖片描述
如果3主3從(1主1從) 最少/當機幾臺叢集崩潰? B
A. 1臺 B.2臺 C.3臺 D.4臺

如果3主6從(1主2從) 最少當機幾臺叢集崩潰? C
A. 3臺 B.4臺 C.5臺 D.6臺
說明: 如果沒有子節點 則會借用其他主機的多餘的從.

關於選舉機制-腦裂現象

說明: 當叢集進行選舉時,如果連續3次都出現了平票的結果的則可能出現腦裂的現象.(3主3從)
問題: 出現腦裂現象的概率是多少??? 1/8
數學建模:
拋銀幣連續3次出現平票的概念是多少? 1/8=12.5%
第一次: 正正 正反 反正 反反 1/2
第二次: 正正 正反 反正 反反 1/2
第三次: 正正 正反 反正 反反 1/2

預防: 增加主節點的數量可以有效的降低腦裂現象的發生.

Redis hash槽儲存資料原理

說明:

RedisCluster採用此分割槽,所有的鍵根據雜湊函式(CRC16[key]%16384)對映到0-16383槽內,共16384個槽位,每個節點維護部分槽及槽所對映的鍵值資料.根據主節點的個數,均衡劃分割槽間.

演算法:

雜湊函式: Hash()=CRC16[key]%16384

圖解

在這裡插入圖片描述
當向redis叢集中插入資料時,

  1. 首先將key進行計算.之後將計算結果匹配到具體的某一個槽的區間內,
  2. 之後再將資料set到管理該槽的節點中.
    在這裡插入圖片描述

叢集面試題

問題1: Redis叢集中最多儲存16384個資料???
錯的 分割槽只負責資料的劃分 資料的儲存由記憶體決定.
crc16(key1)%16384 = 1000
crc16(key2)%16384 = 1000

問題2: Redis叢集中最多有多少臺主機?? 16384主機.
一臺主機佔用一個槽道

相關文章