分布式缓存Redis_5 Redis集群、主从复制和哨兵模式

                                            分布式缓存Redis

                                       5 Redis集群、主从复制和哨兵模式

                                                                                                                                                                                               田超凡

                                                                                                                                                                                          20191126

 

转载请注明原作者

1 Redis集群实现高可用

在项目正常运行期间,如果因为某种人为误操作或者意外原因导致Redis服务器宕机了,但是我们又不能因为Redis服务故障而影响到整个项目的正常使用,在高并发访问场景下,如果没有预先采用任何容灾举措,那么这种情况Redis就不能正常的提供分布式缓存和分布式数据共享服务了,此时会导致大量请求线程绕过Redis直接去数据库查询,势必也会给数据库服务器带来巨大访问压力,甚至会导致数据库服务也出现问题。

所以,在一个使用了Redis服务器的项目中(尤其是高吞吐量高并发的项目),我们一定要在Redis服务器启用前就使用一系列容灾举措来保证Redis宕机出现问题的影响最小化,提高Redis服务器可用性和健壮性,实现Redis高可用。

Redis集群就是用来保证Redis服务高可用,可以预防和解决Redis宕机影响Redis正常使用的问题。

Redis集群最直观的实现就是同时部署和运行多台Redis服务器,每台Redis服务器除使用了最基本的持久化保障机制外,每个Redis服务器中的数据始终保持同步,这样一来,当其中一台Redis服务器宕机之后,其他存活的Redis服务器就可以迅速替代宕机的Redis服务器,正常对外提供Redis服务,最大化保证了Redis服务高可用。

 

2 Redis集群的特点

Redis集群环境下,除了通俗的理解(多个Redis服务器提供Redis服务外),还具有以下几个显著特征:

  1.  任何时候必须保证至少存在一个redis主机,可以有多个redis从机。(理论上来说redis从机数量一般在2-3台左右,redis从机数量过少,高可用可靠性低,redis从机数量过多,redis数据同步效率低,所以需要综合具体环境搭建符合实际业务场景数量的redis主机和从机)
  2.  redis主机和redis从机的数据始终是同步的。
  3.  redis主机只负责写,redis从机只负责读,完全读写分离。(主从复制)

 

3 Redis主从复制

Redis主从复制是Redis集群环境搭建的一种重要表现形式,是Redis集群环境实现高可用的核心原理。

在Redis集群中,如果一个Redis服务器宕机,那么可以使用其他存活的Redis服务器来代替宕机的Redis服务器实现功能。

在Redis主从复制中,把Redis集群中的Redis服务器分为主机和从机,一个Redis集群中至少有一个主机,可以有多个从机。

Redis主机只负责写,从机只负责读,严格遵循Redis读写分离原则。

在Redis主从复制中,主机会定时同步数据到关联的从机,保证Redis集群各服务器之间的数据一致性。

 

4 Redis主从复制实现策略

Redis主从复制的实现策略有一主一从、一主多从、多主多从、树状主从

 

  1. 一主一从:一个Redis主机和一个Redis从机实现主从复制。

实现方式单一,一个主机只能同步数据到一个从机,如果主机从机都宕机,还是会有服务不可用的问题,考虑的不够全面,这种方式实现主从复制不为常用。

 

  1. 一主多从:一个Redis主机,关联多个Redis从机实现主从复制

一个redis主机对应多个redis从机,把redis主机中的数据同步到多个redis从机,这样的话即使redis主机宕机之后,redis主机关联的从机还是可以继续运行,保证了redis服务的高可用。

这种方式的缺点就是主从复制效率低,因为redis主机需要把数据同步到多个从机,影响性能,关联的从机越多,需要执行的数据同步效率就越低。

 

  1. 多主多从:多个Redis主机,分别关联多个Redis从机实现主从复制

