likes
comments
collection
share

三种Redis集群方案

作者站长头像
站长
· 阅读数 3

三种Redis集群方案

一、Redis replication

三种Redis集群方案

Redis replication是一种主从复制方案,它可以让从节点成为主节点的精确副本,从而实现数据的备份和读写分离。 Redis replication支持异步复制和同步复制,前者性能更高,后者数据一致性更强。Redis replication适合用于数据安全和读取负载均衡的场景,但是它也不能解决单点容量和性能的问题,同样因为所有的写操作都只能在一个主节点上执行。Redis replication本身是不支持自动切换的。Redis Replication 在故障转移时需要手动或借助其他自动化工具进行切换。

At the base of Redis replication (excluding the high availability features provided as an additional layer by Redis Cluster or Redis Sentinel) there is a leader follower (master-replica) replication that is simple to use and configure. It allows replica Redis instances to be exact copies of master instances. The replica will automatically reconnect to the master every time the link breaks, and will attempt to be an exact copy of it regardless of what happens to the master.

可以看到官方对replication的描述主要在它的主从复制能力上,高可用能力是需要类似Redis Cluster or Redis Sentinel这种附加层来提供。

二、Redis Sentinel(首选)

三种Redis集群方案

Redis Sentinel是一种高可用性方案,它可以监控Redis主从复制的状态,当主节点故障时,自动从从节点中选举一个新的主节点,并通知客户端新的主节点地址。Redis Sentinel适合用于读写分离的场景,但是它不能解决单点容量和性能的问题,因为所有的写操作都只能在一个主节点上执行。

功能列表:

  • 监控。Sentinel 不断检查您的主实例和副本实例是否按预期工作。
  • 通知。Sentinel 可以通过 API 通知系统管理员或其他计算机程序,受监控的 Redis 实例之一出现问题。
  • 自动故障转移。如果主服务器未按预期工作,Sentinel 可以启动故障转移过程,其中副本将提升为主服务器,其他附加副本将重新配置为使用新的主服务器,并通知使用 Redis 服务器的应用程序要使用的新地址连接时。
  • 配置提供者。Sentinel 充当客户端服务发现的权威来源:客户端连接到 Sentinel 以询问负责给定服务的当前 Redis 主节点的地址。如果发生故障转移,Sentinels 将报告新地址。

三、Redis Cluster(机器多的选)

三种Redis集群方案

Redis Cluster是一种分布式方案,它可以将数据分片存储在多个Redis节点上,每个节点都有自己的主从复制,从而实现数据的分布、复制和高可用性。Redis Cluster支持自动故障转移和重新分片,当某个节点故障时,它的从节点会接替它的角色,并重新分配数据。Redis Cluster适合用于大规模数据和高并发的场景,它可以解决单点容量和性能的问题,因为写操作可以在多个主节点上并行执行。在Redis Cluster中,为了确保高可用性和分布式数据存储,至少需要三个Redis节点。这是因为Redis Cluster使用分布式一致性算法,称为哈希槽分区(hash slot partitioning),将数据划分为16384个槽。

Redis Cluster的主要组成部分和工作原理:

  • Redis Cluster由多个主节点和从节点组成,每个节点负责处理一部分的槽位(slot),槽位的总数为16384个。
  • 每个主节点至少有一个从节点,从节点会复制主节点的数据,当主节点发生故障时,从节点会自动接替主节点的角色和槽位。
  • 客户端通过CRC16算法计算出key对应的槽位,然后根据槽位找到对应的节点进行读写操作。
  • 节点之间通过集群总线(cluster bus)进行通信,集群总线使用二进制协议传输消息,消息包括心跳、故障检测、配置更新、故障转移等。
  • Redis Cluster支持自动故障转移和重新分片,当某个节点故障时,它的从节点会接替它的角色,并重新分配数据。

调用Redis Cluster的方式:

以下是客户端Jedis调用Redis Cluster的方式:

Set<HostAndPort> jedisClusterNodes = new HashSet<>();
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7001));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7002));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7003));
// Add all other nodes...
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes);

哈希槽分区:

Redis Cluster 采用虚拟哈希槽分区,将所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:

slot = CRC16(key) & 16383

每一个节点负责维护一部分槽以及槽所映射的键值数据。

Redis Cluster 分槽的特点:

  • 解耦数据和节点之间的关系,简化了节点扩容和收缩难度。
  • 节点自身维护槽的映射关系,不需要客户端或代理服务维护数据分片关系。
  • Redis Cluster 的节点之间会共享消息,每个节点都知道另外节点负责管理的槽范围。 每个节点只能对自己负责的槽进行维护和读写操作。

Redis Cluster 分槽的流程:

  1. 集群初始化时,会将 16384 个槽均匀分配给集群中的所有节点。
  2. 当有新的节点加入集群时,会从其他节点中重新分配槽。
  3. 当有节点退出集群时,会将该节点负责的槽分配给其他节点。