如何在 CentOS 8 中设置 Redis 集群 - 第 3 部分
Redis Cluster是Redis 的内置功能,支持自动分片、复制和高可用性,之前使用Sentinels实现。它设计有两个主要目的:一是自动将数据集拆分到多个实例之间;二是在分区期间提供一定程度的可用性,以便在某些实例(尤其是主实例)发生故障或无法与集群中的大多数节点通信时继续操作。
但是,如果发生更大规模的故障(例如,当大多数主实例不可用时),集群将停止运行。此外,如果主实例和从实例同时发生故障,集群将无法继续正常运行(尽管解决方法是添加更多节点或在集群中创建不对称,以自动更改集群布局)。
根据Redis集群文档,按预期工作的“最小集群”需要包含至少 3 个主节点。但最适合高可用性的设置应该至少有 6 个节点,其中三个主节点和三个从节点,每个主节点都有一个从节点。
重要提示:Redis Cluster 也有一些限制,例如不支持NAT 的环境以及在Docker下重新映射 IP 地址或 TCP 端口的环境。此外,并非每个客户端库都支持它。
本文介绍如何在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客户端只能写入主节点,但可以从集群中的任何节点读取。
步骤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
然后将保护模式设置为no
允许来自集群上其他实例的连接。
protected-mode no
port 参数定义 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)
,后 3 个节点将被视为从节点 (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.集群创建成功后,在任何主机上运行以下命令(使用标志指定其 IP 地址-h
)以列出所有集群节点。
# 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.接下来,让我们停止其中一个主节点(例如10.42.0.197)上的 Redis 服务,并检查集群中的所有主节点。
# 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 'Example.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 教程系列。下面的反馈表可用于发布问题或评论。