Redis 集群 是內置的 Redis 功能,支持自動分片、複製和高可用性,之前是使用 Sentinels 實現的。它設計用於兩個主要目的:一是自動將您的數據集分配到多個實例之間,二是在分區期間提供一定程度的可用性,以在某些實例(特別是主機)失敗或無法與集群中大多數節點通信時繼續運行操作。
然而,在出現較大故障時(例如,大多數主機實例不可用時),集群停止運作。此外,如果主從機同時失敗,集群無法繼續正常運作(雖然解決方法是添加更多節點或在集群中創建不對稱性,以自動更改集群布局)。
根據 Redis 集群文檔,“最小集群” 預期的工作需要至少包含 3 個主節點。但最適合高可用性的設置應該至少有 6 個節點,其中包括三個主節點和三個從節點,每個主節點都有一個從節點。
重要:Redis 集群也存在一些限制,即不支持 NAT 環境以及其中 IP 地址或 TCP 端口被重新映射的情況,例如在 Docker 下。此外,並非每個客戶端庫都支持它。
這篇文章展示了如何在 CentOS 8 中設置一個 Redis 集群(關閉 Cluster 模式)。它包括如何安裝 Redis、配置集群節點、創建集群以及測試集群故障轉移。
注意:對於本指南,我們將使用全新/空的 Redis 實例運行集群模式。集群模式將無法與我們 Redis 系列 的前兩個指南中的某些配置一起使用,特別是當使用 replica 參數時無法運作。
先決條件:
測試環境設置
Redis Master1: 10.42.0.247 Redis Master2: 10.42.0.197 Redis Master3: 10.42.0.132 Redis Slave1: 10.42.0.200 Redis Slave2: 10.42.0.21 Redis Slave3: 10.42.0.34

我們的設置有 3 個讀寫主節點和 3 個唯讀副本節點,每個主節點有一個副本,因此三個分片包含每個節點中的所有集群數據。應用程式 API 或 CLI 客戶端只能寫入主節點,但可以從集群中的任何節點讀取。
步驟 1:在所有節點上安裝 Redis
1. 透過SSH登錄所有實例,然後執行以下命令以使用DNF套件管理器安裝Redis模塊,如下所示。
# dnf module install redis
2. 接下來,啟動Redis服務,啟用自動在系統啟動時啟動它,並檢查其狀態以驗證它正在運行(驗證所有6個實例上的服務):
# systemctl start redis # systemctl enable redis # systemctl status redis
步驟2:在所有節點上配置Redis實例
3. 本節描述了如何配置Redis集群節點。請記住在所有節點上執行這裡的配置。
使用/etc/redis.conf配置文件來配置Redis服務器。作為建議的做法,在使用您選擇的命令行文本編輯器編輯之前,請創建原始文件的備份。
# cp /etc/redis.conf /etc/redis.conf.orig # vi /etc/redis.conf
4. 接下來,找到以下配置參數並根據所示編輯其值。 bind參數設置Redis服務器將監聽的接口,將其值設置為實例LAN IP。 刪除127.0.0.1,因為我們發現將其留在那裡會減慢集群創建的過程,特別是加入集群的階段。
bind 10.42.0.247
將protected-mode設置為no
以允許集群中其他實例的連接。
protected-mode no
端口參數定義了Redis服務器將用於連接的端口,默認值為6379。這是與客戶端通信的數據端口。
port 6379

5.接下來的一組參數將啟用集群模式並設置一些有用的功能。cluster-enabled參數設置為yes
時激活集群模式。
cluster-enabled yes
接下來,cluster-config-file參數設置了集群節點的集群配置文件的名稱(例如nodes-6379.conf)。該文件在工作目錄中創建(默認為/var/lib/redis,使用dir參數定義),並且不可由用戶編輯。
cluster-config-file nodes-6379.conf
下一個有用的集群選項是cluster-node-timeout,它用於設置實例無法使用的最長時間(以毫秒為單位),以將其視為失敗狀態。 15000的值相當於15秒。
cluster-node-timeout 15000

