前面一片文章,我们已经说了Redis的主从集群及其哨兵模式。本文将继续介绍Redis的分布式集群。

在高并发场景下,单个Redis实例往往不能满足业务需求。单个Redis数据量过大会导致RDB文件过大,RDB文件过大会导致主从全量同步时间过长,同时重启恢复也会消耗过长的时间。同时Redis是单线程的,单个核心处理海量的内存数据,会导致CPU压力很大。

Codis

Codis是一个国产的Redis集群中间件,负责转发代理客户端请求。

Codis 模型

Codis模型.png

Codis原理

​Codis中key的分配规则如下:

  1. 默认将内部划分成1024个槽位(solt);
  2. 将key进行crc32计算,获取hash值;
  3. hash值整数部分对1024取模得到余数,得到的余数就是对应的槽位;
  4. 每个槽位对应不同的Redis实例,通过槽位索引,操作对应的Redis实例。

Codis通过zookeeper存储槽位关系,通过Dashboard管理槽位,当槽位关系发生变化Codis Proxy通过监听zookeeper获取到槽位变化,并同步槽位关系。

Codis扩容

当Redis实例需要增加的时候,Codis通过slotscan扫描出所有待迁移的key,然后遍历迁移key到新的Redis实例中。

当key处于迁移状态时,Codis会先将key迁移到新的Redis实例中,再将操作指令转发到新的Reids实例中。

Codis缺点

  1. 不支持事务,因为所有的key分布在不同实例中,所以不支持事务。
  2. 部分命令不支持,如rename等命令无法支持。因为rename参数是两个key,如果两个key在不同实例中,无法正确rename。
  3. value大小受限,为了支持扩容,单个key对应的value不宜过大,如果过大,会导致迁移卡顿。
  4. 增加网络开销,因为Codis增加了一个Proxy作为转发层,网络上相较于单个Reids开销更大。
  5. 运维更加麻烦,因为Codis需要zookeeper实现,需要增加zookeeper的运维代价。

Redis Cluster

Redis Cluster 将所有数据划分为16384个槽位,每个节点负责管理一部分槽位,当Redis客户端连接集群的时候,也会得到一份集群的槽位配置信息。同时,Redis Cluster每个节点都会将集群中的配置信息持久化到配置文件中。

槽位操作

定位

  1. 将所有数据划分为16384个槽位;
  2. Redis Cluster 默认对key使用crc16算法进行hash;
  3. hash值对16384进行取模操作,得到具体槽位信息;

Redis Cluster允许用户将key挂在指定槽位上。

跳转

当Redis Cluster集群中,某个节点收到客户端的错误key值操作指令后,当节点发现key在当前节点不存在时,节点会向客户端发送一个跳转执行,告诉客户端跳转到正确的节点去操作数据。

迁移

Redis支持手动以槽位为单位进行槽位迁移。整个迁移流程如下:

  1. 迁移工具redis-trib在源节点(migrating)和目标节点(importing)设置槽位中间状态;
  2. 遍历获取源节点槽位的所有key;
  3. 在源节点通过dump指令获取key的序列化内容,发送到目标节点;
  4. 目标节点反序列化key内容,返回OK到源节点;
  5. 删除迁移完成的key。

从源节点收到迁移指令开始,到源节点删除key为止,整个迁移流程中,源节点的主线程处于阻塞状态。

当槽位在迁移中时,此时客户端访问key流程如下:

  1. 此时客户端缓存的key信息还在源节点中,所以此时客户端会去访问源节点;
  2. 当目标key数据还在源节点中,正常处理key;
  3. 当目标key不在源节点中:

3.1. 源节点返回给客户端 -ASK targetNodeAddr;

3.2. 客户端发送ASKING指令到目标节点;

3.3 在目标节点执行原有指令。

为什么发送ASKING指令?在迁移没完成前,该槽位不归新节点管,如果直接发送操作指令,节点会返回给客户端 -MOVED重定向指令,让客户端去访问源目标节点,形成重定向循环。ASKING指令会强制让目标节点处理迁移未完成的槽位key。

容错

  • 主从节点: 允许为每个主节点设置若干个从节点,当主节点发生故障的时候,集群会自动将从节点提升为主节点;
  • cluster-require-full-coverage:允许集群中部分节点发生故障的时候,其他节点还可以继续提供对外服务;
  • cluster-node-timeout:可以用配置当某个节点持续timeout失联时,才认定该节点出现故障,需要进行主从切换。如果无该配置,因网络抖动,会导致频繁的主从切换;
  • PFail:当一个节点发现某个节点失联了,该节点会将这条信息向整个集群广播,失联节点此时可认为是PFail(可能是失联);
  • Fail:当失联节点被集群大多数节点认为是PFail的时候,就可以标记该节点为失联(Fail),然后广播该节点已经失联下线,同时对该节点进行主从切换。

Redis系列推荐

Redis04——五分钟明白Redis的哨兵模式

Redis03——Redis是如何删除你的数据的

