05 03 2022

前言

一、主从复制模式

基本原理

主从复制模式包含一个主数据库实例(master),一个或多个从数据库实例(slave)

客户端可以对主数据库进行读写操作,对从数据库只能进行读操作,主数据库写入的数据会实时自动同步给从数据库。
具体的步骤为:

  1. slave启动后,向master发送SYNC命令,master接收到SYNC命令后通过bgsave命令保存快照(RDB持久化),并使用缓冲区记录保存快照这段时间内执行的写命令。
  2. master将保存的快照文件发送给slave,并继续记录执行的写命令。
  3. slave接收到快照文件后,加载快照文件,载入数据。
  4. master快照发送完后开始向slave发送缓冲区的写命令,slave接收命令并执行,完成复制初始化。
  5. 此后master每次执行一个写命令都会同步发送给slave,保持master与slave之间数据的一致性。

命令的不同

save和bgsave两个命令都会调用rdbSave函数,但它们调用的方式不同:
save命令直接调用rdbSave ,阻塞Redis主进程,直到快照保存完成为止。(在主进程阻塞期间,服务器不能处理客户端的任何请求)
bgsave则fork出一个子进程,子进程负责调用rdbSave,并在保存完成之后向主进程发送信号,通知保存已完成。(Redis服务器在bgsave执行期间仍然可以处理客户端的请求)

优点

  1. master能自动将数据同步到slave,并且读写分离,可以分担master的读的压力。
  2. master和slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以处理客户端请求。

缺点

  1. 不具备自动容错与恢复功能,master或slave的宕机都可能导致客户端请求失败,需要等待机器重启或手动切换客户端IP才能恢复。
  2. master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题。
  3. 难以支持在线扩容,Redis的容量受限于单机配置。

二、哨兵模式(Sentinel)

基本原理

哨兵模式基于主从复制模式,只是引入了哨兵来监控与自动处理故障。(自动推选老大的模式)
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会相互监控,这样就形成了多哨兵模式。


具体步骤为:

  1. 假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover[故障转移]过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。
  2. 当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票。
  3. 投票的结果由一个哨兵发起,进行failover[故障转移]操作。
  4. 切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。

哨兵的作用

  1. 通过发送命令,让Redis服务器返回,监控其运行状态,包括主服务器和从服务器。
  2. 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

优点

  1. 哨兵集群,基于主从复制模式,所有的主从配置优点,它全有。
  2. 主从可以切换,故障可以转移,系统的可用性就会更好。
  3. 哨兵模式就是主从模式的升级,手动到自动,更加健壮。

缺点

  1. 难以支持在线扩容,Redis的容量受限于单机配置。
  2. 实现哨兵模式的配置很复杂,并且需要额外的资源来启动哨兵进程。

三、Cluster模式

基本原理

(以上两种模式,存在难以在线扩容,Redis容量受限于单机配置的问题)
Cluster模式实现了Redis的分布式存储,即每台节点存储不同的内容,来解决在线扩容的问题。

Cluster模式的特点(采用无中心结构)

  1. 所有的redis节点相互连接(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效。
  3. 客户端与redis节点直连,不需要中间代理层;客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
    (当Redis节点收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis节点地址返回给客户端,客户端收到后自动将原请求重新发往这个地址)

Cluster模式的具体工作机制

在Redis的每个节点上,都负责维护一部分插槽(以及槽所映射的键值数据)(slot),取值范围为0-16383(16384个插槽)
当我们存取key的时候,Redis会根据CRC16的算法得出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,
通过这个编号,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

为了保证高可用,Cluster模式也引入主从复制模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。
当其它主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。如果主节点A和它的从节点都宕机了,那么该集群就无法再提供服务了。
Cluster模式集群节点最小配置6个节点(3主3从,因为需要半数以上),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。

优点

  1. 可线性扩展到1000多个节点,节点可动态添加或删除。
  2. 能够实现自动故障转移,节点之间通过gossip协议交换状态信息,用投票机制完成slave到master的角色转换。

缺点

  1. 数据通过异步复制,不保证数据的强一致性。
  2. slave充当“冷备”,不能缓解读的压力。
  3. 不支持多数据库空间,单机redis可以支持16个db,集群模式下只能使用一个,即db0
  4. 对于像批量操作、事务操作等的支持性不够好。
    (批量操作限制,目前只支持具有相同slot值的key执行批量操作,对mset、mget、sunion等操作支持不友好)
    (key事务操作支持有线,只支持多key在同一节点的事务操作,多key分布不同节点时无法使用事务功能)

注意:Redis Cluster模式不建议使用pipeline和multi-keys操作,减少max redirect产生的场景。

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

延伸阅读
    发表评论
    提交留言
    • 啊林林林
      啊林林林 chrome/96.0.4664.45

      [[嘻嘻]]


    • 啊林林林
      啊林林林 chrome/96.0.4664.45

      tcp


    打开微信,点击底部的“发现”,
    使用“扫一扫”即可将网页分享至朋友圈。
    确 定