Redis集群是一个内置的Redis功能,支持自动分片、复制和高可用性,之前使用Sentinels来实现。它设计有两个主要目的:一是自动将数据集分配到多个实例中,二是在分区期间提供一定程度的可用性,以在某些实例(特别是主节点)失败或无法与集群中大多数节点通信时继续操作。
但是,在发生较大故障时(例如,当大多数主实例不可用时),集群停止运行。另外,如果主从同时失败,集群将无法继续正常运行(尽管解决方法是添加更多节点或在集群中创建不对称性,以自动更改集群布局)。
根据Redis集群文档,能够正常工作的“最小集群”至少需要包含3个主节点。但是,最适合高可用性的设置应该至少有6个节点,其中包括三个主节点和三个从节点,每个主节点都有一个从节点。
重要提示:Redis集群还存在一些限制,其中包括不支持NAT环境以及那些其中IP地址或TCP端口被重新映射的环境,例如在Docker中。此外,并非每个客户端库都支持Redis集群。
本文介绍了如何在CentOS 8中设置Redis集群(禁用集群模式)。包括如何安装Redis,配置集群节点,创建集群以及测试集群故障转移。
注意:对于本指南,我们将使用新的/空的Redis实例来运行集群模式。如果使用了我们Redis系列前两篇指南中的某些配置,集群模式将无法工作,特别是当使用参数的副本时。
先决条件:
测试环境设置
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客户端只能向主节点写入数据,但可以从集群中的任何节点读取数据。
第一步:在所有节点上安装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)。该文件创建在工作目录中(默认为使用dir参数定义的/var/lib/redis)并且不可编辑。
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/