Redis02——Redis内存数据如何保存到磁盘

Redis01——Redis究竟支持哪些数据结构

redis集群 + 哨兵 + zookeeper_Redis05——Redis Cluster 如何实现分布式集群相关推荐

  1. 阿里云ECS服务器部署HADOOP集群(三):ZooKeeper 完全分布式集群搭建

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...

  2. Java集群优化——dubbo+zookeeper构建高可用分布式集群

    为什么80%的码农都做不了架构师?>>>    不久前,我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器 ...

  3. java 集群会话管理_架构设计之Spring-Session分布式集群会话管理

    前言 通常在web开发中,会话管理是很重要的一部分,用于存储与用户相关的一些数据.对于JAVA开发者来说,项目中的session一般由Tomcat或者jetty容器来管理. 特点介绍 尽管使用特定的容 ...

  4. 龙果学院mysql分布式集群代码_龙果学院-MySQL大型分布式集群解决方案

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1 课程概述 2 课程背景 3 纵观大型网站架构发展,总结持久化部分需要应对的问题 4 操作系统安装以及配置 5 在CentOS上通过yum安装mysql ...

  5. python搭建分布式集群_利用python的dask搭建分布式集群

    一.dask介绍 优势:dask内部自动实现了分布式调度.无需用户自行编写复杂的调度逻辑和程序:通过调用简单的方法就可以进行分布式计算.并支持部分模型的并行化处理:内部实现的分布式算法:xgboost ...

  6. 大数据之-Hadoop完全分布式_集群文件存储路径说明_完全分布式集群测试---大数据之hadoop工作笔记0038

    前面咱们已经在完全分布式模式下,配置好了SSH免密登录了, 现在我们来看看hdfs的,路径是怎么回事 我们去上传一个小文件,上传一个大文件,然后对比查看 首先我们去上传一个小文件 /opt/modul ...

  7. 为什么至少三个哨兵_Redis集群哨兵机制

    Redis主从复制 什么是主从复制 ​ 持久化保证了即使 Redis 服务重启也不会丢失数据,因为 Redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 Redis 服务器的硬盘损坏了可能 ...

  8. 分布式集群架构场景化解决方案相关

    文章目录 前言 一.一致性Hash算法 1.1 Hash算法应用场景 1.2 普通Hash算法存在的问题 1.3 一致性Hash算法 二.集群时钟同步问题 2.1 时钟不同步导致的问题 2.2 集群时 ...

  9. 分布式集群架构场景化解决⽅案(⼀致性Hash算法)

    什么是分布式和集群以及实现 主要内容 ⼀致性Hash算法 集群时钟同步配置 分布式ID解决⽅案 分布式调度问题 Session共享问题 分布式和集群是不⼀样的,分布式⼀定是集群,但是集群不⼀定是分布式 ...

最新文章

  1. html动画图片重叠,不一样的层叠照片动画-ANIMATED CSS3 PHOTO STACK
  2. PHP put提交和获取数据
  3. 人脸关键点 Stasm
  4. 高校计算机实验管理人员会议,计算机科学学院召开实验室安全与管理工作会议...
  5. 深圳“拍了拍”长沙:美食巨头文和友、茶颜、徐记海鲜正在“排队”签收
  6. python做自动化测试的优点_乐搏讲自动化测试-python语言特点及优缺点(5)
  7. 为什么 窗口回调函数要使用静态成员函数
  8. Python策略模式实现源码分享
  9. matlab做高斯滤波,matlab高斯滤波自定义函数怎么做
  10. 用冰封服务器安装系统,如何使用冰封一键在线重装系统
  11. 【上位机教程】CANopen通信下一体化步进电机与台达PLC(AS228T)的应用
  12. Interpreter
  13. 收盘价对数收益率matlab,R语言怎么把股票日收盘价转换成对数收益率
  14. js new Date() 当前时间/指定时间转换为时间戳
  15. 虚拟机Linux忘记root密码的解决办法
  16. Arcgis API For js 的离线部署
  17. Hadoop笔记(1)——hdfs命令访问方式
  18. linux shell ifs,Shell 的 IFS 变量
  19. 再谈BPM(业务流程管理)为企业带来哪些提升
  20. 鸿蒙麒麟食华为的什么系统,你好,鸿蒙!华为自研系统真的来了,还有麒麟、朱雀...

热门文章

  1. wampserver3.2.0_MySQL 8.0 技术详解
  2. python语言中最基本的概念_Python 学习之路-基本的概念(三)
  3. 内存类型范围寄存器 (MTRR)
  4. 类UNIX操作系统家族发展时间线图谱(1969-2020)
  5. linux内核模块的编译文件
  6. w7如何调出计算机图标来,W7电脑系统怎么显示桌面图标
  7. 获取activemq 队列所有数据_ActiveMQ的应用
  8. Vue3动态组件、缓存组件、分发组件
  9. web前端基础(12js基础介绍)
  10. Spring Boot细节挖掘(拦截器)