Redis Cluster的部署与维护

网友投稿 1093 2022-08-31

Redis Cluster的部署与维护

Redis Cluster的部署与维护

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

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

部署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中的所有数据清除掉。

1.2 启用Redis Cluster配置

1.2.1 修改Redis配置文件

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

配置文件修改说明:

①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)。

1.2.3 查看进程

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

1.3 部署Redis Cluster

1.3.1 创建集群命令帮助

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

命令说明:

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

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

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

④fix:用于修复集群;

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

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

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

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

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

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

1.3.2 创建集群

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

1.4 验证Redis Cluster信息

1.4.1 验证节点槽位信息

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

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

1.4.2 查看主从状态

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

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

1.4.3 检查集群状态

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

1.5 验证Redis Cluster写入key

1.5.1 通过节点写入

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

1.5.1.1 写入失败

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

1.5.1.2 对应节点写入

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

1.5.1.3 从节点查看数据

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

1.5.1.4 计算key对应槽位

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

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

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

1.5.2 以集群模式写入

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

1.5.3 脚本批量写入数据

1.5.3.1 Python脚本批量写入key

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

1.5.3.2 验证数据

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

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

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和端口,可使用现有集群中的任意一个节点进行添加。

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

2.1.3 重新分配槽位

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

2.1.4 验证信息

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

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

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

2.1.5 添加从节点

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

2.1.6 验证节点对应关系

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

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

2.2 动态删除节点

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

2.2.1 迁移槽位

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

2.2.2 删除节点

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

2.2.3 验证集群信息

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

2.3 主节点故障

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

2.3.1 从节点读写验证

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

2.3.2 主节点故障

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

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

2.3.3 验证集群信息

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

2.3.4 验证key写入

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

2.3.5 原主节点重回集群

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:prometheus学习笔记(1)
下一篇:Go语言指针详解,看这一篇文章就够了(go 指针运算)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~