无论是Redis主从复制,还是在主从复制基础上部署的哨兵,虽然做到了数据的远程备份,并且哨兵还能做到原主节点失败后的新主节点自动转移,但都无法解决Redis单机性能瓶颈问题。

    为了解决Redis单机性能瓶颈问题,提高Redis的性能,可以采用分布式集群的解决方案,即Redis Cluster。

  1. 部署Redis Cluster

1.1 准备事项

    笔者共准备了8台主机,其中6台用于Redis Cluster的部署,IP分别为10.0.0.{8,18,28,38,48,58},分别取名node1-6,均通过脚本安装6.2.2版本Redis,脚本内容见上一篇。

    如果是拿现有的Redis主机来创建集群,必须先将Redis中的所有数据清除掉。

Redis Cluster的部署与维护_redis

1.2 启用Redis Cluster配置

1.2.1 修改Redis配置文件

    每个节点均修改Redis配置文件,必须开启cluster功能,启用Redis Cluster的必要配置项如下:

Redis Cluster的部署与维护_集群_02

    配置文件修改说明:

    ①masterauth:建议配置,否则后期的master和slave主从复制无法实现;

    ②cluster-enabled:默认关闭,需取消注释开启cluster功能,开启后查看Redis进程会显示cluster标识;

    ③cluster-config-file:取消注释,该文件为Redis集群状态文件,记录主从关系及slot范围信息,由Redis Cluster自动创建和维护;

    ④cluster-require-full-coverage:默认为yes,建议改为no,避免某一个节点不可用而导致整个集群不可用。

1.2.2 查看端口

    重启各节点Redis服务,查看端口,多出了Redis Cluster的16379端口(Redis Cluster端口号=Redis服务端口号+10000)

Redis Cluster的部署与维护_cluster_03

1.2.3 查看进程

    查看Redis服务进程,会在进程末尾标识cluster。

Redis Cluster的部署与维护_cluster_04

1.3 部署Redis Cluster

1.3.1 创建集群命令帮助

    执行redis-cli --cluster help命令可以查看创建集群的相关命令帮助。

Redis Cluster的部署与维护_redis_05

    命令说明:

    ①create:用于创建集群,需要指定节点的IP和端口号,添加单个节点时需要手动分配槽位和对应从节点,同时添加多个节点时可加上--cluster-replicas指定每个主节点的从节点数量,自动进行槽位分配;

    ②check:用于检查集群信息;

    ③info:用于查看集群节点信息;

    ④fix:用于修复集群;

    ⑤reshard:用于在线热迁移集群时指定节点的槽位数据;

    ⑥rebalance:用于平衡集群中各节点的槽位数量;

    ⑦add-node:用于添加节点至集群中;

    ⑧del-node:用于从集群中删除节点;

    ⑨call:用于在集群中的所有节点执行命令;

    ⑩import:导入外部Redis服务器的数据至集群中。

1.3.2 创建集群

    根据Redis集群创建命令的相关说明,笔者使用准备好的6个节点创建集群,每个主节点跟上一个从节点(只需在一个节点执行命令)

Redis Cluster的部署与维护_集群_06

Redis Cluster的部署与维护_数据_07

1.4 验证Redis Cluster信息

1.4.1 验证节点槽位信息

    利用--cluster参数使用模式,配合info选项可以通过任意一个节点查看集群节点信息。

Redis Cluster的部署与维护_redis_08

    或者使用check选项,可以通过任意一个节点检查节点槽位信息是否正常,里面也包含了各节点的信息,如果某一个出现故障,将会给出提示信息。

Redis Cluster的部署与维护_cluster_09

1.4.2 查看主从状态

    根据创建集群时的提示,或者在任意一个节点查看集群节点对应关系,可以知道3个主节点按序对应的从节点分别为node5、node6和node4。

Redis Cluster的部署与维护_cluster_10

    在3个从节点上查看主从状态,是与集群自动分配的信息相匹配的。

Redis Cluster的部署与维护_cluster_11

Redis Cluster的部署与维护_高可用_12

Redis Cluster的部署与维护_集群_13

1.4.3 检查集群状态

    通过任意一个节点登录Redis,执行cluster info命令可以检查当前Redis Cluster集群的状态是否正常。

Redis Cluster的部署与维护_redis_14

1.5 验证Redis Cluster写入key

1.5.1 通过节点写入

    由于Redis Cluster中的key写入前需要通过运算决定由哪个节点写入,这就导致如果我们直接通过某一个主节点进行写操作时,可能会写不进去。

1.5.1.1 写入失败

    例如笔者想要在node1这个主节点上写入name1这个key,但是会报错,提示要转到node3上才能写入编号为12933的槽位中。

Redis Cluster的部署与维护_cluster_15

1.5.1.2 对应节点写入

    转到node3,即可完成name1这个key的写入。

Redis Cluster的部署与维护_cluster_16

1.5.1.3 从节点查看数据

    node4虽然是node3的从节点,但在Redis Cluster中,从节点只能查看数据库中有多少个key,以及key的名称,无法查看对应的value值。

Redis Cluster的部署与维护_cluster_17

1.5.1.4 计算key对应槽位

    登录任意一个节点,执行cluster keyslot + keyname命令可以查看指定key所对应的槽位。

    例如以上在node3写入的key提示的槽位号为12933,使用该命令查看时,确实显示的是12933。

Redis Cluster的部署与维护_redis_18

    以查看name2这个key对应的槽位为例,显示的是编号为742的槽位,查看节点是在node1上,登录node1可以写入name2这个key。

Redis Cluster的部署与维护_高可用_19

