Redis Cluster的部署与维护
Posted JohnnyFang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的从节点。
以上是关于Redis Cluster的部署与维护的主要内容,如果未能解决你的问题,请参考以下文章