【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)

对原理感兴趣的同学可以先看这篇

【Redis】高可用之三:集群(cluster)_AQin1012的博客-CSDN博客官网地址由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展。每个数据集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。Redis集群可以支持多个Master,从哨兵到集群。https://blog.csdn.net/aqin1012/article/details/131812658?spm=1001.2014.3001.5502其他Redis相关内容欢迎移步 

【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型,各个文章总有些小不同,我们这里讨论的是Redis 7.0,为确保准确,我们直接看官网。https://blog.csdn.net/aqin1012/article/details/130365083

【Redis】持久化机制详解:从RDB到AOF,你需要知道的一切_AQin1012的博客-CSDN博客持久化其实就4个单词:加强数据安全Redis支持两种不同的持久化机制,RDB和AOF。https://blog.csdn.net/aqin1012/article/details/130481261

【Redis】不卡壳的 Redis 学习之路:事务_AQin1012的博客-CSDN博客数据库中的事务是指在一次与数据库连接的会话中,所有的SQL语句,要么都成功,要么都失败。在Redis中,事务是指可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会被序列化,按顺序地串行执行而不会被其他命令插入开启:以MULTI开始一个事务入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面执行:由EXEC命令触发事务。https://blog.csdn.net/aqin1012/article/details/131474273?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131474273%22%2C%22source%22%3A%22aqin1012%22%7D

【Redis】高可用之一:复制(replica)_AQin1012的博客-CSDN博客官网地址: https://redis.io/docs/management/replication/其实就是主从复制,master以写为主,slave以读为主当master数据变化的时候,自动将新的数据异步同步到其它slave数据库主机(master)能读能写,从机(slave)只能读无论主机已经写了多少数据,从机一旦启动,就会全部复制过来,后续主机写,从机跟配置文件命令配置使用配置文件进行主从配置时,如果主机挂了,从机不会变化,还可以提供读的功能,等待主机恢复(重启后主从关系仍在)https://blog.csdn.net/aqin1012/article/details/131531792?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22131531792%22%2C%22source%22%3A%22aqin1012%22%7D

【Redis】高可用之二:哨兵(sentinel)_AQin1012的博客-CSDN博客哨兵会巡查监控后台master主机,查看是否存在故障,如果故障了,就会根据投票数自动将某一个从库转换为新主库,继续对外服务(解决复制的痛点)官方网址简单来讲,哨兵就是一种无人值守的运维机制3个哨兵自动监控和维护集群,不存放数据,只是“吹哨人”1主2从用于数据读取和存放主机宕机,从机数据还在会从剩下的两台主机中选出新的主机如果宕机的主机恢复,不会出现主机冲突,恢复的主机将变为新主机的从机。https://blog.csdn.net/aqin1012/article/details/131595489本文目录

准备工作

在本地启动6个Redis

构建集群关系

3主3从Redis集群读写

主从容错切换

相关测试

宕机后的主机恢复后是否会重新变成主机?

主从扩容

新增主机

加入集群

重新分配槽号(Reshard)

为新增的主机添加从机

报错处理 [ERR] Not all 16384 slots are covered by nodes.

原因

解决办法

主从缩容

清空要移除主机的槽号

删除该节点

集群的相关问题

批处理命令

浅谈CRC16

集群常用命令

cluster-require-full-coverage

cluster countkeysinslot 槽位编号

cluster keyslot 键名


本案例源自Redis官网,有兴趣的朋友可以直接访问

https://redis.io/docs/management/scaling/#create-a-redis-clusterhttps://redis.io/docs/management/scaling/#create-a-redis-cluster

准备工作

在本地启动6个Redis

直接在本地的6个端口启动6个redis

1. 先创建6个文件夹,分别存放不同端口的配置文件

mkdir cluster-test
cd cluster-test
mkdir 7001 7002 7003 7004 7005 7006

2. 每个文件夹中新建redis.conf文件,内容如下

port 端口号
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

3. 在每个端口号目录下执行如下命令,依次启动

redis-server ./redis.conf

然后我们就得到了“6台redis”

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第1张图片

构建集群关系

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第2张图片

输入“yes”然后回车

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第3张图片

出现[OK] All 16384 slots covered.这一行就是成功了( ̄∇ ̄)

我们以7001端口为例子,查看下新生成的文件

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第4张图片

执行redis-cli -p 7001进入客户端并通过info replication查看集群信息

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第5张图片

可以看到7001是台master,它的slave是7003,我们再进入7003的客户端进行查看

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第6张图片

通过cluster nodes查看集群关系

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第7张图片

通过cluster info查看集群信息

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第8张图片

3主3从Redis集群读写

按照以往方式启动Redis,直接进行写可能会报错=。=,因为根据k6计算出的槽位号不在7001而在7002,因此,一定要路由到位

