前面文章我们介绍了Redis的主从模式是一种在Redis中实现高可用性的方式,但也存在一些缺点。

1、主从模式缺点

  • 写入单点故障:在主从模式中,写入操作只能在主节点进行,如果主节点宕机,写入将无法执行。虽然可以通过升级从节点为主节点来解决,但这会增加故障切换的复杂性。

  • 写入压力分摊:当写入操作较多时,写入压力无法分摊,可能成为性能瓶颈。

  • 水平扩容问题:水平扩容牵涉到数据的迁移和访问代理问题。

2、集群的原理

Redis集群是3.0版本提出的一种分布式解决方案。其大致原理是通过分片(Sharding)和数据复制来实现数据的分布和高可用性。下面是Redis集群的基本原理:

  1. 数据分片: Redis集群使用哈希槽(hash slot)分片策略,将整个数据空间划分为固定数量的哈希槽。每个节点负责管理一部分哈希槽,而不是管理具体的键值对。

  2. 数据分布: 客户端将键通过哈希函数映射到某个哈希槽,然后找到负责该哈希槽的节点。这样,数据被均匀地分布在不同的节点上。

  3. 数据复制: 为了提供高可用性,每个主节点都有多个从节点。主节点会将自己的数据异步复制到从节点,以保持数据的一致性。从节点可以处理读请求,也可以在主节点宕机时升级为新的主节点。

  4. 故障检测与转移: Redis集群引入了哨兵(Sentinel)节点,用于监控主节点的状态。当主节点宕机或无法访问时,哨兵会发起选举,选择一个从节点升级为新的主节点,从而实现故障转移。

  5. 故障恢复: 当主节点恢复时,它会成为从节点,从新的主节点进行数据同步。这种方式可以确保在节点故障恢复后,数据能够重新同步,保持一致性。

  6. 动态扩展: 当需要扩展集群规模时,可以增加新的节点,调整哈希槽的分配信息,并在新节点上进行数据迁移。这样集群可以根据需求进行动态扩展,以适应不断增长的数据和流量。

  7. 节点通信:集群中每个节点都需要知道其他所有节点的状态信息,包括当前集群状态、集群中各节点负责的哈希槽、集群中各节点的master-slave状态、集群中各节点的存活状态等。Redis集群中,节点之间通过建立TCP连接,使用gossip协议来传播集群的信息。

3、数据分区原理

分布式数据存储首先要解决整个数据集如何按照分区规则划分到多个节点问题,每个节点负责整个数据集的子集。常见的分区规则有3种:哈希取余分区、一致性哈希算法分区和哈希槽分区。

3.1、哈希取余分区

这是最简单的分区方案。数据的键(Key)通过哈希函数得到一个哈希值,然后将哈希值与节点数量(N)取余,以确定数据属于哪个节点。公式:hash(Key) % N

  • 优点

这种方式的优点是 简单,一般采用 预分区 的方式,提前根据 数据量 规划好 分区数,比如划分为 512 或 1024 张表,保证可支撑未来一段时间的 数据容量。扩容时通常采用 翻倍扩容,避免 数据映射 全部被 打乱,导致 全量迁移 的情况。常用于 数据库 的 分库分表

  • 缺点

当 节点数量 变化时,如 扩容 、**收缩 **、 宕机 节点,数据节点 映射关系 需要重新计算,会导致数据的 重新迁移

3.2、一致性哈希算法分区

一致性哈希算法就是将整个哈希值空间组织成一个虚拟的圆环,哈希函数的值空间为0~2^32-1(即哈希值是一个32位无符号整形)。

上图为将node1、node2、node3服务器的IP作为唯一关键字,使用Hash(IP)进行哈希,这样每台机器就能确定其在哈希环上的位置。

key落键规则:当我们需要存储一个kv键值对时,首先计算key的hash值(hash(key))将这个key使用相同的哈希函数计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上,如上图所示。

  • 优点

容错性:若node2挂掉,受影响的数据只有node1和node2之间的数据,且这些数据会转移到node3存储。

扩展性:若在node1和node2之间增加一台node4,受影响的数据只有node1和node4,重写把node1到node4的数据录入到node4即可。

不会导致hash取余数据重新洗牌计算。

  • 缺点

数据倾斜:若节点太少且分布不均匀时,会造成大部分数据集中存放在某一台上的问题,如下图所示,大部分数据都会存放在node1上:

