redis集群玩法全过程笔记(redis7+版本)

目录标题

  • redis集群之是什么
  • redis集群之能干嘛
  • redis集群之槽位
  • redis集群之分片
  • redis集群之哈希取余分区算法
  • redis集群之一致性哈希算法
  • redis集群之哈希槽分区算法
  • redis集群之为什么哈希槽数是16384
  • redis集群之分片不保证一致性
  • redis集群之三主三从集群搭建
  • redis集群之集群读写
  • redis集群之容错切换
  • redis集群之扩容
  • redis集群之缩容
  • 点击直接资料领取

redis集群之是什么

概念与原理:
Redis集群提供了一种方式,通过分片(Sharding)将数据自动分布到多个Redis节点上,以提供高性能和数据分区。集群通过实现数据的自动分片,确保数据和负载在不同的节点间均衡分布,同时提供了故障转移和容错机制,增强了系统的可用性和可靠性。

工作方式:
Redis集群将所有数据分成16384个哈希槽(Hash Slots),每个节点负责一部分哈希槽。数据的存储位置由键的CRC16哈希值决定,该值被映射到16384个槽中的一个。通过这种方式,集群能够在节点间分布数据和请求负载。

redis集群之能干嘛

  1. 自动数据分片:

Redis集群通过将数据自动切分到多个节点上,实现数据分片。这种分片机制可以提升大规模数据处理的效率和速度。

  1. 高可用性与故障转移:

通过主从复制和自动故障转移机制,即使在某些节点发生故障的情况下,集群也能继续提供服务,保障了高可用性。

  1. 负载均衡:

由于数据和请求在多个节点间均匀分布,Redis集群可以有效地进行负载均衡,提高整体性能。

  1. 水平扩展:

Redis集群支持水平扩展,可以在不停机的情况下增加或减少节点数目,灵活适应不断变化的负载需求。

  1. 支持分区:

通过分区技术,集群允许数据跨越不同的节点,这有助于更好地利用网络和硬件资源。

  1. 支持大规模数据集:

由于数据分散存储在多个节点上,Redis集群能够处理远超单个节点限制的数据集,适用于大规模数据存储需求。

  1. 简化数据管理:

对于开发者来说,Redis集群提供了一种透明的方式来处理数据分布和复制,简化了数据管理的复杂性。

  1. 提高读写性能:

分布式架构允许并行处理多个操作,显著提高了读写数据的性能。

redis集群之槽位

原理与工作方式:

Redis集群使用16384个哈希槽(Hash Slots)来实现数据的分布式存储。
每个键通过哈希函数(如CRC16)映射到一个0到16383之间的数字,这个数字就是槽位。
集群中的每个节点负责一部分槽位,即每个节点存储部分哈希槽对应的键和值。
当增加或移除节点时,槽位可以在不同节点间迁移,实现动态的数据分布。
槽位的作用:

数据定位:通过键计算的槽位决定数据存储在哪个节点上,简化了数据查找过程。
负载均衡:通过分散槽位,集群在不同节点间均衡数据和负载。
故障转移:在主节点故障时,槽位的责任可以转移到从节点,保证数据可用性。
扩展与缩容:Redis集群支持动态地添加或移除节点,并相应地重新分配槽位。
槽位与集群操作:

扩容:添加节点时,部分槽位会从现有节点迁移到新节点。
缩容:移除节点时,该节点的槽位会被迁移到其他节点。
数据迁移:进行扩容或缩容时,数据会根据槽位重新在各节点间分配。

redis集群之分片

  1. 分片的概念:

在Redis集群中,分片是指将数据分散存储在不同的节点上。每个节点操作和存储一部分数据,这些数据由特定的哈希槽来管理。
2. 分片的实现方式:

Redis集群通过16384个哈希槽来实现分片。每个键根据其哈希值被映射到一个特定的槽位,而每个槽位又与特定的节点相关联。
3. 分片的好处:

性能提升:由于数据和请求在多个节点间分布,可以并行处理,大大提升了性能。
容量扩展:分片使得Redis集群能够存储超出单个节点内存限制的数据量。
高可用性:即使某个节点出现故障,由于数据被分散在多个节点,集群依然能够继续提供服务。
4. 分片与数据管理:

Redis集群通过自动数据分片简化了数据管理,用户无需关心数据如何在不同节点间分布。
5. 分片与读写操作:

当进行读写操作时,Redis客户端会根据键的哈希值确定对应的节点,然后直接与该节点通信。

