前言
持久化解决了单机redis的数据保存问题,但是redis还是存在以下两个问题:
(1)假如某天这台redis服务器挂了,redis服务将彻底丧失
(2)redis的读和写都集中到一台机上,如果请求量比较大时,将可能被击溃
解决
为了解决上述两个问题,redis提供了主从架构,在主从架构中,主服务器负责写服务,多台从服务器负责读服务,缓解了单个redis服务器的压力;主服务器将所有数据源源不断的同步到从服务器上,一旦主服务器挂了,还有从服务器可以提供服务,redis服务将不会间断。
一、主从复制
1.概念
主从复制是将一台redis服务器的数据,复制到其他redis服务器,数据的复制是单向的,只能主节点到从节点。 默认情况下,每台服务器都是主节点,一个主节点可以有多个从节点,但是一个从节点只有一个主节点。
2.特点
(1)一台主服务器可以连接多台从服务器
(2)从服务器也可以连接其他redis服务器,作为其他redis服务器的主服务器,从而形成一条链
(3)主从复制是异步的,从服务器不会阻塞,但是在数据写到从服务器内存的这段期间,从服务器对外提供的还是旧的数据.
3.作用
(1)数据冗余:主从复制实现了数据的热备份,是持久化的一种数据冗余方式
(2)故障恢复:主节点出现问题,从节点提供服务,实现快速的故障恢复。
(3)负载均衡:在主从复制的基础上,配合读写分离,可以让主节点提供读,从提供写,分但服务器负担,尤其是在写少读多的情况下,可以提高服务器的并发量。
(4)高可用基石:主从复制是集群和哨兵模式的基础。
4.类型
(1)全量同步 指主服务器每次与从服务器同步都是同步全部数据。主服务器持久化数据为一个rdb文件,在此期间用缓存区把所有对主服务器的写操作命令存储起来了,然后再rdb传给从服务器,再把储存起来的命令也传过去;从服务器从接收到的rdb文件加载数据,然后再加载传过来的命令。(一般是第一次从库执行复制)
(2)部分同步 指主服务器每次与从服务器同步都是只同步增量数据。
5.原理
(1)从服务器收到客户端的saveof命令,检查是否存储了主服务器的运行id和复制偏移量。
(2)如果没绑存储,从服务器发送 psync 1命令和主服务器进行一次全量复制,并且保存主服务器发过来的运行id 和 复制偏移量。
(3)如果有存储了,从服务器发送运行id和复制偏移量,主服务器比较运行id是否一致,复制偏移量是否正常,如果不一致或者不正常,进行全量同步。
(4)如果运行id和复制偏移量正常,那么二者进行增量同步,同步根据传过来复制偏移量,到复制缓存区找到对应的字节,并且把该字节对应的之后的命令都同步过去。
二、哨兵模式
1.概念
哨兵也是一个Linux的进程;各个哨兵分布在不同的Linux服务器或者同一个Linux服务器上(一个风险比较大),它们不停的监控redis的主服务器和从服务器与其它的哨兵进程,一旦察觉redis主服务挂了,就会从从服务器中选出一个作为新的主服务器提供服务。
原理:哨兵发送命令,等待redis服务器响应,从而监控多个服务器实例。
2.作用
(1)不断的检查主从架构中的redis服务中正常运行。
(2)如果出现问题会发信息提示你。
(3)如果主服务器挂了的话,会从从服务器中重新选举一台作为主服务器。
3.分类
(1)单哨兵
单哨兵是指只有一个哨兵进程,单哨兵挂了的话,哨兵系统也就挂了。
这里的哨兵有两个作用:
(1)通过发送命令,让redis服务器返回,监控其状态
(2)当哨兵检测到master宕机,会自动切换从机变主机,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让他们切换主机。
(2)多哨兵
多哨兵是指有多个哨兵进程;多哨兵只有一个哨兵挂了不影响哨兵系统继续提供服务。
哨兵怎么知道监控其它哨兵和redis服务?
哨兵每秒钟会向其它哨兵或者redis服务器发送ping命令,根据是否有返回来判断服务是否已经下线。
我们只是在哨兵的配置文件里配置了主服务器信息,但是它怎么知道从服务器信息?
哨兵每十秒钟会向redis主服务器或者从服务器执行info replication的命令,来确认它们的主从关系。
我们没有配置其他哨兵的地址,哨兵怎么知道其他哨兵地址?
哨兵每隔两秒就会向redis主节点的sentinel:hello频道发布哨兵对于主节点的判断以及当前哨兵的信息,其它哨兵也会也会如此,并且从中获取所有的哨兵信息。
确认一台redis服务器下线经历了什么流程? (重点)
哨兵不断的PING redis服务器,当发现服务器超过配置的down-after-milliseconds的时间都没有响应,就会认为这台主观下线;这时候哨兵会向其他哨兵发送is-master-down-by-addr命令询问是否可以标记为客观下线,当认为这台redis服务器主观下线的哨兵超过我们配置的**quorum(一般设为哨兵数量的一半加1)**的值的时候,我们就可以认为这台redis服务器客观下线。为什么还要去询问其他哨兵呢?这是因为哨兵和redis服务器之间没有ping成功也可以能网络之间的问题。
为什么要对哨兵进行领导者选举?
当确定redis服务器确实挂了以后,哨兵要进行故障转移,并且只能有一个哨兵去完成该操作,所以这时候就要选举出一名哨兵来当此重任。那怎么选举呢?
哨兵向其它哨兵发送is-master-down-by-addr除了确认是否机器是否可以下线以外,会有发起选举的作用,其它哨兵收到命令以后,如果如果没有答应其它哨兵的选举请求就会答应该哨兵的请求,当同意(包括自己)的哨兵个数达到quorum,该哨兵就会成为领导者。
怎么完成故障转移?
当确定原来的redis主服务器已经客观下线以后,就会从从服务器中选出一台作为新的主服务器,选择顺序如下:
看配置的slave-priority,如果从服务器不相等,返回最高的那台,如果相同看下一步
看offset,即复制偏移量,如果复制偏移量不同,返回最高那台,如果相同看下一步
看runid,程序id,runid越低可以看做是越早开启,返回越低那台
确定完是哪台从服务器作为新的主服务器以后,会修改新的从服务器的slaveof与各个哨兵的监控的主服务器的地址和ip。