Redis Cluster

2021/7/2 2:21:39

本文主要是介绍Redis Cluster,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Cluster

AKF图解

X:全量镜像

Y:业务功能

Z:数据分片

Redis:主从机上进行读写分离

Kafka:读写全部在主机上进行,所有从机全部用作主机挂机时的高可用替换主机

在这里插入图片描述

集群解决了单点故障,单机容量、单机访问量的问题,但是引入了新的问题

数据一致性问题

强一致性

  • 主节点写,阻塞,所有从节点全部写完才给用户返回,破坏了可用性,但是我们本来建立集群就是加强可用性的,这不是违背了自己的开始的逻辑了吗?

在这里插入图片描述

容忍不一致

  • 所以我们要么容忍数据丢失一部分(主自己写成功,然后从节点异步同步)

在这里插入图片描述

最终一致性

  • 要么我们新引入另外的可靠的消息中间件,Kafka或者其他MQ,主Redis同步发送消息到中间件,中间件可以持久化消息,Redis从节点消费MQ中的消息,从而做到数据最终一致性

在这里插入图片描述

  • 最终一致性的情况下:客户端访问黑盒化的Redis集群的时候,从不同节点读取的可能数据不一致

高可用

主节点还是一个单点,还是可能会出现单点故障

  • 需要对主做HA(可能用从机去做,也可能对主机单独的做备机,两种方式实现主的高可用)

    • 主备+主从,主机高可用,备机不必须HA

在这里插入图片描述

  • 主机挂掉的时候,从机顶上,被提升成Master(Redis Cluster就是这种模式)

所以我们还需要使用程序监控主的可用性:一个程序就有可能单点故障,所以监控程序也需要是一个集群

数据分治

此时我们把场景单独限制在一个业务中,不考虑Y轴的伸缩,只想X轴和Z轴

在这里插入图片描述

策略一:槽位预分区

提出槽位的概念。Redis中总共有16384个槽位。

做一层Mapping映射,新加的机器只需要传输对应槽位即可,不需要全量数据的rehash

客户端可以任意接入一个分片,放入Key的时候,如果对应Key的槽位隶属于另外一个槽位,该实例会自动重定向到对应分片

在这里插入图片描述

策略二:一致性哈希

详见一致性哈希笔记

问题:对事务的影响

数据一旦分治,就不支持事务了,因为有可能事务操作的不同Key位于不同主机。

如果想让事务生效,那么一个事务中操作的几个Key必须位于同一个主机

但是基于这种Hash取模形式的散列Key如何保证多个Key位于同一个主机呢?

{HashTag}+RealKey的形式,指定了HashTag的key只用HashTag计算Hash值必定保证多个Key位于同一主机

Sentinel

选举Leader Sentinel

Raft算法

选出新Master

监控集群中需要所有的监控机给出某个主不可用的结论吗?这种强一致性是否又会影响监控程序的可用性?

所以监控程序也需要只用一部分给出结论即可。那这一部分是多少个呢?

假设:现在有三个监控节点监控一个Redis主从集群

A认为M已经挂掉,但是 BC与M的通信正常,M自己也是存货状态,其实只是因为单独的A与M的网络连接问题

所以单独一个监控节点的主观结论还需要超过半数的同样结论,然后形成客观结论才行

我们选择一个监控集群中的节点数量应该选择奇数个,因为超过半数才能集成势力范围的话,5与6都是只能允许对多挂两台的,然而6有更大的数量,就有更大的概率出现挂机问题

Redis自身采用了弱一致性的从节点异步复制主节点

可以选取配置:min-replicas-to-write 3 最少几个从机写成功才返回客户端写成功

主节点挂机从节点或者备用节点顶替主

从节点挂机重连

Master做了写操作之后,会把自己的操作日志通过AOF的方式记录在默认1MB大小的缓冲区中。

从节点挂机,重启之后重新连接上主之后,先通过AOF增量日志来同步数据

如果主节点写的比较多,从节点断线重连之后需要同步的数据起始点已经被Master从队列中淘汰,则需要全量同步Master的数据

所以如果写操作比较多的业务中,应该调大日志记录队列。

代理

在这里插入图片描述

特性predixytwemproxycodisredis-cerberus
高可用Redis Sentinel或Redis Cluster一致性哈希Redis SentinelRedis Cluster
可扩展Key一致性哈希或Redis ClusterKey一致性哈希Key一致性哈希Redis Cluster
开发语言C++CGOC++
多线程
事务Redis Sentinel模式单Redis组下支持不支持不支持不支持
BLPOP/BRPOP/BLPOPRPUSH支持不支持不支持支持
Pub/Sub支持不支持不支持支持
Script支持load不支持不支持不支持
Scan支持不支持不支持不支持
Select DB支持不支持支持Redis Cluster只有一个DB
Auth支持定义多个密码,给予不同读写及管理权限和Key访问空间不支持同redis不支持
读从节点支持,可定义丰富规则读指定的从节点不支持支持,简单规则支持,简单规则
多机房支持支持,可定义丰富规则调度流量不支持有限支持有限支持
统计信息丰富丰富丰富简单

配置

  • replica-server-stale-data yes 从机刚开机到同步主机数据之前的这段时间是否往外暴露查询

    • 同步主机数据有两种方式
      1. Master落磁盘数据并且把数据发送到从机磁盘,从机接收完开始加载主机发送的文件,加载主机数据之前肯定先FlushDB
      2. Master直接通过网络直接发送自己的内存数据
  • replica-read-only yes 从机是否只读

  • repl-backlog-size 1mb 主机开启增量日志记录,从机短时间失去连接然后立马上线,从机告诉主机日志同步偏移之后,通过传送增量日志的方式快速同步数据

  • min-replicas-to-write 3 最少几个从机写成功,涉及数据一致性

  • min-replicas-max-lag 10 此配置与上个一同食用:当至少3个slave连接master的延迟时间小于10秒时,主实例才可以进行写操作。



这篇关于Redis Cluster的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程