3.3、 哈希槽分区(Redis集群方案)

为了解决数据倾斜的问题,Redis3.0中引入了哈希槽的概念。

Redis集群有16384个哈希槽,集群会先给每个master节点分配一部分哈希槽。比如当前集群有3个master节点:

  • master1节点包含0~5500号哈希槽
  • master2节点包含5501~1000号哈希槽
  • master3节点包含11001~16384号哈希槽

进行set操作时,每个key会通过CRC16校验后再对16384取模来决定放置在哪个槽,比如 CRC16(key) % 16384 = 777,那么这个key就会被分配到master1节点上,如下图:

4、Redis集群的MOVED重定向

因为Redis客户端可以向集群中的 **任意节点 **发送指令,那么如果数据没有存放在接收到指令的节点上,怎么办呢?

MOVED重定向:

当Redis节点接收到相关指令时,会先计算key落在哪个哈希槽上,如果恰好在自己节点上,那么就直接处理指令并返回结果;

如果key计算出的哈希槽不在自己节点上,那么当前节点就会查看它内部维护的 **哈希槽 **与 **节点ID **之间的映射关系,然后给客户端返回一个MOVED错误:

  • MOVED [哈希槽] [节点IP:端口]

这个错误包含操作的key所属的 **哈希槽 **和能处理这个请求的Redis节点的 **IP **和 **端口号 **,例如“MOVED 3999 127.0.0.1:6379”,客户端需要根据这个信息重新发送查询指令到给定的IP和端口的Redis节点。就完成了MOVED重定向操作。

5、配置集群

准备6台机器,三主三从。

5.1、删除持久化文件

删除原目录下的RDB、AOF格式的文件。

cd /home/redis
rm *.rdb *.aof

5.2、配置redis.conf

对6各节点的redis.conf都做如下配置:

# 开启集群模式
cluster-enabled yes # 每一个节点需要有一个配置文件,需要6份。每个节点处于集群的角色都需要告知其他所有节点,彼此知道,这个文件用于存储集群模式下的集群状态等信息,这个文件是由redis自己维护,我们不用管。如果你要重新创建集群,那么把这个文件删了就行
cluster-config-file nodes-6379.conf # 超时时间,超时则认为master宕机,随后主备切换
cluster-node-timeout 5000

5.3、启动所有服务

cd src
redis-server ../redis.conf

5.4、创建集群

执行命令:redis-cli

#####
# 注意1:如果你使用的是redis3.x版本,需要使用redis-trib.rb来构建集群
# 注意2:以下为新版的redis构建方式
##### # 创建集群,-a 123456是指redis密码, cluster-replicas是指主节点和从节点比例为1,1-3为主,4-6为从,一个主节点对应一个从节点,这也是最经典用的最多的集群模式
redis-cli -a 123456 --cluster create 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.204:6379 192.168.1.205:6379 192.168.1.206:637 --cluster-replicas 1

6、SpringBoot 2.X 集成Redis集群

spring:
application:
name: test.redis
redis:
jedis:
pool:
#最大连接数据库连接数,设 0 为没有限制
max-active: 8
#最大等待连接中的数量,设 0 为没有限制
max-idle: 8
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
max-wait: -1ms
#最小等待连接中的数量,设 0 为没有限制
min-idle: 0
lettuce:
pool:
max-active: 8
max-idle: 8
max-wait: -1ms
min-idle: 0
shutdown-timeout: 1000ms
cluster:
# 此处需要配置每个实例的节点
nodes: 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.204:6379 192.168.1.205:6379 192.168.1.206:637
#密码
password: 123456 server:
port: 8080