即在启动时加-c参数

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第9张图片

可以看到此时就可以插入成功了~~

当添加了-c以后,整个集群对外界而言就是一个大的Redis,内部会自动进行重定向。

主从容错切换

我们模拟7001宕机

shutdown 7001

变成了3主2从(7001 宕机了(fail))

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第10张图片

7003从slave变成了master

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第11张图片

相关测试

宕机后的主机恢复后是否会重新变成主机?

不会

我们重启7001

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第12张图片

通过cluster nodes查看集群关系

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第13张图片

因此,宕机后的主机恢复后不会重新变成主机。

如果还希望原先的主机还做主机,可以使用cluster failover做集群的节点调整

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第14张图片

查看集群状态会发现7001恢复成了主机

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第15张图片

主从扩容

这里我们演示一个从3主3从 -> 4主4从的扩容案例,大致步骤如下:

  • 新增一台主机到集群
  • 为主机分配槽号(Reshared)
  • 将从机挂到新增的主机上

新增主机

新增并启动7007和7008两台主机(与上面六台一样)

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第16张图片

加入集群

新增的节点作为Master加入原有集群

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第17张图片

检查集群情况

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第18张图片

可以看到7007暂时没被分配槽号。

重新分配槽号(Reshard)

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第19张图片

4096=16384/4(现在是4个主机来分这16384个槽位)

ID就是新加入的主机ID(上图黄的)

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第20张图片

all表示全部接收

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第21张图片

yes确认

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第22张图片

等待⌛️执行完毕即可~

查看下重新分配后的结果

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第23张图片

上图可以看到,已经为新增的Master分配了4096个槽位~而且还可以看出,这4096个槽位是原先的每个Master节点分别分了1364个槽位给新的Master节点7007,而不是完全重新分配。

为新增的主机添加从机

具体示例如下图:

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第24张图片

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第25张图片

出现上图就说明添加成功了,我们可以查看下

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第26张图片

报错处理 [ERR] Not all 16384 slots are covered by nodes.

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第27张图片

原因

一般是由于之前移除master操作时,并没有同时移除node上面的slot,从而导致了slot总数没有达到16384,其实也就是slots分布不正确。所以在删除节点的时候一定要注意删除的是否是Master主节点。

解决办法

使用如下命令来修复集群

修复完成后再用check命令检查下是否正确

如果分布不均匀那可以使用下面的方式重新分配slot

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第28张图片

感谢 @qingbo292

https://blog.csdn.net/qingbo_2920249511/article/details/121949083

主从缩容

这个示例我们就把刚才费老大劲儿添加进来的7007和7008再移除(˶‾᷄ ⁻̫ ‾᷅˵)

清空要移除主机的槽号

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第29张图片

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第30张图片

后面输入yes回车

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第31张图片

等待结束,查看信息可以发现7007的槽位已经是0了

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第32张图片

删除该节点

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第33张图片

等待删除结束即可

集群的相关问题

批处理命令

由于有时候批量插入的数据不在一个槽位,因此不能使用m开头的命令(不在同一个slot槽位下的多键操作支持不好)

比如:mget、mset

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第34张图片

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第35张图片

所以有了通识占位符{},{}定义同一个组的概念,使key中{}内相同内容的键值对放到一个slot槽位去,即下面的k1、k2、k3都映射为x,放在一个槽位上。

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第36张图片

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第37张图片

浅谈CRC16

Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽(集群的每一个节点负责一部分hash槽),这个方法是C语言写的,这个系列后面的文章我们会对这个方法进行详细分析(敬请期待( ̄∇ ̄)/)。

集群常用命令

cluster-require-full-coverage

默认YES,现在集群架构是3主3从的redis cluster由3个master平分16384个slot,每个masterf的小集群负责1/3的slot,对应一部分数据。

cluster-require-full-coverage:默认值yes,即需要集群完整性,方可对外提供服务通常情况,如果这3个小集群中,任何一个(1主1从)挂了,这个集群对外可提供的数据只有2/3了,整个集群是不完整的Rerdis默认在这种情况下,是不会对外提供服务的。如果希望集群不完整的话也需要对外提供服务,需要将该参数设置为no,这样的话即便有一个小集群挂了,其他的小集群仍然可以对外提供服务。

cluster countkeysinslot 槽位编号

  • 1 表示该槽位被占用
  • 0 表示该槽位未占用

【保姆级】Redis集群(cluster)本地案例手把手操作指南(含常见问题以及处理方式)_第38张图片

上图可以看到插入前后0->1的变化

cluster keyslot 键名

表示该键应该存放在哪个槽位上

你可能感兴趣的:(Redis,redis,集群,高可用,cluster)