网站搜索

如何在 CentOS 8 中设置 Redis 集群 - 第 3 部分


Redis Cluster是一个内置的Redis功能,支持自动分片、复制和高可用性,以前是使用Sentinels实现的。它的设计有两个主要目的:一是在多个实例之间自动分割数据集,二是在分区期间提供一定程度的可用性,以便在某些实例(尤其是主实例)发生故障或无法与大多数实例通信时继续操作。集群中的节点。

但是,如果发生较大故障(例如,当大多数主实例不可用时),集群将停止运行。此外,如果主服务器和从服务器同时发生故障,集群将无法继续正常运行(尽管解决方法是添加更多节点或在集群中创建不对称性,以自动更改集群布局)。

根据Redis集群文档,按预期工作的“最小集群”需要包含至少3个主节点。但最适合高可用性的设置应该至少有 6 个节点,其中三个主设备和三个从设备,每个主设备有一个从设备。

重要:Redis Cluster 也有一些限制,缺乏对 NATted 环境以及重新映射 IP 地址或 TCP 端口的环境的支持Docker 下的实例。此外,并非每个客户端库都支持它。

本文介绍如何在 CentOS 8 中设置 Redis 集群(禁用集群模式)。它包括如何安装Redis、配置集群节点、创建集群以及测试集群故障转移。

注意:在本指南中,我们将使用新/空的 Redis 实例来运行集群模式。集群模式不适用于我们的 Redis 系列前两篇指南中完成的某些配置,特别是在使用参数副本时它不起作用。

先决条件:

  1. 安装了 CentOS 8 的服务器

测试环境设置

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 个只读副本节点,每个主节点有一个副本,因此三个分片包含每个节点中集群的所有数据。应用程序APICLI客户端只能写入主节点,但可以从集群中的任何节点读取。

步骤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. 接下来,在所有实例上打开端口 639716379。后面的端口用于集群总线(使用二进制协议的节点到节点通信通道)。这是Redis集群TCP连接的基本要求。

firewall-cmd --zone=public --permanent --add-port=6379/tcp 
firewall-cmd --zone=public --permanent --add-port=16379/tcp 
firewall-cmd --reload

第三步:创建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. 接下来,让我们停止其中一个主节点(例如 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服务并检查集群中的所有master。

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 教程系列到此结束。下面的反馈表可用于发布问题或意见。