随着项目业务的不断升级衍变,使用一个主机负责写操作已经不是非常完善的解决方案了,此时需要考虑到Redis集群分摊数据的问题,把不同类型业务数据的读写操作再单独拆分(本来Redis集群一主多从只是把写操作和读操作分离),此时就会形成多个Redis主机负责不同业务数据的写操作,每个Redis主机下面的多个Redis从机负责对应Redis主机数据的读操作。

 

  1. 树状主从:一个Redis主机,关联多个Redis从机,使用类似二叉树的形式建立关联关系,每个Redis从机可以作为下一级Redis从机的主机(注意:这里说的Redis从机作为下一级Redis从机的主机只是形式上的客观表现,实际上只有根节点才是Redis主机)

 

注意: 一般最为常用的方式就是使用树状主从搭建1-N个redis主机,每个Redis主机配备2-3个redis从机。这样做的好处就是保证服务高可用的最大化,同时减少数据同步的性能开销,是一种在既定业务规模不改变的情况下,保证服务高可用和提高数据同步性能的最佳方案。

 

5 Redis主从复制实现数据同步

Redis实现主从复制的场景下,Redis主机会定时同步数据到关联它的Redis从机,从而确保Redis集群下Redis服务器的数据一致性。Redis主从复制实现数据同步主要分为以下几个步骤:

  1. Redis从机向Redis主机建立Socket长连接
  2. Redis主机采用全量复制和增量复制的方式把数据同步到Redis从机

注意:

Redis 2.8+ 版本之后才会采用全量复制和增量复制的方式实现Redis主从复制环境下的Redis主机和从机数据同步。

