当前位置: 首页 > news >正文

Redis Cluster(Redis 3.X)设计要点

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Redis Cluster(Redis 3.X)设计要点 博客分类: 缓存

Redis Cluster设计要点:

架构:无中心

Redis Cluster采用无中心结构,每个节点都保存数据和整个集群的状态
每个节点都和其他所有节点连接,这些连接保持活跃
使用gossip协议传播信息以及发现新节点
node不作为client请求的代理,client根据node返回的错误信息重定向请求

数据分布:预分桶

预分好16384个桶,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中
每个Redis物理结点负责一部分桶的管理,当发生Redis节点的增减时,调整桶的分布即可
例如,假设Redis Cluster三个节点A/B/C,则
Node A 包含桶的编号可以为: 0 到 5500.
Node B 包含桶的编号可以为: 5500 到 11000.
Node C包含桶的编号可以为: 11001 到 16384.

当发生Redis节点的增减时,调整桶的分布即可。
预分桶的方案介于“硬Hash”和“一致性Hash”之间,牺牲了一定的灵活性,但相比“一致性Hash“,数据的管理成本大大降低

可用性:Master-Slave

为了保证服务的可用性,Redis Cluster采取的方案是的Master-Slave
每个Redis Node可以有一个或者多个Slave。当Master挂掉时,选举一个Slave形成新的Master
一个Redis  Node包含一定量的桶,当这些桶对应的Master和Slave都挂掉时,这部分桶对应的数据不可用

Redis Cluster使用异步复制
一个完整的写操作步骤:
1.client写数据到master
2.master告诉client "ok"
3.master传播更新到slave
存在数据丢失的风险:
1. 上述写步骤1)和2)成功后,master crash,而此时数据还没有传播到slave
2. 由于分区导致同时存在两个master,client向旧的master写入了数据。
当然,由于Redis Cluster存在超时及故障恢复机制,第2个风险基本上不可能发生

数据迁移

Redis Cluster支持在线增/减节点。
基于桶的数据分布方式大大降低了迁移成本,只需将数据桶从一个Redis Node迁移到另一个Redis Node即可完成迁移。
当桶从一个Node A向另一个Node B迁移时,Node A和Node B都会有这个桶,Node A上桶的状态设置为MIGRATING,Node B上桶的状态被设置为IMPORTING
当客户端请求时:
所有在Node A上的请求都将由A来处理,所有不在A上的key都由Node B来处理。同时,Node A上将不会创建新的key

多key操作

当系统从单节点向多节点扩展时,多key的操作总是一个非常难解决的问题,Redis Cluster方案如下:
1. 不支持多key操作
2. 如果一定要使用多key操作,请确保所有的key都在一个node上,具体方法是使用“hash tag”方案
hash tag方案是一种数据分布的例外情况


Reference:
Redis cluster tutorial
Redis cluster Specification

http://blog.csdn.net/yfkiss/article/details/39996129

转载于:https://my.oschina.net/xiaominmin/blog/1599397

相关文章:

  • 一张图看懂阿里云网络产品【四】NAT网关
  • redis入门学习
  • 最长k可重区间集问题
  • Android中的消息机制
  • Python爬虫入门之Urllib库的基本使用
  • SAML(Security assertion markUp language) 安全断言标记语言
  • Windows 系统变量
  • python学习笔记(四):函数
  • [THUWC 2017]在美妙的数学王国中畅游
  • Spring框架之我见(三)——IOC、AOP
  • 敏捷公关
  • js操作时间(持续更新)
  • 好文分享--java企业架构 spring mvc +mybatis + KafKa+Flume+Zookeeper分布式架构
  • MySQL 千万 级数据量根据(索引)优化 查询 速度
  • mariadb主从复制/半同步复制
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • Android 架构优化~MVP 架构改造
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • javascript面向对象之创建对象
  • js学习笔记
  • Less 日常用法
  • Linux gpio口使用方法
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Next.js之基础概念(二)
  • Spark RDD学习: aggregate函数
  • 创建一个Struts2项目maven 方式
  • 搞机器学习要哪些技能
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 软件开发学习的5大技巧,你知道吗?
  • 使用API自动生成工具优化前端工作流
  • 我的面试准备过程--容器(更新中)
  • ​Java并发新构件之Exchanger
  • #### go map 底层结构 ####
  • #、%和$符号在OGNL表达式中经常出现
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (06)金属布线——为半导体注入生命的连接
  • (12)Linux 常见的三种进程状态
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (生成器)yield与(迭代器)generator
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)setTimeout 和 setInterval 的区别
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .apk文件,IIS不支持下载解决
  • .describe() python_Python-Win32com-Excel
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NetCore项目nginx发布
  • .NET值类型变量“活”在哪?
  • .py文件应该怎样打开?
  • @GetMapping和@RequestMapping的区别
  • @requestBody写与不写的情况
  • @Resource和@Autowired的区别