- 多個 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 直接安裝)
- 分別安裝 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 號伺服器)
- 配置
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
- 安裝
ruby
元件。如果不安裝這個軟體,叢集的時候,會報元件錯誤。你需要在那臺伺服器上面做叢集,你就需要在哪臺伺服器上安裝這個元件,並不是每臺伺服器上面都安裝。這裡採用第一臺伺服器做叢集,因此在第一臺伺服器上安裝ruby
元件。(在 28 號伺服器上操作)
sudo apt install ruby
- 安裝其他元件 (在 28 號伺服器上操作)
sudo gem install redis
- 配置叢集 (在 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 就可以了
- 連線叢集 (在任意一臺伺服器上操作)
這裡我挑選的是 ip 地址為 : 192.168.174.131 的伺服器,特別說明下,當執行 keys
命令的時候,只針對於當前伺服器
# 帶 -c 參數列示連線叢集
redis-cli -h 192.168.174.131 -c
- 測試
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 號伺服器上面
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 號伺服器上面
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>
本作品採用《CC 協議》,轉載必須註明作者和本文連結