Redis从入门到放弃(9):集群模式的更多相关文章

  1. Redis系列5:深入分析Cluster 集群模式

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) 1 背景 前面我们 ...

  2. Linux--6 redis订阅发布、持久化、集群cluster、nginx入门

    一.redis发布订阅 Redis 通过 PUBLISH .SUBSCRIBE 等命令实现了订阅与发布模式. 其实从Pub/Sub的机制来看,它更像是一个广播系统,多个Subscriber可以订阅多个 ...

  3. redis 5.0.3 讲解、集群搭建

    REDIS 一 .redis 介绍 不管你是从事Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业务代码的程序员,实际工作中或许只用到了 ...

  4. Redis 5.0.7 讲解,单机、集群模式搭建

    Redis 5.0.7 讲解,单机.集群模式搭建 一.Redis 介绍 不管你是从事 Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业 ...

  5. redis解决方案之三种集群模式的概念与部署

    上篇文章为大家总结了redis命令并讲述了持久化,今天我们来看一下redis的三种集群模式:主从复制,哨兵集群,Cluster集群 本篇文章先介绍redis-cluster集群模式,然后再依次介绍它的 ...

  6. Redis学习笔记~conf自主集群模式

    回到目录 Redis自主提供了集群模式,当然也只是比较简单的读写分离模式,或者叫主从模式,它在各个redis服务端自己做数据同步机制,当然就是将主服务端的信息同步到各个slave服务器上,在客户端集成 ...

  7. 就publish/subscribe功能看redis集群模式下的队列技术(一)

    Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...

  8. Redis进阶实践之十 Redis主从复制的集群模式

    一.引言        Redis的基本数据类型,高级特性,与Lua脚本的整合等相关知识点都学完了,说是学完了,只是完成了当前的学习计划,在以后的时间还需继续深入研究和学习.从今天开始来讲一下有关Re ...

  9. Redis进阶实践之十 Redis哨兵集群模式

    一.引言             上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

  10. 深入剖析Redis系列: Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

随机推荐

  1. AI 在 API 设计中的应用:如何利用 Al 快速实现 API 开发和测试

    一.引言 在当今互联网技术的快速发展中,API 成为了越来越多的软件和系统之间交互的核心方式,而 API 的质量和效率对于软件的开发和运维都至关重要.为了提高 API 的设计.开发.测试和运维的效率和 ...

  2. 【H5】Emmet 指令 HTML

    Emmet操作指南 HTML篇 生成带有内容的标签 标签名{内容}可以生成带有内容的标签 div{abc} <div>abc</div> 生成带有属性的标签 生成带有class ...

  3. 获取scrollTop的方法(兼容所有浏览器)

    /** *获取scrollTop的值,兼容所有浏览器 */ function getScrollTop() { var scrollTop = document.documentElement.scr ...

  4. 2021-02-23:给定一个正数n,求n的裂开方法数。规定:后面的数不能比前面的数小 。比如4的裂开方法有: 1+1+1+1、1+1+2、1+3、2+2、4,5种,所以返回5。

    2021-02-23:给定一个正数n,求n的裂开方法数.规定:后面的数不能比前面的数小 .比如4的裂开方法有: 1+1+1+1.1+1+2.1+3.2+2.4,5种,所以返回5. 福哥答案2021-0 ...

  5. More than one file was found with OS independent path 'lib/armeabi-v7a/libflutter.so'

    今日一个flutter 整合ai到原生android 时老是提示如下错误 Caused by: com.android.builder.merge.DuplicateRelativeFileExcep ...

  6. cv学习总结(11.21-11.27)

    本周彻底完成了CNN的全部内容,包括CNN的原理,代码实现等.CNN是一种神经网络的framework,跟connected_layer相比,更加侧重于能够保持原来的空间结构不变:我们输入的图片是一个 ...

  7. 生信服务器 | Linux 时间戳和标准时间

    在 Linux 系统中,有许多场合都使用时间戳的方式表示时间,即从1970年1月1日起至当前的天数或秒数.如/etc/shadow里的密码更改日期和失效日期,还有代理服务器的访问日志对访问时间的记录等 ...

  8. 尚医通day01-【项目环境搭建和医院设置详细步骤】(内附源码)

    第01章-项目介绍 1.课程介绍 项目名称:尚医通预约挂号统一平台 项目原型:https://www.114yygh.com 北京市预约挂号统一平台 项目技术栈:前后端分离 后端技术:SpringBo ...

  9. flutter系列之:做一个图像滤镜

    目录 简介 我们的目标 带滤镜的图片 打造filter按钮 打造可滑动按钮 最后要解决的问题 简介 很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过c ...

  10. 【后端面经】MySQL主键、唯一索引、联合索引的区别和作用

    目录 0. 简介 1. 主键 2. 唯一索引 3. 联合索引 4. 索引对数据库操作的影响 5. 其他索引 5.1 普通索引 5.2 全文索引 5.3 前缀索引 6. 总结 7. 参考资料 0. 简介 ...