1.5.2 以集群模式写入

    以上通过节点写入key可能会出现无法写入的情况,因此我们可以使用-c选项开启集群模式进行写入。

Redis Cluster的部署与维护_高可用_20

1.5.3 脚本批量写入数据

1.5.3.1 Python脚本批量写入key

    创建一个python脚本,批量写入3万个key。

Redis Cluster的部署与维护_数据_21

Redis Cluster的部署与维护_cluster_22

Redis Cluster的部署与维护_高可用_23

1.5.3.2 验证数据

    3个主节点查看数据库的数据量时,均在10000个数据左右,相差不是很明显,并且能在任意一个节点以集群模式查看到key所对应的value值。

Redis Cluster的部署与维护_集群_24

Redis Cluster的部署与维护_高可用_25

Redis Cluster的部署与维护_高可用_26

Redis Cluster的部署与维护_redis_27

    以集群模式查看节点信息时,可以看到每个节点的key数量和使用的槽位数,以及每个槽位的平均key值。

Redis Cluster的部署与维护_redis_28


  1. Redis Cluster集群节点维护

    当Redis Cluster运行很长时间后,可能会因为硬件故障等原因对已有集群进行调整,如增加节点、删除节点和节点迁移等。

2.1 动态添加节点

    增加Redis Cluster节点时,需要新添加的节点与原节点Redis版本相同、配置文件一致。

2.1.1 主机准备

    笔者另增加两台相同配置的Redis服务器,IP分别为10.0.0.68和10.0.0.78,分别取名node7和node8。

2.1.2 添加节点至集群

    添加节点至集群需要用到add-node选项指定新添加的节点IP和端口,可使用现有集群中的任意一个节点进行添加。

Redis Cluster的部署与维护_cluster_29

    默认添加的节点是主节点角色,但是不会分配槽位,需要重新分配。

Redis Cluster的部署与维护_数据_30

2.1.3 重新分配槽位

    重新分配槽位要用到reshard选项,分配槽位时需指定分配的槽位数、获得槽位的节点ID、从哪个节点获得槽位,服务器计算好将要划分过来的槽位后,需要输入yes进行确认。

Redis Cluster的部署与维护_cluster_31

Redis Cluster的部署与维护_集群_32

Redis Cluster的部署与维护_redis_33

2.1.4 验证信息

    分配槽位完毕,可以看到node7已获得了分配槽位中的数据(早期版本可能不支持已写入数据的槽位划分)

Redis Cluster的部署与维护_集群_34

    查看节点信息时,node7在主节点中,并且有划分的4096个槽位,槽位中也带有key。

Redis Cluster的部署与维护_数据_35

    查看集群状态时,当前已经有7个节点、4个集群。

Redis Cluster的部署与维护_集群_36

2.1.5 添加从节点

    添加从节点时也是使用add-node选项,但是要加上--cluster-slave指定是从节点角色,并且要加上--cluster-master-id指定主节点的ID。

Redis Cluster的部署与维护_数据_37

2.1.6 验证节点对应关系

    查看集群节点对应关系时,可以看到node8所对应的主节点ID与node7节点ID一致,说是node8已变成了node7的从节点。

Redis Cluster的部署与维护_高可用_38

    登录node7或node8查看主从复制信息时,也能看到建立主从复制关系。

Redis Cluster的部署与维护_集群_39

2.2 动态删除节点

    删除节点时分删除主节点还是从节点,如果是从节点,可以直接进行删除;如果是主节点,需要先将要删除节点上的槽位迁移到其他节点才能进行删除。

2.2.1 迁移槽位

    以从Redis Cluster删除node3这个主节点为例,在删除节点之前,先要迁移槽位。

Redis Cluster的部署与维护_集群_40

Redis Cluster的部署与维护_redis_41

Redis Cluster的部署与维护_集群_42

2.2.2 删除节点

    删除节点时需使用del-node选项,并要指定删除节点的ID,笔者就直接删除掉node4(node3的从节点)和node3这两个节点。

Redis Cluster的部署与维护_高可用_43

2.2.3 验证集群信息

    检查当前Redis Cluster集群节点信息时,可以看到只剩下6个节点,node3和node4两个节点已经成功从集群中被删除掉。

Redis Cluster的部署与维护_数据_44

2.3 主节点故障

    当前Redis Cluster集群中,主节点分别为node1、node2和node7,对应的从节点分别为node5、node6和node8。

2.3.1 从节点读写验证

    笔者预期是停止node2这一主节点的Redis服务,模拟主节点出现故障情况,在主节点正常时,从节点node6是无法进行读写操作的。

Redis Cluster的部署与维护_集群_45

2.3.2 主节点故障

    停止node2的Redis服务,模拟主节点故障。

Redis Cluster的部署与维护_数据_46

    node6查看Redis服务日志,可以看到在等待一段时间后进行了故障转移,并且宣称自己成为了新的master。

Redis Cluster的部署与维护_集群_47

2.3.3 验证集群信息

    查看当前集群信息时,可以看到node6已经获得了node2的槽位和数据。

Redis Cluster的部署与维护_高可用_48

2.3.4 验证key写入

    node2正常时,node6无法查看name4这个key对应的value值,也无法进行修改等写操作,此时已经能够以master角色进行读写操作。

Redis Cluster的部署与维护_redis_49

2.3.5 原主节点重回集群

    重启node2的Redis服务模拟服务器故障处理完毕重回集群。

Redis Cluster的部署与维护_redis_50

    查看集群节点信息时,node2会自动加入到集群中来,并且成为node6的从节点。

Redis Cluster的部署与维护_cluster_51