Redis学习之:Redis的主从复制和哨兵机制

1.为什么要主从复制

  • 实现高可用,避免单机节点故障数据丢失
  • 实现读写分离
  • 提升QPS

2.主从复制的特点

  • 一个master可以有多个slave
  • 一个slave只能有一个master
  • 数据流是单向的,从master到slave

3.主从复制的实现

Redis的主从复制实现非常简单,有如下两种方式:

  • 使用slaveof或replicaof命令

假设我们已经在单机上启动了6379、6380两个端口的redis服务,那么可以在从节点6380中执行命令,就可以实现主从复制

slaveof 127.0.0.1 6379
replicaof 127.0.0.1 6379

此时在6379中写入数据,就可以在6380中读取到(注意从节点是不能写入数据的)

  • 配置

在6380的配置文件中做出如下修改:

replicaof 127.0.0.1 6379   # 旧版是salveof
replica-read-only yes

然后重新启动redis服务就可以了

如何取消主从复制,只需要在从节点中执行命令 slaveof no onereplicaof no one

4.主从复制的问题

  • 读写分离
    • 如何将读流量分摊到从节点
    • 复制数据延迟
    • 读到过期的数据
    • 从节点故障,无法进行故障转移
  • 配置不一致
    • 例如maxmemory不一致,造成丢失数据
    • 例如数据结构优化参数(hash-max-ziplist-entries),内存不一致
  • 规避全量复制
    • 第一次启动不可避免的会进行全量复制
    • 节点的运行id不匹配(如主节点发生了重启)
    • 复制积压缓冲区不足(网络中断,部分复制无法满足)
  • 规避复制风暴
    • 主节点重启了,多个从节点复制

5.哨兵机制

对于上面的问题,我们可以引入Redis的哨兵机制进行解决

解决问题

带有自动故障转移的主从式架构,基于主从架构;无法解决主节点并发压力问题

搭建哨兵机制

  • 在之前主从复制架构基础上,新增一个哨兵服务
  • 添加一个配置文件
  vim /root/sentinel.conf 
  写入以下代码
  sentinel monitor mymaster 192.168.2.200 6379 3
  • 启动哨兵服务
  redis-sentinel /root/sentinel.conf 

配置完成后如果主节点宕机,哨兵服务会在从节点中选出一个作为主节点。之前的主节点如果恢复,则只能作为当前主节点的从节点

故障转移

1.从slave节点选出一个合适的节点作为新的master节点
2.对上面的slave节点执行slaveof no one命令让其成为master节点
3.向剩余的slave节点发送命令,让他们成为新的master节点的slave节点,复制规则和parallel-syncs参数有关
4.更新对原来master节点配置为slave,并保持对其关注,当其恢复后命令它去复制新的master节点

什么是合适的slave节点

1.选择slave-priority(slave节点优先级)最高的slave节点,如果存在则返回,不存在则继续
2.选择复制偏移量最大的slave节点(复制的最完整),如果存在则返回,不存在则继续
3.选择runId最小的slave节点

原文地址:https://www.cnblogs.com/xiaoqingtian/p/13642342.html