1:Redis cluster 集群
我们日常在对于Redis 的使用中,经常会遇见一些问题
- 高可用问题,如何保证Redis 的持续高可用性
- 容量问题,但实例Redis内存无法无限扩充,达到32G后就进入了64位世界,性能
- 并发性能问题,Redis号称为实例10万并发,但也是有尽头的
(1):Redis cluster 介绍
Redis cluster 是Redis 的分布式解决方法,在Redis3.0版本中正式推出的采用的是hash slot(hash槽),可以将多个Redis实例整合在一起,形成一个集群,也就是将数据分散到集群的多台机器上,有效的解决了Redis分布式方面的需求,当遇见单机内存,开发,流量等瓶颈时,可以采用cluster 架构达到负载均衡的目的。
redis-cluster 的优势:
- 官方优势,
- 去中心化,集群最大可增加1000个字节,性能随节点增加而线性扩展
- 管理方便,后续可自行增加或摘除节点,移除分增等待
- 简单,易上手
(2):Redis数据分布
分布数据库主要解决把整个数据集安照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集,常见的分区规划有哈希分区和顺序分区,Redis cluster 采用 哈希分区规则,因此接下来会讨论哈希规则,常见的哈希分区有以下几种:
- 节点取余
- 一致性哈希分区
- 虚拟槽分区
Redis cluster 采用虚拟槽分区。
(3):虚拟槽分区
虚拟槽分区巧妙的使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定的范围内得整数集合
Redis cluster 槽的范围是0-16383 。槽是集群数据管理的迁移的基本单位,采用大范围槽的主要目的是为了方便数据的拆分和集群的扩展
(同时这也是Redis的优点),使每个节点负责一定数量的值
(4);虚拟分区
cluster 是一个无中心的结构,其每个节点都会保存着数据和整个集群的状态,每个节点都会保存其他节点的信息,知道其他节点所负责的槽,并且与其他节点定时发送心跳信息能够及时感知整个集群中异常的节点
Redis 群居原理图
《1》:当client 问集群中任一节点发送与数据库有关命令时
《2》:接受命令的Redis 节点会计算出命令属于哪个槽,并检查这个槽是否指派了给自己
《3》:如果键所在的槽正好指派给当前节点,那么节点直接执行这个命令
《4》:如果键所在没有指派给当前节点,那么节点会向客户端返回一个moved错误,并指引客户端转向(redirect)正确的节点,在发送希望执行的命令
(5):群角色工作原理介绍
集群角色有Master和slave。群集中master之间分配 slots(槽〉[范围:0-16383],一共16384个 slot o Slave向它指定的master同步数据,实现备份,当其中的一个master无法提供服务时,该master的slave将提升为master,以保证群集键slot的完整性,当其中的某一个master和他的slave都失效,导致slot 不完整,群集将会失效,这时就需要人工处理了。e
Redis群集搭建好以后,群集中的每个节点都会定期地向其他节点发送ping消息,如果ping消息没有在规定时间内返回pong,那么发送ping消息的节点就会将其标记为疑是下线(probable fail.PFALL),各个节点会通过相互发送消息的方式来交换群集中各个节点的状态信息,如果在一个集群里面,半数以上的主节点都将某个主节点X报告为疑似下线,那么这个主节点X将被标记为已下线《FAIL),同时会向集群广播一条关于主节点X的FAIL消息,所有牧到这条FAIL消息的节点都会立即将主节点X标记为已下线。e
当群集中需要增加或减少机器时,我们需要将已经指派给某个节点(源节点:原来slot所在的节点》的槽更改为指派给另一个节点(目标节点:将原来的slot分配给谁),并且会将原节点的键值移动到目标节点。
Redis群集的从新分片操作是由xedis.的群集管理软件redismtrib,负责执行的,不支持自动分片,而且还需要自己计算从哪些节点上迁移多大 slot,在重新分片的过程中群集不需要下线,并且原节点和目标节点都可以处理请求-
(6):Redis 架构细节信息
- 所有的Redis 彼此互联的机制(ping-pong机制),内部使用二进制协议优化传输速度和带宽
- 节点的失效(fail)在群集中超过半数的主(master)节点检测失败时才能有效
- 客户端与Redis节点直连,不需要中间代理(proxy)届,客户端不需要连接群集所在节点,连接群集中任何几个节点都可以
- Rediscluster 那所有的物理及节点映射为(1-16252——slot 是上,cluster负责维护dide-slot-key
(7):Redis-cluster 选举
选举过程中所有master参与,如果半数以上的master节点与当前master节点通信超时(cluster-node-timeout),认为当前的master 节点挂掉
出现以下两种情况将认为群集不可用
《1》:当前群集不可用,所有对进群的操作都将不可用
《2》:收到(error) CLUSTERDBWN the cluster di down)错误
a: 如果群集中任意的master挂机,没有slave 直接进入fail状态,此时之前分配到master 上的槽{1-16383范围中}在整个群集中将会出现slot 不完整进入fail状态
b:如果群集中超过半数的master 挂掉,无论是否有slave 群集都会进入fail状态
(8):Redis cluster 中服务器节点都是用两个TCP端口号:
《1》:6379端口号,用于服务client连接
《2》:16379 端口号:用于群集总线,即使用二进制协议的节点到节点通信通道,节点使用群集总线进行故障检测,配置更新,故障转移授权等,如果开启了防火墙需要注意开放两个端口