全量复制一般用于在初次的复制场景(从节点与主节点一次建立关联关系,一般是在Redis集群环境初始化的时候执行(Redis主机和从机建立关联后执行),把Redis主机中的数据全部同步到Redis从机

增量复制一般用于网络出现问题或其他因素导致从节点再次连接主节点时,主节点补发缺少的数据到从节点。因为Redis从机和Redis主机建立连接之后,可能会出现各种意外情况导致Redis从机宕机,过一段时间Redis从机又恢复了,此时Redis主机会同步从Redis从机宕机开始,到Redis从机恢复这个时间段之间发生变化的数据到Redis从机。

简单来说,Redis主从复制全量复制和增量复制的区别就是:全量复制在Redis主机和从机建立关联的时候执行,会同步整个Redis主机中的所有数据到Redis从机,增量复制定时执行,只会同步距上一次数据同步之后,Redis主机中发生变化的数据到Redis从机。

 

6 Redis哨兵模式

在Redis主从复制环境下,尤其是在使用树状主从的方式实现主从复制的情况下,一旦由于各种突发情况导致Redis主机宕机,那么剩下的Redis从机就只能读,不能写,此时就需要手动更改存活的Redis从机的配置文件,重新在存活的Redis从机中定义新的Redis主机,重新建立Redis主从复制关联。

对于一个长期运作,需要借助Redis集群处理多线程请求,实现高可用的项目中,如果出现了Redis主机宕机的问题,手动去修改存活的Redis从机的配置文件肯定是不可取的。因为修改Redis从机配置文件就必须重启对应的Redis服务器才能应用新的配置,对于一个运行中的项目而言,重启Redis服务器会破坏Redis集群高可用环境,失去了高可用的意义。

哨兵模式主要用来解决Redis主从复制环境下,Redis主机宕机导致剩余的Redis从机只能读,不能写的问题。

哨兵模式通过对Redis主机定义单独的哨兵来监视Redis主机的运行情况,哨兵模式在确认Redis主机宕机之后,会在剩余存活的Redis从机中进行投票选举,产生新的Redis主机来代替原来的Redis主机,原来的Redis主机也会变为新产生的Redis主机的从机,实现自动化故障发现和故障转移。

Redis哨兵模式和Redis主从复制是两个截然不同的概念。

Redis哨兵模式只能用来解决Redis主机宕机问题,核心是用来实现投票选举,单纯使用Redis哨兵模式并不能实现Redis主从复制。

 

7 哨兵模式实现原理

  1. 哨兵模式每个哨兵只监视Redis主机,每隔10s中会轮询一次Redis主机关联的Redis从机地址列表,获取可能会参与投票选举的Redis从机,主要是基于info replication命令基于发布-订阅模式实现。
  2. 哨兵模式不建议是单机的,对于一个Redis主机最好定义多个Redis哨兵来形成一个哨兵集群进行监视。使用Redis哨兵集群的原因是:一方面尽可能保证Redis主机宕机之后,剩余Redis从机投票选举的公平性。一方面尽可能保证Redis主机宕机状态判定依据的充分性(每个Redis哨兵集群中的哨兵都可以判定一下Redis主机是否宕机,当最终确认Redis主机宕机之后才会进行投票选举)。

注意:Redis哨兵模式中,每个哨兵监视的永远都是Redis主机,每隔10s会通过info命令和发布-订阅模式获取Redis主机关联的所有Redis从机,作为可能会参与投票选举的对象。

  1. Redis哨兵集群判定Redis主机宕机的实现原理是:Redis哨兵集群中的每个Redis哨兵都会ping一下Redis主机,当发现Redis主机长时间无法通信的时候,就会认为该Redis主机客观性宕机。一旦Redis哨兵集群中,判定Redis主机客观性宕机的哨兵数量>=哨兵配置文件中(sentinel.conf)配置的数量参数时,就会确认判定Redis主机已经宕机,此时会进行投票选举,在剩余的Redis从机中选出新的Redis主机,并把已经确认宕机的Redis主机的主机设置为新产生的Redis主机。(子变父,父变子)

8 Redis哨兵集群

在使用Redis哨兵模式的时候,一般情况下建议使用Redis哨兵集群来实现。

使用Redis哨兵集群一方面可以确保Redis主机宕机之后,剩余存活的Redis从机进行投票选举的公平性,一方面尽可能保证Redis主机宕机状态判定条件的充分性(每个Redis哨兵都需要ping一下Redis主机并给出反馈,最终确认Redis主机宕机之后才会进行投票选举)。

Redis哨兵集群的实现原理是:每一个监视Redis主机的哨兵都会把自身的信息发布到Redis通道中(Redis通道可以理解为一个类似注册中心的容器,存放的是Redis哨兵集群中每个哨兵的信息),然后订阅这个Redis通道。当有新的Redis哨兵加入时也会执行这个发布-订阅操作,以此类推,每个发布了自身信息的Redis哨兵都会订阅到新发布到Redis通道的哨兵信息,哨兵和哨兵之间建立长连接,最终形成Redis哨兵集群。

Redis哨兵集群实现的核心思想还是发布-订阅模式。

 

9 Redis主从复制核心配置项

Redis主从复制配置原则是:配从不配主

从节点(slave)相关配置redis.conf

# replicaof <masterip> <masterport>

slaveof 192.168.212.155 6379  指定从节点对应的主节点ip和端口号

masterauth 123456 指定连接到主节点需要使用的密码

 

info replication命令查看当前redis节点信息(master/slave,如果是master,则会显示所有的slave,如果是slave,会显示对应的master)

 

10 Redis哨兵模式核心配置项

cp /usr/redis-5.0.6/sentinel.conf /usr/redis/bin

cd /usr/redis/bin

 

Redis哨兵模式配置文件:sentinel.conf

vi sentinel.conf

sentinel monitor mymaster 192.168.212.155 6379 2  哨兵连接的redis主机,端口号,Redis主机宕机确认判定阀值(判定Redis主机宕机的哨兵数量>=这个阀值,那么Redis主机确认宕机,开始投票选举)

Redis主机宕机确认判定阀值数=配置了Redis哨兵的Redis服务器数量总和(包括master和slave)-1(宕机的Redis主机数)

sentinel auth-pass mymaster 123456 哨兵连接redis主机的密码

 

Redis哨兵模式其他常用配置项:

sentinel down-after-milliseconds mymaster 3000#sentinel心跳检测主3秒内无响应,视为挂掉,开始切换其他从为主(开始投票选举)

sentinel parallel-syncs mymaster 1#每次最多可以有1个从同步主。一个从同步结束,另一个从开始同步。

sentinel failover-timeout mymaster 18000#主从切换超时时间

 

启动每个Redis主机的哨兵:./redis-sentinel ./sentinel.conf

Redis哨兵模式开启后,每个哨兵对应监视的Redis服务器也要重启。

 

 

转载请注明原作者

 

发布了100 篇原创文章 · 获赞 10 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_30056341/article/details/103268025