redis集群 + 哨兵 + zookeeper_Redis05——Redis Cluster 如何实现分布式集群
前面一片文章,我们已经说了Redis的主从集群及其哨兵模式。本文将继续介绍Redis的分布式集群。
”
在高并发场景下,单个Redis实例往往不能满足业务需求。单个Redis数据量过大会导致RDB文件过大,RDB文件过大会导致主从全量同步时间过长,同时重启恢复也会消耗过长的时间。同时Redis是单线程的,单个核心处理海量的内存数据,会导致CPU压力很大。
Codis
Codis是一个国产的Redis集群中间件,负责转发代理客户端请求。
Codis 模型
Codis模型.png
Codis原理
Codis中key的分配规则如下:
- 默认将内部划分成1024个槽位(solt);
- 将key进行crc32计算,获取hash值;
- hash值整数部分对1024取模得到余数,得到的余数就是对应的槽位;
- 每个槽位对应不同的Redis实例,通过槽位索引,操作对应的Redis实例。
Codis通过zookeeper存储槽位关系,通过Dashboard管理槽位,当槽位关系发生变化Codis Proxy通过监听zookeeper获取到槽位变化,并同步槽位关系。
Codis扩容
当Redis实例需要增加的时候,Codis通过slotscan扫描出所有待迁移的key,然后遍历迁移key到新的Redis实例中。
当key处于迁移状态时,Codis会先将key迁移到新的Redis实例中,再将操作指令转发到新的Reids实例中。
Codis缺点
- 不支持事务,因为所有的key分布在不同实例中,所以不支持事务。
- 部分命令不支持,如rename等命令无法支持。因为rename参数是两个key,如果两个key在不同实例中,无法正确rename。
- value大小受限,为了支持扩容,单个key对应的value不宜过大,如果过大,会导致迁移卡顿。
- 增加网络开销,因为Codis增加了一个Proxy作为转发层,网络上相较于单个Reids开销更大。
- 运维更加麻烦,因为Codis需要zookeeper实现,需要增加zookeeper的运维代价。
Redis Cluster
Redis Cluster 将所有数据划分为16384个槽位,每个节点负责管理一部分槽位,当Redis客户端连接集群的时候,也会得到一份集群的槽位配置信息。同时,Redis Cluster每个节点都会将集群中的配置信息持久化到配置文件中。
槽位操作
定位
- 将所有数据划分为16384个槽位;
- Redis Cluster 默认对key使用crc16算法进行hash;
- hash值对16384进行取模操作,得到具体槽位信息;
Redis Cluster允许用户将key挂在指定槽位上。
跳转
当Redis Cluster集群中,某个节点收到客户端的错误key值操作指令后,当节点发现key在当前节点不存在时,节点会向客户端发送一个跳转执行,告诉客户端跳转到正确的节点去操作数据。
迁移
Redis支持手动以槽位为单位进行槽位迁移。整个迁移流程如下:
- 迁移工具redis-trib在源节点(migrating)和目标节点(importing)设置槽位中间状态;
- 遍历获取源节点槽位的所有key;
- 在源节点通过dump指令获取key的序列化内容,发送到目标节点;
- 目标节点反序列化key内容,返回OK到源节点;
- 删除迁移完成的key。
从源节点收到迁移指令开始,到源节点删除key为止,整个迁移流程中,源节点的主线程处于阻塞状态。
当槽位在迁移中时,此时客户端访问key流程如下:
- 此时客户端缓存的key信息还在源节点中,所以此时客户端会去访问源节点;
- 当目标key数据还在源节点中,正常处理key;
- 当目标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 如何实现分布式集群相关推荐
- 阿里云ECS服务器部署HADOOP集群(三):ZooKeeper 完全分布式集群搭建
本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...
- Java集群优化——dubbo+zookeeper构建高可用分布式集群
为什么80%的码农都做不了架构师?>>> 不久前,我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器 ...
- java 集群会话管理_架构设计之Spring-Session分布式集群会话管理
前言 通常在web开发中,会话管理是很重要的一部分,用于存储与用户相关的一些数据.对于JAVA开发者来说,项目中的session一般由Tomcat或者jetty容器来管理. 特点介绍 尽管使用特定的容 ...
- 龙果学院mysql分布式集群代码_龙果学院-MySQL大型分布式集群解决方案
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1 课程概述 2 课程背景 3 纵观大型网站架构发展,总结持久化部分需要应对的问题 4 操作系统安装以及配置 5 在CentOS上通过yum安装mysql ...
- python搭建分布式集群_利用python的dask搭建分布式集群
一.dask介绍 优势:dask内部自动实现了分布式调度.无需用户自行编写复杂的调度逻辑和程序:通过调用简单的方法就可以进行分布式计算.并支持部分模型的并行化处理:内部实现的分布式算法:xgboost ...
- 大数据之-Hadoop完全分布式_集群文件存储路径说明_完全分布式集群测试---大数据之hadoop工作笔记0038
前面咱们已经在完全分布式模式下,配置好了SSH免密登录了, 现在我们来看看hdfs的,路径是怎么回事 我们去上传一个小文件,上传一个大文件,然后对比查看 首先我们去上传一个小文件 /opt/modul ...
- 为什么至少三个哨兵_Redis集群哨兵机制
Redis主从复制 什么是主从复制 持久化保证了即使 Redis 服务重启也不会丢失数据,因为 Redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 Redis 服务器的硬盘损坏了可能 ...
- 分布式集群架构场景化解决方案相关
文章目录 前言 一.一致性Hash算法 1.1 Hash算法应用场景 1.2 普通Hash算法存在的问题 1.3 一致性Hash算法 二.集群时钟同步问题 2.1 时钟不同步导致的问题 2.2 集群时 ...
- 分布式集群架构场景化解决⽅案(⼀致性Hash算法)
什么是分布式和集群以及实现 主要内容 ⼀致性Hash算法 集群时钟同步配置 分布式ID解决⽅案 分布式调度问题 Session共享问题 分布式和集群是不⼀样的,分布式⼀定是集群,但是集群不⼀定是分布式 ...
最新文章
- html动画图片重叠,不一样的层叠照片动画-ANIMATED CSS3 PHOTO STACK
- PHP put提交和获取数据
- 人脸关键点 Stasm
- 高校计算机实验管理人员会议,计算机科学学院召开实验室安全与管理工作会议...
- 深圳“拍了拍”长沙:美食巨头文和友、茶颜、徐记海鲜正在“排队”签收
- python做自动化测试的优点_乐搏讲自动化测试-python语言特点及优缺点(5)
- 为什么 窗口回调函数要使用静态成员函数
- Python策略模式实现源码分享
- matlab做高斯滤波,matlab高斯滤波自定义函数怎么做
- 用冰封服务器安装系统,如何使用冰封一键在线重装系统
- 【上位机教程】CANopen通信下一体化步进电机与台达PLC(AS228T)的应用
- Interpreter
- 收盘价对数收益率matlab,R语言怎么把股票日收盘价转换成对数收益率
- js new Date() 当前时间/指定时间转换为时间戳
- 虚拟机Linux忘记root密码的解决办法
- Arcgis API For js 的离线部署
- Hadoop笔记(1)——hdfs命令访问方式
- linux shell ifs,Shell 的 IFS 变量
- 再谈BPM(业务流程管理)为企业带来哪些提升
- 鸿蒙麒麟食华为的什么系统,你好,鸿蒙!华为自研系统真的来了,还有麒麟、朱雀...
热门文章
- wampserver3.2.0_MySQL 8.0 技术详解
- python语言中最基本的概念_Python 学习之路-基本的概念(三)
- 内存类型范围寄存器 (MTRR)
- 类UNIX操作系统家族发展时间线图谱(1969-2020)
- linux内核模块的编译文件
- w7如何调出计算机图标来,W7电脑系统怎么显示桌面图标
- 获取activemq 队列所有数据_ActiveMQ的应用
- Vue3动态组件、缓存组件、分发组件
- web前端基础(12js基础介绍)
- Spring Boot细节挖掘(拦截器)