华子目录
什么是`redis集群` `redis cluster`的`体系架构` 什么是数据`sharding`? 什么是`hash tag` 集群中删除或新增节点,数据如何迁移? `redis集群`如何使用`gossip`通信? 定义 `meet信息` `ping消息` `pong消息` `fail消息(不是用gossip协议实现的)` 流量图
数据访问如何定位到具体的节点?
`redis cluster主从架构` 创建`redis cluster`的`前提`
什么是redis集群
redis
从3.0
开始就支持集群
,节点之间
使用gossip协议
进行通信
,实现了去中心化
,集群中
支持动态的添加和删除节点
,动态迁移数据
以及自动执行故障转移
在哨兵sentinel机制
中,可以解决redis高可用
问题,即当master
故障后可以自动
将slave
提升为master
,从而可以保证redis服务
的正常使用
,但是无法
解决redis单机写入
的瓶颈
问题,即单机redis写入
性能受限于单机的内存大小、并发数量、网卡速率
等因素 集群
中某个节点
的是否失效
,是由整个集群
中超过半数
的节点监测都失效
,才能算真正的失效
客户端
不需要proxy
即可直接连接redis
,应用程序
中需要配置
有全部的redis服务器IP
每个哈希槽
可以存储
若干个key
在无中心
的redis集群
当中,其每个节点
保存当前节点数据
和整个集群状态
,每个节点
都和其他所有节点
连接
redis cluster
的体系架构
什么是数据sharding
?
redis cluster
使用数据分片
实现key
的存储分布
redis cluster
将集群
划分为16384个槽位
,数据库
中所有的key
进行hash
计算后,都会落到这16384个槽位
中的其中一个槽位
那么key
是如何定位到哪个槽位
的。可以通过公式
进行计算:CRC16(key)%16384
,得到
的值
就是槽位
;16384个槽位
全部分配
给cluster
中的节点
每个节点
维护自己的槽位
,同时每个节点
也会存储其他节点
维护的槽位信息
当然你也可以指定到哪个槽位
,这就涉及
到了hash tag
什么是hash tag
hash tag
是用来解决用户
想要将一堆数据key
全部放到一个槽位
而提出来的
,用户
可以将key
设置成这样:原始的key + {tag标签}
,当redis cluster
碰到这样的key
,就会提取{}
里面的值
,进行槽位计算
集群中删除或新增节点,数据如何迁移?
假设cluster
目前有四个
节点A,B,C,D
如果删除D节点
,则会将D节点
中的所有槽位
全部分配给A,B,C节点
如果新增E节点
,则会将A,B,C,D
中的部分槽位
移动到E节点
上
redis集群
如何使用gossip
通信?
定义
gossip
使得元数据分布式存储
,不做集中存放
,实现了去中心化
,当一个节点信息变更
,就会触发集群中
整个节点信息的更新
,缺点
就是更新会有延迟
meet信息
ping消息
pong消息
pong消息
是用来回应
其他节点
向自己发的消息
,还可以通过发此消息
,让其他节点
更新此节点
的状态信息
fail消息(不是用gossip协议实现的)
当集群
里的主节点A
将主节点B
标记为下线
时,会通过集群广播
一条关于主节点B
的fail消息
,所有接受到这条消息
的节点
(包括主从节点
)都会将主节点B
标记为下线
流量图
数据访问如何定位到具体的节点?
正常访问
访问已被迁移到其他节点的数据
redis cluster主从架构
Redis cluster
的架构
虽然解决了并发的问题
,但是又引入
了一个新的问题
,每个Redis master
的高可用
如何解决
?那就是对每个master节点
都实现主从复制
,从而实现redis高可用性
创建redis cluster
的前提
每个redis node节点
采用相同的硬件配置
、相同的密码
、相同的redis版本
每个节点
必须开启
的参数
cluster-enabled yes
cluster-config-file nodes-6380.conf
所有redis服务器
必须没有任何数据
先启动
为单机redis
且没有任何key value