Redis Cluster 叢集解決方案

削個椰子皮_給個梨發表於2021-07-24
  • 多個 Redis 例項協同進行
  • 採用 slot (槽)分割資料,是 CRC16 與 16384 取模後分散
  • 主從結構和選舉演算法,保證每個節點的可靠性
  • 客戶端可以連線任意一個 node 進行操作

主從協同進行

  • 所有的 redis 節點彼此互聯(PING-PONG 機制),內部使用二進位制協議優化傳輸速度和頻寬。
  • 節點的 fail 是通過叢集中超過半數的節點檢測失效時才生效。
  • 客戶端與 redis 節點直連,不需要中間 proxy 層,客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。
  • redis-cluster 把所有的物理節點對映到 [0-16383] slot 上,cluster 負責維護 node <-> slot <-> value

當有一臺伺服器出現故障時

Redis Cluster 注意事項

  • 不完全支援批量操作:mset、mget
  • 事務不能跨節點支援
  • 不支援多例項
  • key 是最小粒度
  • 最少 6 個才能保證組成完整高可用的叢集
  • 連線的時候只需要連線 1 臺伺服器即可。
  • 如果 1 個主從連線當機的話,那麼叢集就當機了。

Redis Cluster 配置步驟

(建議使用官方安裝包的方式安裝 redis,不要使用 apt-get install 或者 yum 直接安裝)

  1. 分別安裝 6 臺 伺服器,三個主節點,三個從節點

我這裡採用的是虛擬機器,相應的 ip 地址分別為:

  • 192.168.174.128 (28 號伺服器)
  • 192.168.174.129 (29 號伺服器)
  • 192.168.174.130 (30 號伺服器)
  • 192.168.174.131 (31 號伺服器)
  • 192.168.174.132 (32 號伺服器)
  • 192.168.174.133 (33 號伺服器)
  1. 配置 redis.conf 配置檔案 (在所有的伺服器上操作)

vim /etc/redis/redis.conf

  • 第一步:

# 預設為本地 ip 地址,需要改成當前伺服器的 ip 地址,以便其他伺服器可以正常訪問
  69 bind 127.0.0.1 ::1

# 比如 28 號伺服器更改為以下 ip 地址
bind 192.168.174.128
  • 第二步:

# 這個引數的含義是指:禁止公網連線 redis 快取,這樣可以加強 redis 安全性。如果是線上上環境的話,我們不需要更改此引數值,然後需要進行設定賬號密碼,進行 auth 認證。這裡為了測試方便,我們直接改成 no
  89 protected-mode yes

# 需要更改為以下
protected-mode no
  • 第三步:開啟叢集相關引數

# 預設叢集是關閉的
 815 # cluster-enabled yes

# 需要更改為以下(去除掉 # 號註釋即可)
 815 cluster-enabled yes
  • 第四步:開啟叢集配置檔案
# 預設叢集配置檔案是關閉的
 823 # cluster-config-file nodes-6379.conf

# 需要更改為以下(去除掉 # 號註釋即可) 
 823 cluster-config-file nodes-6379.conf 
  • 第五步:開啟叢集超時時間
# 當一個節點出現問題的時候,最大超時連線時間為 15s ,當超過 15s 還沒有連線的時候,就會認為該節點出現故障了,就會通過選舉演算法,將從伺服器提升為主伺服器。該引數預設是關閉的。
 829 # cluster-node-timeout 15000

# 需要更改為以下(去除掉 # 號註釋即可)
 829 cluster-node-timeout 15000
  1. 安裝 ruby 元件。如果不安裝這個軟體,叢集的時候,會報元件錯誤。你需要在那臺伺服器上面做叢集,你就需要在哪臺伺服器上安裝這個元件,並不是每臺伺服器上面都安裝。這裡採用第一臺伺服器做叢集,因此在第一臺伺服器上安裝 ruby 元件。(在 28 號伺服器上操作)
sudo apt install ruby
  1. 安裝其他元件 (在 28 號伺服器上操作)
sudo gem install redis
  1. 配置叢集 (在 28 號伺服器上操作)

因為我是直接採用的 apt-get install 的方式安裝的 redis 因此,伺服器上面的 redis 工具 redis-trib.rb/usr/share/doc/redis-tools/examples 目錄下。如果你是通過安裝包安裝的 redis 那麼請直接到 redis 解壓目錄中執行命令,如: ~/redis-4.0.9/src/redis-trib.rb

/usr/share/doc/redis-tools/examples/redis-trib.rb create --replicas 1 192.168.174.128:6379 192.168.174.129:6379 192.168.174.130:6379 192.168.174.131:6379 192.168.174.132:6379 192.168.174.133:6379

配置叢集

如果出現如下報錯時

插槽節點被佔用

問題原因:
slot 插槽被佔用了(這是搭建叢集前時,以前 redis 的舊資料和配置資訊沒有清理乾淨。)
解決方案如下:
用 redis-cli 登入到每個節點執行 flushall 和 cluster reset 就可以了

解決方案如圖所示

再次設定叢集,則可以連線成功

  1. 連線叢集 (在任意一臺伺服器上操作)

這裡我挑選的是 ip 地址為 : 192.168.174.131 的伺服器,特別說明下,當執行 keys 命令的時候,只針對於當前伺服器

# 帶 -c 參數列示連線叢集
redis-cli -h 192.168.174.131 -c
  1. 測試
alex@alex-virtual-machine:~$ redis-cli -h 192.168.174.131 -c    # 連線的 31 號伺服器
192.168.174.131:6379> keys *  # 這裡的 keys 也只能檢視所有在 31 號伺服器上面的 keys
(empty list or set)
192.168.174.131:6379> set aa 111  # 隨便設定一個 key
-> Redirected to slot [1180] located at 192.168.174.128:6379  # 資料卻在 28 號伺服器上被儲存
OK
192.168.174.128:6379>   # 並且此時的狀態直接跳到了 28 號伺服器上面

連線 31 號伺服器,資料存到了 28 號伺服器上

alex@alex-virtual-machine:~$ redis-cli -h 192.168.174.129 -c  # 通過 29 號伺服器連線叢集
192.168.174.129:6379> get aa  # 從 29 號伺服器中去取值
-> Redirected to slot [1180] located at 192.168.174.128:6379  # 會直接從 28 號伺服器中返回值
"111"
192.168.174.128:6379>   # 並且此時的狀態直接跳到了 28 號伺服器上面

從 30 號伺服器上面取剛剛設定的值,會直接跳到 28 號伺服器返回值

alex@alex-virtual-machine:~$ redis-cli -h 192.168.174.130 -c  # 通過 30 號伺服器連線叢集
192.168.174.130:6379> keys *  # 30 號伺服器中並沒有設定過 key,如果 30 號伺服器可以取出值,證明可以跨伺服器取出 keys,但是並沒有資料,證明 keys 只能取出當前伺服器中的 keys
(empty list or set)
192.168.174.130:6379> 

keys 只能取出當前伺服器中的所有 key

原文連結地址

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章