nacos集群的ap cp切换_Redis集群篇之主从复制、哨兵模式

  很多人都知道redis支持高并发,单节点可以支持10w/s的高并发。在实际生产使用环境中,除了追求高并发外,通常还要求高可用。这也就是redis集群的由来。

 分布式中存在一个CAP理论的概念。

  C代表Consistent 一致性 

  A代表 Availability 可用性 

  P代表 Partition tolerence 分区一致性

  分布式系统一般都部署在多台服务器上,这也就意味着肯定会发生网络断开的风险。也就是说发生网络断开的时候,两台服务器间的数据一致性或者是否可用不能够同时满足。所以分布式系统中一般都是追求满足AP或者CP的服务。

69482199e198eb85398f7b764ebc81fc.png

 Redis主从服务就是AP的了。当网络分区发生的时候,主从节点都可以对外提供服务。网络分区消除的时候,从节点会继续同步主节点产生的不一致数据。

同步有分为全量同步和增量同步,全量同步呢?就是redis此时此刻生成一个快照,把快照导入从服务器。全量同步一般会占用一定的资源。

增量同步呢?就是主节点10秒内修改了什么内容,从节点把这些内容同步过去。Redis同步的是指令流。主节点会把新增、修改、删除的指令记录到本地的buffer中,然后通过异步把buffer传到从节点。但是内存中的buffer是有限的,所以我们可以把redis的buffer想象成为一个buffer环,如果环满了,前面的内容就会被覆盖。于是主从断开时间过长的话,从节点就无法使用指令流的方式进行主从同步了,必须使用快照的方式。

   主从同步的时候,主服务发送指令集的命令在半路丢失了。那么redi提供了一个REPLCONF ACK功能,从服务器会向主服务器发送指令,核对自身的偏移量。当两者的偏移量存在相差的时候,主服务器会补发缺失的数据。

bc27046d030b0bfb0fabb32c9656b009.png

我们来探讨下redis的哨兵模式。 

  存在一种情况,主从模式下假如主节点宕机了,怎么办呢?还需要程序员人为的去重启、分配主节点。那就不能存在一种方式,机器自己去配置主节点吗?哨兵模式也就应运而生。

  顾名思义。哨兵就是存在一个单独的部门(程序),专门用来做放哨使用。通过放哨来监控redis各个节点的状态。

457ecd3e147a445cb67a91ab0c60730e.png

Sentinel 负责监控主从节点的健康,当主节点挂掉后,Sentinel会选择一个最优的从节点切换成主节点。

    主观下线:当第一个哨兵发现主节点宕机后,此时当前redis节点为主观下线

    客观下线:当三分之二的哨兵都认为此主节点宕机后,此时当前的redis节点为客观下线

Sentinel选举算法:

   当redis的节点宕机后,sentinel会进行故障转移,在这个时候所有的哨兵都拥有选举权,而且是发现主服务器进入客观下线的哨兵会要求其他哨兵选举自己,哨兵选举是遵守先到先得的原则。获取的票数大于半数,则此哨兵成为主节点。

   redis哨兵模式的故障转移分为三大步:

   1、从节点选择一个节点转换为新的主节点。

   2、已下线主节点的从节点与新的主节点建立主从同步。

   3、已下线的主节点降级为从服务器。

 客户端连接集群的时候,会首先连接sentinel通过查询主节点信息,然后连接主节点进行数据的交互。进行故障转移后,客户端从哨兵里面获取到新的主节点信息。

除此之外,redis哨兵模式还会执行心跳检测。

dd23ec160928be9b34f2d806cbfb092a.png

我是凯腾凯,互联网浪潮下一枚苟且偷生的程序员。