6.我們還需要在磁盤上啟用Redis持久性。我們可以使用其中一種持久性模式,即附加文件(AOF):它在工作目錄下創建的文件appendonly.aof中記錄了服務器成功接收的每個寫操作。數據將在服務器啟動時播放,以重構原始數據集。
要啟用它,將appendonly參數設置為yes
。
appendonly yes

7.完成所有更改後,在所有節點上重新啟動Redis服務以應用最近的更改。
# systemctl restart redis
8.此時,每個集群節點應該都有一個ID。您可以在位於/var/log/redis/redis.log的日誌文件中檢查這一點。
# cat /var/log/redis/redis.log

9.接下來,在所有實例上打開端口6397和16379。後者端口用於集群總線(使用二進制協議的節點到節點通信通道)。這是Redis集群TCP連接的基本要求。
# firewall-cmd --zone=public --permanent --add-port=6379/tcp # firewall-cmd --zone=public --permanent --add-port=16379/tcp # firewall-cmd --reload
第3步:創建Redis集群
10.要創建集群,請使用以下redis-cli命令行客戶端。 --cluster create
啟用集群創建,--cluster-replicas 1
表示每個主機創建一個副本。
對於我們的設置,有6個節點,我們將有3個主節點和3個從屬節點。
請注意,前6個節點將被視為主(M)
,接下來的三個將被視為從屬(S)
。第一個從屬即10.42.0.200:6379複製第一個主即10.42.0.247:6379,第二個從屬複製第二個主,以此類推。
以下命令的格式將呈現我們上述的邏輯設置。
# redis-cli --cluster create 10.42.0.247:6379 10.42.0.197:6379 10.42.0.132:6379 10.42.0.200:6379 10.42.0.21:6379 10.42.0.34:6379 --cluster-replicas 1

11. 一旦集群创建成功,就在任何主机上运行以下命令(使用 -h
标志指定其 IP 地址)以列出所有集群节点。
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes
您应该能够看到所有集群节点,其中从属节点指示其主节点,如以下屏幕截图所示。

不同字段的顺序是:节点 ID、IP 地址:端口、标志、上次发送 ping 的时间、上次接收 pong 的时间、配置纪元、链路状态、槽(用于主节点)。
第 4 步:测试 Redis 集群故障转移
12. 在本节中,我们将演示如何测试集群故障转移。首先,让我们记下主节点。
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep master

还要注意 Redis 从属节点。
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep slave

13. 接下来,让我们停止其中一个主节点上的 Redis 服务,例如 10.42.0.197,并检查集群中的所有主节点。
# systemctl stop redis # redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep master
从以下屏幕截图中,您可以看到节点 10.42.0.197:6367 处于故障状态,其从属节点 10.42.0.21:6379 已晋升为主节点状态。

14. 现在让我们再次在故障节点上启动 Redis 服务,并检查集群中的所有主节点。
# systemctl start redis # redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep master

还要检查集群从属节点,以确认失败的主节点现在是从属节点。
# redis-cli -h 10.42.0.247 -p 6379 cluster nodes | grep slave

第 5 步:测试数据在 Redis 集群中的复制
15. 這最後一部分說明了如何驗證集群數據複製。 我們將在其中一個主節點上創建一個鍵和值,然後嘗試從所有集群節點讀取它如下。 使用-c
開關在redis-cli實用程序下啟用集群支持並以集群模式訪問數據。
# redis-cli -c -h 10.42.0.247 -p 6379 set name 'TecMint.com' # redis-cli -c -h 10.42.0.247 -p 6379 get name # redis-cli -c -h 10.42.0.21 -p 6379 get name # redis-cli -c -h 10.42.0.132 -p 6379 get name # redis-cli -c -h 10.42.0.200 -p 6379 get name # redis-cli -c -h 10.42.0.197 -p 6379 get name # redis-cli -c -h 10.42.0.34 -p 6379 get name

要點是Redis集群是獲取自動分片、複製和高可用性的首選方式。 在/etc/redis.conf文件的其餘部分中還有許多其他充分記錄的配置參數,您可以在官方文檔中找到更多信息:Redis集群教程和Redis集群規範。
這就是三部分Redis教程系列的結尾。 下面的反饋表單可用於發布問題或意見。
Source:
https://www.tecmint.com/setup-redis-cluster-in-centos-8/