Redis-事务&事件&复制过程&sentinel(哨兵)详解

事务:

一个事务包含了多个命令,事务中所有的命令都会系列化,按顺序的执行,服务器在执行事务期间,不会改去执行其它客户端的命令请求。
事务是一个原子性操作,要么全部被执行,要么都不执行。
事务中多个命令被一次性发送给服务器,而不是一条一条发送,这种方式被称为流水线,它可以减少客户端与服务端之间的网络通信次数从而提升性能。
redis最简单的事务实现方式是使用multi和exec命令将事务操作包围起来。
redis不支持事务回滚

redis命令:

Redis-事务&事件&复制过程&sentinel(哨兵)详解_第1张图片

  • watch监控:类似于乐观锁,事务提交时,如果key的值被别的用户改变,那么整个事务队列都不会被执行。

事件:

redis服务器是一个事件驱动程序。

文件事件:

服务器通过socket与客户端或者其它服务器进行通信,文件事件就是对套接字操作的抽象。
Redis基于Reactor模式开发了自己的网络事件处理器,使用IO多路复用来同时监听多个socket,并将到达的事件传送给文件事件分派器,分派器会根据socket产生事件的类型调用响应的事件处理器。
Redis-事务&事件&复制过程&sentinel(哨兵)详解_第2张图片

时间事件:

服务器有一些操作需要在给定的时间点执行,时间事件是对这类定时操作的抽象。分为:

  • 定时事件: 让一段程序在指定的时间内执行一次。
  • 周期性事件:让一段程序每隔一段时间就执行一次。

事件调度与执行

服务器需要不断监听文件事件的套接字才能得到待处理的文件,但是不能一直监听,否则事件事件无法在规定的事件内执行,因此监听时间应该根据距离最近的时间事件来决定。
Redis-事务&事件&复制过程&sentinel(哨兵)详解_第3张图片

复制:使用RDB快照持久化

通过使用 slave of host port 命令来让一个服务器成为另一个服务器的从服务器。
一个从服务器只能有一个主服务器,并且不支持主主复制

连接过程:

  1. 主服务器创建快照文件,发送给从服务器,并在发送期间使用缓冲区记录执行的写命令。快照文件发送完毕后,开始向从服务器发送存储缓存中的写命令
  2. 从服务器丢弃所有旧数据,载入主服务器发来的快照文件,之后从服务器开始接收主服务器发来的写命令。
  3. 主服务器每执行一次写命令,就向从服务器发送相同的写命令。

主从链:

随着负载不断上升,主服务器可能无法很快更新所有从服务器,或者重新连接和重新同步从服务器将导致系统给超载。为了解决这个问题,可以创建一个中间层来分担主服务器复制工作。中间层服务器是最上层服务器的从服务器,又是最下层服务器的主服务器。
Redis-事务&事件&复制过程&sentinel(哨兵)详解_第4张图片

sentinel(哨兵) :可以实现redis高可用特性

sentinel可以监听主服务器,并在主服务器下线时,自动从 从服务器选举出新的主服务器。通过心跳模式监听服务器状态。
sentinel默认会以十秒一次的频率,通过命令连接向被监视的主服务器发送INFO命令,可以得到以下信息:

  • 主服务器本身信息。
  • 主服务器下面所有从服务器信息。当出现新的从服务器时,sentinel除了为新的从服务器创建相应的实例结构外,还会创建命令连接和订阅连接。
    Redis-事务&事件&复制过程&sentinel(哨兵)详解_第5张图片
监视同一台服务器的sentinel

当sentinel通过频道信息发现新的sentinel时,不仅会为新sentinel在sentinels字典树中创建相应的实例结构,还会创建一个连向新的sentinel的命令连接。新的sentinel同样也会做这些。只创建命令连接,不创建订阅连接
Redis-事务&事件&复制过程&sentinel(哨兵)详解_第6张图片

心跳模式:

以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器,,从服务器,其它sentinel在内)发送ping命令,并通过实例返回ping命令回复来判断实例是否在线。

下线状态:

当一个sentinel将一个主服务器判断为主管下线后,为了确保是否真的下线。会向同样监视这台服务器的sentinel进行询问。

选举领头sentinel

当一个主服务器被判断为客观下线后,监视这台主服务器的各个sentinel会进行协商,选举出一个领头sentinel,并由领头sentinel对下线主服务器进行故障转移操作。

  • 每个sentinel都有被选举的资格。
  • 每次进行sentinel选举后,不论选举是否成功,所有sentinel的配置纪元都会自增一次。配置纪元实际是一个计数器。在一个配置纪元里,当某个sentinel被设置为领头sentinel,那么这个配置纪元内,将不能在被修改。
  • 每个发现主服务器客观下线的sentinel都会要求别的sentinel将自己设置为局部领头sentinel。
  • 采用先到先得规则,只将第一个请求设置为领头sentinel,并拒绝其它sentinel的请求。
  • 只要一个sentinel被半数以上的sentinel设置为局部领头sentinel,那么这个sentinel就会成为领头sentinel。
  • 若给定时限没有选举出sentinel。那么将在一段时间后再次选举。
故障转移:

选举出领头sentinel之后,领头sentinel对已下线主服务器执行故障转移操作。

  • 在已下线主服务器的从服务器中,挑选出一个从服务器,并将其转换为主服务器。
    Redis-事务&事件&复制过程&sentinel(哨兵)详解_第7张图片
  • 让其它从服务器改为复制新的主服务器。
    Redis-事务&事件&复制过程&sentinel(哨兵)详解_第8张图片
  • 将已下线的主服务器设置为新的主服务器的从服务器。
    Redis-事务&事件&复制过程&sentinel(哨兵)详解_第9张图片

你可能感兴趣的:(Redis)