Redis集群
Redis集群
一、Redis集群
Redis集群是一种使用分布式技术将数据分散存储在多个节点上的解决方案。它可以提供高可用性、扩展性和性能的优势。
Redis集群通过分片(Sharding)来存储数据。数据被平均分配到多个节点上,每个节点负责存储一部分数据。这样可以将负载分散到多个节点上,并提高整体的读写性能和存储容量。
在Redis集群中,存在以下几个关键的组件和概念:
1.节点(Node):
Redis集群由多个节点组成,每个节点都是一个独立运行的Redis实例。每个节点都有一个唯一的节点ID。
2.主节点(Master):
每个节点中的一个Redis实例被选举为主节点,负责处理写操作,并将数据同步到从节点。
3.从节点(Slave):
每个节点中的其他Redis实例作为从节点,只能进行读操作,并通过异步复制的方式从主节点获取数据更新。
4.握手(Handshake):
当一个Redis客户端连接到集群时,它会与集群进行握手,从而了解集群中所有的节点信息。
5.数据分片(Data Sharding):
集群将数据划分为多个槽位(Slots),默认有16384个槽位。每个节点被分配一部分槽位来存储数据。
6.槽位迁移(Slots Migration):
当节点加入或离开集群时,槽位的分配会发生变化,Redis集群会自动进行槽位迁移,将槽位重新分配给合适的节点。
7.故障转移(Failover):
当主节点发生故障时,Redis集群会自动进行故障转移,选举一个从节点作为新的主节点,确保系统的可用性。
Redis集群有几种模式
Redis集群分三种模式:主从模式、sentinel模式、Redis Cluster
三种方式详解:
https://www.cnblogs.com/coolops/p/12809893.html
1.主从复制模式:
在主从复制模式中,存在一个主节点(Master)和多个从节点(Slave)。主节点负责处理写操作,并将数据同步到从节点。从节点只能进行读操作,并通过异步复制的方式从主节点获取数据更新。这种模式可以提供一定程度的高可用性和读扩展性,但主节点故障时需要手动切换到一个从节点作为新的主节点。
- sentinel(哨兵)模式:
哨兵模式是一种基于主从复制的高可用解决方案,用于监控和管理Redis集群中的主节点的故障转移
在哨兵模式中,有一个或多个哨兵节点(Sentinel)实例运行在独立的进程上。哨兵节点负责监控Redis集群中的主节点和从节点,并在主节点故障时自动执行故障转移操作。
具体工作流程如下:
- 哨兵节点通过发送命令和接收响应来监控Redis节点的状态,包括主节点和从节点。
- 当主节点失效(无法访问)时,哨兵节点会通过投票机制选举一个从节点作为新的主节点。
- 选举出的新主节点会通知其他哨兵节点和Redis客户端更新主节点信息,并进行故障转移操作。
- 故障转移完成后,其他从节点会自动切换到新的主节点并重新执行复制操作。
哨兵模式提供以下优势:
- 高可用性:当主节点发生故障时,哨兵可以自动发现故障,并选择一个新的主节点来继续提供服务,从而实现快速的故障转移。
- 自动化管理:哨兵节点能够自动监控和管理Redis集群中的节点,包括故障检测、选举和故障转移等操作,减轻了管理员的负担。
- 配置管理:通过哨兵模式,可以动态管理Redis主节点的变更和配置更新,如添加新的从节点、删除节点或修改配置。
哨兵模式通常适用于中小规模的Redis部署,对主从切换和自动化故障转移有较为简单的需求。
- Redis Cluster模式:
Redis Cluster详细:
https://www.cnblogs.com/jian0110/p/14002555.html
Redis Cluster是Redis官方提供的原生分布式解决方案。在Redis Cluster模式中,数据被分散存储在多个节点上,每个节点都持有部分数据槽(Slots)。集群使用Gossip协议进行节点间的信息交换和数据迁移。Redis Cluster提供了自动化的故障转移、节点管理和数据重定向等功能,以实现高可用性和水平扩展。这种模式是推荐的分布式部署方式。
Redis Cluster特点
- 多主多从,去中心化:从节点作为备用,复制主节点,不做读写操作,不提供服务
- 不支持处理多个key:因为数据分散在多个节点,在数据量大高并发的情况下会影响性能;
- 支持动态扩容节点;
- 节点之间相互通信,相互选举,不再依赖sentinel:准确来说是主节点之间相互“监督”,保证及时故障转移
- 为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法
- 每个Redis集群理论上最多可以有16384个节点
主从复制模式和Redis Cluster模式的区别
1.相比较sentinel模式,多个master节点保证主要业务(比如master节点主要负责写)稳定性,不需要搭建多个sentinel实例监控一个master节点;
2.相比较一主多从的模式,不需要手动切换,具有自我故障检测,故障转移的特点;
3.相比较其他两个模式而言,对数据进行分片(sharding),不同节点存储的数据是不一样的;
4.从某种程度上来说,Sentinel模式主要针对高可用(HA),而Cluster模式是不仅针对大数据量,高并发,同时也支持HA。
- 主从复制模式适用于较小规模的部署和读写分离、负载均衡需求。Redis Cluster模式适用于大规模的分布式部署、高可用性和水平扩展需求
Redis Cluster中,节点之间的通信
在Redis Cluster中,节点之间通过建立 TCP 连接,使用 gossip 协议来传播集群的信息,节点内部通信端口是服务端口 + 10000
举个例子,启动 Redis 服务之后会有一个 6379 端口(对外端口)和一个 16379 端口(对内通信端口)
Gossip协议是一种去中心化的通信协议,它允许节点通过相互交换信息来达成共识。在Redis Cluster中,每个节点都会与其他节点进行定期的Gossip通信,以实现集群的管理和数据分片的均衡。
具体的通信流程如下:
- 每个节点都会维护一个关于集群状态的本地视图,其中包含有关其他节点的信息。
- 节点定期进行Gossip通信,将本地视图中的信息发送给其他节点,并接收其他节点的信息。
- 当节点接收到其他节点的信息时,它会将接收到的信息与本地视图进行比较,并根据一定的规则来更新本地视图。
- 更新后的本地视图会用于集群的管理操作,如故障检测、故障转移、数据迁移等。
通过Gossip协议,Redis Cluster中的节点可以相互了解彼此的状态,并进行动态的集群管理。当有新节点加入或节点出现故障时,节点会通过Gossip通信来传播和更新集群状态,从而实现节点的动态扩缩容和故障恢复。
Gossip协议的优势在于它的去中心化特性,使得节点之间的通信更为灵活和高效。每个节点都具备相同的角色,没有中心节点或集中式的决策机制,从而提高了系统的可伸缩性和容错性。
需要注意的是,Redis Cluster中的Gossip通信是基于TCP协议进行的,节点之间通过互相发现和建立TCP连接来实现通信。
Redis Cluster搭建:
1.准备工作:
下载redis对应版本(版本必需要3.0以上)
Windows安装Redis:
https://blog.csdn.net/weixin_44893902/article/details/123087435
Redis官网:
https://redis.io/
下载并安装Ruby语言环境
下载地址:https://rubyinstaller.org/downloads/
如果你的电脑是64位,选择x64下载;否则,32位选择x86下载。这里选择倒数第二个下载
下载完成后,打开文件,启动 Ruby 安装向导。
点击 Next,继续向导,记得勾选 Add Ruby executables to your PATH,直到 Ruby 安装程序完成 Ruby 安装为止。
(注意:安装路径必须是英文)
如果您的安装没有适当地配置环境变量,接下来您可能需要进行环境变量的配置,
下载ruby环境下Redis的驱动
在当前ruby目录下,打开cmd终端,输入gem install redis (下载的是最新版本)
路径:
执行结果:
下载Redis官方提供的创建Redis集群的ruby脚本文件redis-trib.rb
下载地址:https://redis.io/download/
(注意,要选择和自己安装的Redis版本一致)
查看版本号:
把redis-trib解压后找到src路径
把这个文件复制到集群文件夹下
将解压后的redis文件夹复制n份(n为集群节点数)到目标文件夹RedisCluster并将文件夹重命名
修改每个文件夹下的 redis.windows.conf
修改以下集群配置信息:(端口号可以一键替换)
- port 7000 —端口号
- cluster-enabled yes —避免在使用JedisCluster集群代码获取时报错
- cluster-config-file nodes-7000.conf —该节点的配置信息,服务启动后会在同目录下生成nodes-端口号.conf文件
- cluster-node-timeout 15000 —时间调整为15000,在创建集群时不会超时
- appendonly yes
- bind 后面是ip地址
(注意:这些前面的#要去掉,不能有多余的空格)
6.修改你的bind链接地址为本地ip:
编写每个Redis节点启动方式:
1.编写一个 bat 来启动 redis,在每个节点目录下建立 startup.bat,内容如下:
title redis_8081
redis-server.exe redis.windows.conf
(title是cmd窗口名 根据个人爱好输入.)
2.或者可以把Redis的每个节点升级为服务
用管理员打开命令提示符:
启动Redis服务:(没出现error就代表成功,必须在节点的文件夹路径下)
redis-server.exe --service-install redis.windows.conf --service-name redis7001
redis-server --service-start --service-name redis7001(没用过可以试试)
删除Redis服务:
redis-server.exe --service-uninstall --service-name redis7001
停止Redis服务:
redis-server --service-stop --service-name redis7001(没用过可以试试)
重启Redis服务:(没用过可以试试)
redis-server --service-rewrite-config --service-name redis7001
redis-server --service-stop --service-name redis7001
redis-server --service-start --service-name redis7001
启动每个节点双击每个节点下的 startup.bat,执行集群构建脚本或者启动每个redis服务
到目标文件夹RedisCluster中打开命令窗口(比如进入6379文件夹),输入以下指令:
ruby redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
上述命令 --replicas 1 表示每个主节点拥有从节点个数为1。
master节点(主节点)不能少于3个,所以我们用了6个redis(3主+3从)
中途有个地方需要手动输入yes即可
扩展:
检查节点状态:
在节点路径下cmd
redis-cli.exe -h 10.31.56.9 -p 7001
查看节点集群信息:
CLUSTER NODES
清空当前节点集群信息:
FLUSHALL
Redis面试:
https://zhuanlan.zhihu.com/p/568969982
Redis在项目中的应用:
1,下载NuGet包:
2,建Redis帮助类: