一 redis cluster 相关定义
1, redis cluster 是什么
redis 集群是 redis 群集三种模式之一。
redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,本文会讲解一下三种模式的工作方式,以及如何搭建cluster群集
●主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。
缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
●哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复。
缺陷:写操作无法负载均衡;存储能力受到单机的限制;哨兵无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。
●集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
2,redis 集群的组成
集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。
3,集群的作用
(1)数据分区:数据分区(或称数据分片)是集群最核心的功能。
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
(2)高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。
4,集群架构图
二 Redis集群的数据分片
1,哈希槽是什么
Redis集群引入了哈希槽的概念
Redis集群有16384个哈希槽(编号0-16383)
集群的每个节点负责一部分哈希槽
每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
2,哈希槽如何排布
#以3个节点组成的集群为例:
节点A包含0到5460号哈希槽
节点B包含5461到10922号哈希槽
节点C包含10923到16383号哈希槽
3,Redis集群的主从复制模型
集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。
为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1都失败后,集群将不可用。
4,哈希槽架构图
三 实验模拟redis 集群
1,实验环境
redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分:3个主节点端口号:6001/6002/6003,对应的从节点端口号:6004/6005/6006。
2,清理实验环境
关闭防火墙 和redis
3, 模拟6个redis
首先在 /etc/redis/redis-cluster/ 创建6个对应的文件夹
将redis 的配置文件 和启动文件分别拷贝到这6个文件夹
(此处为for循环 )
拷贝redis 启动文件
4 ,修改6个 节点的配置文件
代码如下:
#开启群集功能: #其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。 cd /etc/redis/redis-cluster/redis6001 vim redis.conf #bind 127.0.0.1 #69行,注释掉bind 项,默认监听所有网卡 protected-mode no #88行,修改,关闭保护模式 port 6001 #92行,修改,redis监听端口, daemonize yes #136行,开启守护进程,以独立进程启动 cluster-enabled yes #832行,取消注释,开启群集功能 cluster-config-file nodes-6001.conf #840行,取消注释,群集名称文件设置 cluster-node-timeout 15000 #846行,取消注释群集超时时间设置 appendonly yes #700行,修改,开启AOF持久化
tips:为了方便可以改好6001的配置文件再贴到其他5个下面
再改92行 和 840行
5,分别启动所有的redis
查看是否启动
6,启动redis 集群
代码如下;
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
解释:
#六个实例分为三组,每组一主一从,前面的做主节点,后面的做从节点。下面交互的时候 需要输入 yes 才可以创建。
--replicas 1 表示每个主节点有1个从节点。
7 , 查看集群
cluster slots 首先查看主从 及哈希槽
可以得知 6001主 从为 6005
6002主 从为6006
6003主 从为 6004
8 , 测试集群
如下图 输入-c 你可以理解为对这个集群的操作
会根据算法 将这个ceshi 键放到6003 机器上
查看6003 的 从 6004 可以看到该键 其他主机看不到
9,重点理解集群 redis 在集群模式下 redis-cli -p 6001 -c 新增键 不会报错 但是 redis-cli -p 6001 新增键会报错
如图所示 不加-c 会报错 因为
在Redis集群模式下,分别使用以下两种方式执行新增键的操作:
- 使用
redis-cli -p 6001 -c
:
-p 6001
指定连接到集群中监听6001端口的某个节点。-c
参数表示客户端应以集群模式工作,能够理解并自动处理Redis集群返回的“MOVED”重定向响应。
- 当您尝试新增一个键时,如果该键应归属于当前连接节点,或者
redis-cli
能够根据“MOVED”响应成功找到并重定向到正确的节点执行命令,那么操作不会报错。这是因为redis-cli
在这种模式下具备处理集群内部键迁移和分布的能力。 - 使用
redis-cli -p 6001
:
- 同样使用
-p 6001
指定连接到集群中监听6001端口的节点,但没有提供-c
参数。
- 在这种情况下,
redis-cli
认为它正在与单个独立的Redis实例交互,而不是一个集群。当您尝试新增一个键时,如果该键实际应由集群中的其他节点处理(即不属于当前连接节点负责的槽位),Redis集群会返回一个“MOVED”错误,指示您应该将命令发送到正确的节点。由于缺少-c
参数,redis-cli
无法自动处理这个重定向响应,而是将“MOVED”错误直接显示给您,导致操作报错。
总结来说,使用 redis-cli -p 6001 -c
连接Redis集群并新增键通常不会报错,因为它能够应对键可能分布在不同节点的情况,自动处理重定向。而使用 redis-cli -p 6001
(无 -c
参数)连接时,由于客户端不具备集群模式的支持,遇到需要重定向的情况会直接报告错误,无法完成新增键的操作。因此,在与Redis集群交互时,尤其是在进行写入操作时,务必使用 -c
参数以确保命令能够正确执行。
四 总结
1,redis 主从复制
redis主从复制是一种同步机制,
主服务器数据的修改会实时同步到从服务器上,实现数据备份和读写分离
2, 哨兵
1)监控
2)通知
3)自动故障转移
4)配置提供服务(客户端做为验证)
redis 哨兵是一个用于管理多个redis 服务器的系统它提供监控 通知自动故障转移和配置服务,来实现redis高可用性。
3,redis cluster
1)数据分片
2)故障转移
3)高性能
4)高可用
redis集群是一个提供 高性能 高可用 数据分片 故障转移 特性的
分布式数据库模式