Redis Cluster

本文深入探讨了Redis Cluster的设计与工作原理,包括它的优势、哈希槽分配、master-slave模式、集群容错机制以及配置详情。通过详细阐述各个组件的功能,如心跳检测、节点通信和数据分布,揭示了Redis Cluster在保证高性能和线性扩展的同时,如何实现高可用性和写安全性。
摘要由CSDN通过智能技术生成

目录

目标

概述

优势

每个node需要两个TPC端口

hash slot 哈希槽

master-slave模式

集群不保证写的强一致性

说明书

设计说明

目标

命令支持

集群中server和client角色

可接受的写安全

一定程度的可用性

性能

主要组件

 key分布式模型

key 哈希tag

node属性

cluster bus

重定向

运行时reconfiguration

容错

Heartbeat

失败监测

 配置

epoch 

 currentEpoch

configEpoch

slave选举与提升

 slave rank

node重新加入集群

副本迁移Replica migration

node reset

node remove 


目标

对redis cluster两篇官网doc进行翻译和整理,以便加深了解原理。

概述

优势

  • 多个node间自动分片
  • 通过slave提升和副本迁移,提升集群可用性

每个node需要两个TPC端口

  • 服务端口,为client提供服务,如6379
  • cluster bus端口,服务端口+10000,如16379,cluster bus用于node间互联互通,如失败监测、配置更新、故障切换授权等

hash slot 哈希槽

  • 集群具有(2的14方)16384个哈希槽,计算key对应的哈希槽的方式 CRC16(key) mod 16384
  • 集群中每个master负责哈希槽的子集
  • 运行时动态增减node,不需要集群启停。
    • 抽象为哈希槽的迁移
    • 减node A
      • 将A负责的哈希槽分配给其他node
      • 其他所有master上执行cluster forget A
    • 增加node
      • 添加节点
        • 作为master:redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
        • 作为salve:redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id masterId
      • 通过命令重新分片
        • redis-cli reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes

master-slave模式

为master节点增加slave,作为副本,当master故障时,集群会选slave成为新master,保证集群可用。

集群不保证写的强一致性

 

说明书

设计说明

目标

  • 高性能,线性扩展(最多1000节点)。不使用代理、异步复制,不支持合并类操作。
  • 可接受的写安全
  • 可用性。大部分master可用且不可用master至少具有一个slave时,可保证集群所有分区继续可用。

命令支持

  • 所有单key的命令
  • 待操作key在同一个node上的多key操作,如并集 交集

集群中server和client角色

集群Node负责存储数据\维护集群状态。

所有Node通过redis cluster bus进行互联互通,实现自动发现Node、(通过心跳包)监测Node、失败恢复时提升slave为master

等。redis cluster bus包括TCP和binary协议。

Node不支持请求重定向,所以返回重定向ERROR,让client自行重定向。

可接受的写安全

redis cluster采用[master和slave间异步复制]与[最近容错为准]两种方式进行隐式数据合并。

最近容错为准,理解为最近选举为master的slave上的数据集会覆盖其他副本,未复制的数据将丢失。

采用时间窗口NODE_TIMEOUT,允许master node在该期间恢复,否则master失联,进行故障切换,丢失未复制的写操作。

数据丢失的场景

  • master接收到client的写操作,之后向client发送返回结果,但是异步复制还未送达到slave,此时master故障,且在NOTE_TIMEOUT后仍不可达,则选举一个slave作为master
  • slave升为master后,client由于未更新哈希槽和node关系,仍向原master写。这种情况不可能发生,因为原master将不接受写。

时间窗口的作用

  • 允许master node在该期间恢复
  • 判断master node是否失联

一定程度的可用性

多数master可达且少数不可达master至少有一个slave,则经过(NODE_TIMEOUT+1至2秒)后集群再次可用。

仅当集群中少量master node不可达时,才可维持可用性。

可用的可能性

  •     N个master且各有一个slave,可用的可能性为1 - 1/(N*2-1)
  •     一个master不可达,则其
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值