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的数据
所以如果写操作比较多的业务中,应该调大日志记录队列。
代理
特性 | predixy | twemproxy | codis | redis-cerberus |
---|---|---|---|---|
高可用 | Redis Sentinel或Redis Cluster | 一致性哈希 | Redis Sentinel | Redis Cluster |
可扩展 | Key一致性哈希或Redis Cluster | Key一致性哈希 | Key一致性哈希 | Redis Cluster |
开发语言 | C++ | C | GO | C++ |
多线程 | 是 | 否 | 是 | 是 |
事务 | Redis Sentinel模式单Redis组下支持 | 不支持 | 不支持 | 不支持 |
BLPOP/BRPOP/BLPOPRPUSH | 支持 | 不支持 | 不支持 | 支持 |
Pub/Sub | 支持 | 不支持 | 不支持 | 支持 |
Script | 支持load | 不支持 | 不支持 | 不支持 |
Scan | 支持 | 不支持 | 不支持 | 不支持 |
Select DB | 支持 | 不支持 | 支持 | Redis Cluster只有一个DB |
Auth | 支持定义多个密码,给予不同读写及管理权限和Key访问空间 | 不支持 | 同redis | 不支持 |
读从节点 | 支持,可定义丰富规则读指定的从节点 | 不支持 | 支持,简单规则 | 支持,简单规则 |
多机房支持 | 支持,可定义丰富规则调度流量 | 不支持 | 有限支持 | 有限支持 |
统计信息 | 丰富 | 丰富 | 丰富 | 简单 |
配置
-
replica-server-stale-data yes 从机刚开机到同步主机数据之前的这段时间是否往外暴露查询
- 同步主机数据有两种方式
- Master落磁盘数据并且把数据发送到从机磁盘,从机接收完开始加载主机发送的文件,加载主机数据之前肯定先
FlushDB
- Master直接通过网络直接发送自己的内存数据
- 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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-08阿里云Redis项目实战入门教程
- 2024-11-08阿里云Redis资料:新手入门与初级使用指南
- 2024-11-08阿里云Redis教程:新手入门及实用指南
- 2024-11-07阿里云Redis学习入门:新手必读指南
- 2024-11-07阿里云Redis学习入门:从零开始的操作指南
- 2024-11-07阿里云Redis学习:初学者指南
- 2024-11-06阿里云Redis入门教程:轻松搭建与使用指南
- 2024-11-02Redis项目实战:新手入门教程
- 2024-10-22Redis入门教程:轻松掌握数据存储与操作
- 2024-10-22Redis缓存入门教程:快速掌握Redis缓存基础知识