主从复制+哨兵

主从环境搭建

主节点可以读写,从节点只能读,如果在从节点执行写命令会报错

  1. 每个服务器上准备 download redis

  2. 修改持久化方式为 RDB,关闭 AOF、关闭混合模式(主从节点都需要改)

  3. 启动每个 redis 服务

  4. 配置主从关系

    如果在服务器启动后执行命令完成的配置只是临时的,重启后主从关系会失效,如果写在配置文件中就永久生效

    • 只需要配置从节点,主节点不需要配,每个从节点需要指定主节点的ip和端口,命令如下
    • 5.0 及以前:slaveof <masterip> <masterport>
    • 5.0 以后:slaveof <masterip> <masterport>
  5. 可以使用命令 info replication 查看主从关系

主从同步原理

replid:replication id 简写,数据集的标识,如果标识一致说明是一个数据集,用来判断两个 redis 是否是同一个数据集

offset:数据偏移量(可以理解为数据量的大小),主从节点都会有,判断主节点和从节点的数据量差额,如果过大,说明从节点过于落后主节点,需要更新了

  1. redis 从节点启动后,发送自己的 replid 和 offset 给主节点
  2. 主节点收到同步请求后,判断从节点发过来的 replid 和自己的 replid 是否一致
    • 如果 replid 不一致,说明是第一次同步,需要做全量同步
      • 主节点执行 basave 异步生成 dump.rdb 文件,生成后发送给从节点
      • 从节点收到 rdb 后清空自己的所有数据,保存 rdb 的数据
    • 如果 replid 一致,说明不是第一次同步,需要做增量同步
      • 执行全量同步的过程中主节点可能会有新的写入命令
      • 这些新的写入命令主节点会记录到 rep_baklog 中
      • 等全量同步完成,再把 rep_baklog 的数据发给从节点
      • 从节点保存 rep_baklog 的数据

同步就完成了,后续就是主节点每收到一个写命令就会发送给从节点完成实时同步(这里感觉也可以称为增量同步)

主从哨兵

  1. 当主从复制中的从节点宕机,影响是不大的,因为还有别的从节点,当宕机的从节点重新启动时,会再次全量同步主节点数据。就算从节点全都宕机,主节点是可写可读的,也不影响
  2. 当主节点宕机,从节点依旧可读,但是业务不能写入数据了,哨兵就是用来解决主节点宕机情况的

哨兵作用

  • 监控:不断检查主从节点状态是否正常
  • 自故障恢复:监控发现有主节点发生故障了,在从节点中选举一个节点作为新的主节点,原来的主节点恢复后会成为从节点
  • 通知:当主节点挂了,会产生一个新的主节点,写入的节点地址就变化了,哨兵会通知客户端地址变化

哨兵原理

哨兵也是一个集群,

  • 监控原理

    1. 每个哨兵每个一秒向每个 redis 节点发送 ping 命令,在规定的时间内,收到 pong 响应表示正常,没收到表示主观下线
    2. 超过指定数量(quorum,是配置文件中可配置的参数,如果自定义该值,建议过半)的哨兵都认为某个 redis 节点主管下线,则该 redis 节点表示真的宕机了,要客观下线
  • 故障恢复原理

    也就是当主节点宕机(客观下线)后,怎么选举新的主节点

    1. 判断每个从节点与主节点断开连接的时间,如果超过 down-after-milliseconds*10, 则排除。down-after-milliseconds 是配置文件中可配置的参数
    2. 剩下的节点中,再次判断 slave-priority 的值,值越小优先级越高,如果是 0 表示永不参加选举(默认都是1)
    3. 如果 salve-priority 的值一样,则判断 offset 的值,offset 越大,优先级越高(offset 是从节点每次和主节点同步后随着同步的数据量增加,越大说明和主节点数据越接近 )
    4. 如果上面三点排出后,还是有多个候选从节点,这时没有别的筛选条件了,随便选一个(哨兵的做法是找运行id最小的)

    新的主节点确定了,要告知每个节点(也叫故障转移)

    1. 给新主节点发送 slaveof no one 命令,让新节点不要再做从节点了
    2. 给别的从节点发送 slaveof 新主节点ip 新主节点端口,让其他从节点开始到新的主节点同步数据
    3. 哨兵会修改故障节点(原来的主节点)配置文件,写入 slaveof 新主节点ip 新主节点端口,当故障节点重启后自然而然就是从节点了

主从哨兵环境搭建

  1. 为每个 redis 节点创建一个用户哨兵工作的目录,假设 3 个 redis 的目录为 s1、s2、s3

  2. 每个目录中创建一个配置文件(sentinel.conf)内容如下

    # 当前哨兵的端口(如果同一台服务器下注意端口不要重复)
    port 27001
    
    # 当前哨兵所在服务器的ip,如果当前服务器只有一个ip这个配置不是必选项,当服务器有多个ip的时候需要
    sentinel announce-ip 192.168.x.x
    
    # redis 主节点地址,mymaster 作为哨兵集群名称,自定义;ip和端口是主节点的;最后面的 2 是上面说的 quorum,选举用
    # 只监控主节点就好了,不是不监控从节点,因为从节点信息可以到主节点获取
    sentinel monitor mymaster 192.168.x.x 6379 2
    
    # 用于故障监控(哨兵向节点发送 ping,超过这个时间未收到 pong 响应,视为客观下线)
    sentinel failover-timeout mymaster 60000
    
    # 用于选举新主节点(如果某个从节点与主机断开连接的时间 > 这个时间*10 这个节点不会被选为新的主节点)
    sentinel down-after-milliseconds 5000
    
    # 哨兵工作目录(保存哨兵的文件程序日志等等,因为是在进入到工作目录创建的配置文件,所以当前目录就是工作目录)
    dir "./"
    
  3. 启动哨兵(在哨兵的工作目录运行命令),确保 redis 已经启动

    # redis-sentinel 是 redis 带来的(也就是执行 redis 下的 redis-sentinel 可执行文件)
    # sentinel.config 是刚才创建的哨兵配置文件,直接 cd 到工作目录,文件就在当前文件夹,所以指定文件直接写文件名就行
    redis-sentinel sentinel.config
    
posted @ 2023-06-28 17:55  CyrusHuang  阅读(32)  评论(0)    收藏  举报