redis集群之哈希取余分区算法

原理和工作方式:

基本概念:哈希取余分区算法是一种简单的数据分配方法,用于将数据均匀分布到多个节点。
运作机制:每个键通过哈希函数生成一个哈希值,然后对节点数量取余,得到的余数决定了键存储在哪个节点。
在Redis集群中的应用:

尽管Redis集群不直接使用哈希取余分区,但它提供了基本思想的参考。在Redis集群中,类似的概念是将16384个槽位分配给不同的节点。
优缺点:

优点:简单易实现,对于节点数量固定的情况下可以均匀分配数据。
缺点:当集群扩容或缩容时,哈希取余分区可能导致大量数据重新分配,因此Redis集群采用了更为复杂的哈希槽机制来优化这个问题。

redis集群之一致性哈希算法

概述:

一致性哈希算法是一种改进的哈希算法,用于在分布式系统中分配和管理数据。
工作原理:

在一致性哈希算法中,哈希空间被组织成一个虚拟的圆环。数据项(或节点)通过哈希函数映射到这个环上的某个点。
当需要查找数据时,根据数据的键计算哈希值,沿环顺时针查找到第一个节点,该节点即负责存储该数据。
在Redis中的应用:

虽然Redis集群本身不直接使用一致性哈希算法,但其原理对于理解Redis集群的哈希槽机制有一定的帮助。
优缺点:

优点:当集群中的节点增加或减少时,只有少量的数据需要迁移,这大大减少了重平衡时的数据迁移量。
缺点:相比简单的哈希取余算法,一致性哈希算法在计算和维护上更为复杂。

redis集群之哈希槽分区算法

原理和工作方式:

基本概念:在Redis集群中,数据分布是基于哈希槽的概念进行的。整个哈希空间被分成16384个槽(Hash Slot)。
数据分配:每个键通过CRC16算法计算得到的哈希值对16384取余,得到的结果决定了这个键归属于哪个槽。
Redis集群中的应用:

每个Redis集群节点负责一部分哈希槽。通过重新分配槽的所属,可以实现集群的扩容和缩容。
当一个键需要被访问时,Redis客户端首先计算这个键的哈希槽,然后直接与管理该槽的节点通信。
优点:

负载均衡:通过均匀分配哈希槽,Redis集群能够在多个节点间均衡数据。
高效扩容和缩容:改变哈希槽的所属节点可以动态地进行集群调整,而无需重新哈希所有键值。

redis集群之为什么哈希槽数是16384

选择原因:

平衡性和效率:16384个哈希槽是在平衡性和效率之间的一个折中。这个数字足够大,可以在多个节点间分散数据,减少了单个节点的负载,同时也足够小,每个节点可以方便地保存整个哈希槽映射的元数据。
技术考虑:

内存占用:较少的槽数可以减少每个节点所需维护的路由信息量,减少内存占用。
重分配效率:在节点加入或离开集群时,需要进行数据迁移。16384个槽位提供了足够的粒度,使得数据迁移更为高效。

redis集群之分片不保证一致性

核心概念:

分片(Sharding):Redis集群通过分片来分散数据存储压力。每个节点负责一部分数据。
一致性(Consistency):指数据在多个副本之间是否保持一致。
不保证一致性的原因:

异步复制:Redis集群使用异步复制来同步数据至从节点。这意味着在主节点和从节点间,数据更新可能存在短暂的不一致。
网络分区:在网络分区(网络中断或延迟)的情况下,主从节点之间可能会出现数据不一致的情况。
影响和考量:

在大多数场景下,Redis集群的这种行为是可以接受的,因为它提供了较高的性能和可用性。
但对于需要严格数据一致性的应用场景,这种设计可能会带来问题。

redis集群之三主三从集群搭建

每个节点需要一个Redis配置文件。例如,对于主节点,配置如下(假设节点端口从6379开始):

port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

使用Redis的redis-cli工具创建集群。假设有六个节点(三主三从),IP地址为192.168.1.x,端口从6379到6384

redis-cli --cluster create 192.168.1.1:6379 192.168.1.1:6380 192.168.1.1:6381 192.168.1.1:6382 192.168.1.1:6383 192.168.1.1:6384 --cluster-replicas 1

在Redis集群中,每个key通过哈希槽分配算法被映射到特定的节点。当使用redis-cli --cluster create命令创建集群时,Redis会自动平衡每个主节点上的哈希槽的分配。这意味着每个主节点会被分配一部分的哈希槽,从而管理特定范围内的keys。

