1、Redis主从架构
单机的Redis,能够承载的QPS大概就在上万到几万不等.对于缓存来说,一般都是用来支撑读高并发的.因此架构做成主从(master-slave)架构,一主多从,主节点负责写,并且将数据复制到其它的从节点,从节点负责读.所有的读请求全部走从节点.这样也可以很轻松实现水平扩容,支撑读高并发.
主从架构的核心思想
-
读写分离
-
水平扩容支撑高并发读
Redis主从复制的两种方式
-
全量复制
当启动一个从节点的时候,如果这是从节点初次连接到主节点,那么会触发一次全量复制.此时master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端新收到的所有写命令缓存在内存中.RDB文件生成完毕后,主节点会将这个RDB发送给从节点,从节点会先写入本地磁盘,然后再从本地磁盘加载到内存中,接着主节点会将这段时间内内记录的写命令也发送到从节点,从节点也会同步这些数据.
-
增量复制
从节点如果出现网络故障,断开了连接,会自动重连,连接之后主节点根据offset来定位需要复制数据的位置,复制从节点所缺少的数据.但是如果从节点重连过程中,主节点已经写入了大量数据,覆盖超过原先的偏移量,如果此时我们还强行的进行增量复制,就会丢失被覆盖掉的那部分数据,这时我们就不能使用增量复制,只能使用全量复制.
2、Redis哨兵模式
sentinel(哨兵)是用于监控Redis集群中节点状态的工具,其本质就是一个独立运行的进程.它主要有以下功能:
-
集群监控:负责监控Redis主节点和从节点是否正常工作.
-
消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员.
-
故障转移:哨兵监控主节点宕机,通过其他哨兵,确认主节点宕机了,如果客观确认主节点挂掉了,就会通知从节点进行选举,将选举出的从节点作为新的主节点.
-
配置中心:如果故障转移发生了,通知客户端新的主节点地址.
Redis哨兵选举机制
一般来说,我把哨兵选举新主的过程总结为"筛选+排序".首先,哨兵会按照一定的筛选机制筛选掉不符合要求的从库,然后从符合条件的从库中进行排序,从而选出新的主节点.
首先先说筛选机制:
-
筛除掉所有处于下线或者断线状态的从服务器,这可以保证剩余的从服务器都是正常在线的.
-
筛除掉所有在规定时间内没有响应哨兵的INFO命令的从服务器,这可以保证剩余的从服务器都是最近成功进行通信的.
-
筛除掉所有与已下线主服务器连接断开超过down-after-milliseconds*10毫秒的从服务器,这样可以保证剩余的从服务器都没有过早地与主服务器断开连接,换句话来说,列表中的从服务器保存的数据都是比较新的.
上述的为筛选机制,接下来排序机制:
-
哨兵会根据从服务器的优先级,对列表中剩余的从服务器进行排序,选出优先级最高的从服务器.
-
若有多个相同最好优先级的从服务器,那么哨兵会按照复制偏移量对具有相同优先级的所有从服务器进行排序,并选出其中偏移量最大的从服务器.
-
若有多个优先级最高、复制偏移量最大的从服务器,那么哨兵将按照运行ID对这些从服务器进行排序,并选出其中运行ID最小的从服务器.
为什么哨兵集群一般都是奇数个节点
选举成为主节点的最低票数为+哨兵节点数/2+1的最大值,如果Sentinel集群有偶数个Sentinel节点,可能出现两个从节点获得到相同票数的情况,这时就没办法选举出新的主节点.
如果Sentinel集群只有2个Sentinel节点,则Leader最低票数至少为2,当该Sentinel集群中由一个Sentinel节点故障后,仅剩的一个Sentinel节点是永远无法成为Leader.
也可以由此可以推导出,Sentinel集群允许1个Sentinel节点故障则需要3个节点的集群;允许2个节点故障则需要5个节点集群.
3、Redis集群模式(Cluster)
-
为什么要Redis-Cluster
Redis的哨兵模式基本已经可以实现高可用,读写分离,但是在这种模式下每台Redis服务器都存储相同的数据,很浪费内存,所以在Redis3.0上加入了cluster模式,实现的Redis的分布式存储,也就是说每台Redis节点上存储不同的内容.
-
什么是Redis-Cluster
Redis-Cluster采用无中心结构,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态.每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据.
-
数据分散存储
Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hashslot)的方式来分配的。Rediscluster默认分配了16384个slot,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,具体算法就是:CRC16(key)%16384.
-
容错机制-投票
为了防止主节点数据丢失,可以为每个主节点可以准备特点数目的备节点,主节点挂掉从节点可以升级为主节点(哨兵模式).
容错机制指的是,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作.故障节点对应的从节点自动升级为主节点,如果某个主挂掉,而没有从节点可以使用,那么整个Redis集群进入宕机状态.