因此,在集群模式下,尝试向特定节点写入一个key时,如果那个key的哈希槽没有被分配给该节点,Redis会返回一个错误,并指示应该写入哪个节点。客户端库通常会处理这种情况,自动重定向请求到正确的节点。这就是为什么在使用集群时,连接到任何一个节点的客户端都能获取整个集群的状态信息,并能根据需要将命令发送到正确的节点。

redis集群之集群读写

Redis集群支持读写分离。可以从任何主节点写入数据,从任何相关的从节点读取数据。

JedisCluster jedisCluster = new JedisCluster(new HostAndPort("192.168.1.1", 6379));
jedisCluster.set("key", "value"); // 写入操作

读取操作可以从从节点进行,以减轻主节点负担。

String value = jedisCluster.get("key"); // 读取操作

redis集群之容错切换

Redis集群的容错切换(Failover)是指当一个主节点宕机或失去响应时,集群会自动选举出一个新的主节点来替代宕机的主节点。这个过程是自动的,由Redis集群的选举算法处理。下面是容错切换的一般步骤和相关代码:

检测主节点失败:集群中的其他节点(包括主节点和从节点)会持续监控彼此的状态。当一个主节点无响应超过配置的阈值时(如无法Ping通),集群就会开始对该主节点进行故障切换。

选举新的主节点:原主节点的从节点中将进行选举,选出一个新的主节点。这通常是基于复制偏移量和运行ID等因素来决定的。

重配置从节点:一旦新的主节点被选举出来,原主节点的其他从节点将会自动重新配置,开始复制新的主节点。

更新集群状态:集群状态会被更新,所有的节点(包括客户端)都会被通知新的主节点信息。

相关的配置和命令:

redis.conf中的cluster-node-timeout参数可以设置故障检测的超时时间。

使用redis-cli可以查看集群的状态和节点信息:

redis-cli -c -h [主机IP] -p [端口号] cluster nodes

容错切换是自动进行的,但在某些情况下,你可能需要手动进行故障转移,可以使用以下命令:

redis-cli -c -h [主机IP] -p [端口号] cluster failover

redis集群之扩容

Redis集群扩容是指向现有的Redis集群中添加更多的节点(主节点或从节点),以提高集群的处理能力和容错能力。扩容过程包括添加新节点、将一些槽位迁移到新节点以及可能的从节点配置。下面是扩容的基本步骤:

添加新节点:首先,启动新的Redis实例作为集群的节点。

将新节点加入集群:使用 redis-cli --cluster add-node 命令将新节点添加到现有集群

redis-cli --cluster add-node [新节点的IP:端口] [任一现有节点的IP:端口]

迁移槽位:将一些槽位从现有的节点迁移到新节点。这可以使用 redis-cli --cluster reshard 命令完成。但是重新分配的槽位不一定是连续的。

redis-cli --cluster reshard 目标节点IP:端口 --cluster-from 源节点ID --cluster-to 目标节点ID --cluster-slots 槽数 --cluster-yes

添加从节点:如果需要,也可以为新的主节点添加从节点来提高容错能力。

更新客户端配置:确保所有使用集群的客户端知道新节点的加入。

redis集群之缩容

Redis集群缩容是指从现有的Redis集群中移除节点的过程。这通常发生在需要降低资源使用或者集群过度扩展时。缩容过程涉及到移除节点、迁移槽位以及更新集群配置。以下是缩容的基本步骤:

迁移槽位:首先需要从要移除的节点迁移走所有的槽位到其他节点。这可以使用 redis-cli --cluster reshard 命令来完成。

移除节点:一旦所有槽位都被迁移走,使用 redis-cli --cluster del-node 命令来从集群中移除节点。

处理从节点:如果移除的是主节点,确保它的从节点被重新分配或移除。

更新集群配置:确保所有使用集群的客户端更新了集群的配置。

点击直接资料领取

如果你在学习python或者Java哪怕是C遇到问题都可以来给我留言,因为在学习初期新手总会走很多弯路,这个时候如果没有有个人来帮一把的话很容易就放弃了。身边很多这样的例子许多人学着学着就转了专业换了方向,不仅是自身问题还是没有正确的学习。所以作为一个过来人我希望有问题给我留言,说不上是帮助就是顺手敲几行字的事情。

这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。

你可能感兴趣的:(redis,redis,笔记,数据库)