Redis06-主从复制、哨兵模式

1、主从复制概述

  • Redis 主从复制是指 将一个 Redis 实例(Master)的数据实时同步到其他 Redis 实例(Slave) 的机制。
  • 主从架构中,aster负责处理写请求(SET、DEL 等),数据变更后同步给 Slave。Slave,复制 Master 的数据,默认只处理读请求(GET 等),可配置为只读或可写(不推荐)。

功能

  • 数据冗余,Slave 是 Master 的数据备份,避免单点故障导致数据丢失。
  • 读写分离,读请求分流到 Slave,减轻 Master 压力(适合读多写少场景)。
  • 高可用基础,主从复制是 Redis Sentinel 和 Cluster 实现高可用的基础组件。
  • 灾难恢复,若 Master 宕机,可手动或自动(通过 Sentinel)将 Slave 提升为新 Master。
  • 负载均衡,多个 Slave 可分担读请求,提升系统吞吐量。

常用架构

  • 一主一从、一主多从、主从从
  • redis不支持主主复制

2、配置redis主从复制

使用配置文件配置(永久生效)

replicaof <master-ip> <master-port>  # Redis 5.0+ 使用 replicaof,旧版用 slaveof
masterauth <password>                # 若 Master 有密码,需配置
replica-read-only yes                # Slave 默认只读(推荐)

运行时配置(临时生效)

redis-cli REPLICAOF <master-ip> <master-port>  # 设置为从节点
redis-cli CONFIG SET replica-read-only yes     # 开启只读

查看主从配置信息

info replication

更换主服务器

  • 场景:AB为主从,A坏了,用C代替
  • 思路:向B发送SAVE命令,生产快照文件,传给C,启动C,将B的主库指向C
# 主机B上操作
redis-cli
SAVE
scp /usr/local/redis/dump.rdb root@C:/usr/local/redis/

# 主机C上操作
redis-server start

# 主机B上操作
SLAVEOF C的IP 6379

3、主从复制过程说明

1.slave连接master,发送sync命令
2.master收到sync命令后,开始执行bgsave命令生成RDB文件并使用缓冲区来记录此后执行的所有写命令
3.masterbgsave执行完毕后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
4.slave收到快照文件后丢弃所有旧数据,载入收到的快照
5.master快照发送完毕后开始向从服务器发送缓冲区中的写命令
6.slave完成对快照的载入后,开始接收命令请求,并执行来自主服务器缓冲区的写命令

此后master每执行一个写命令,就向slave发送相同的写命令
如果 master 同时收到多个 slave 发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有 slave。

Redis主从同步策略

主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步

主从复制特点

1.采用异步复制;
2.master可以有多个slave;
3.每个slave可以接收来自其他slave连接;
4.主从复制不阻塞master;
5.主从复制不阻塞slave,这意味着,主从复制过程中slave仍可以返回查询请求,返回的数据可能是旧的,如果你不想这样,那么在启动redis时,可以在配置文件中进行设置,那么slave在主从同步过程中接收的查询请求将返回错误给客户端;
6.slave从master同步最新数据后,写入内存的过程中有阻塞
7.可以配置让master不将数据持久化到本地磁盘,而是持久化到一台slave的磁盘上,可以减轻master的磁盘压力,不过这样会存在一个问题,master服务器一旦重启,master的数据被清空,通过主从同步可能导致slave上的数据也被清空;

redis2.8之前使用sync[runId][offset]同步命令,redis2.8之后使用psync[runId][offset]命令。两者不同在于,sync命令仅支持全量复制过程,psync支持全量和部分复制。

runId:每个redis节点启动都会生成唯一的uuid,每次redis重启后,runId都会发生变化。
offset:主节点和从节点都各自维护自己的主从复制偏移量offset,当主节点有写入命令时,offset=offset+命令的字节长度。从节点在收到主节点发送的命令后,也会增加自己的offset,并把自己的offset发送给主节点。这样,主节点同时保存自己的offset和从节点的offset,通过对比offset来判断主从节点数据是否一致。

repl_backlog_size:保存在主节点上的一个固定长度的先进先出队列,默认大小是1MB。(1)主节点发送数据给从节点过程中,主节点还会进行一些写操作,这时候的数据存储在复制缓冲区中。从节点同步主节点数据完成后,主节点将缓冲区的数据继续发送给从节点,用于部分复制。(2)主节点响应写命令时,不但会把命名发送给从节点,还会写入复制积压缓冲区,用于复制命令丢失的数据补救。

4、哨兵模式

概述

  • Redis Sentinel 是 Redis 官方提供的 高可用性(HA)解决方案,用于自动监控、故障检测和主从切换
  • 监控 Redis 主从节点的健康状态。
  • 当 Master 宕机时,自动选举一个 Slave 提升为新 Master。

架构角色

  • Sentinel 节点:独立运行的进程(不存储数据),通常部署 3个以上(避免脑裂)。
  • Redis 主从节点:数据存储节点,由 Sentinel 监控和管理

配置哨兵模式

  • 多个Sentinel节点的部署方法是完全一致的(端口不同),下面以sentinel-1节点的部署为例子进行说明
vim /etc/sentinel.conf
port 26379
dir /apps/redis/data_26379
sentinel  auth-pass redis51 passwd                #设置连接主库的密码,若主库有密码加上这一行
sentinel monitor mymaster 192.168.14.101 6379 2   #sentinel monitor 被监控的名称 IP 端口号  2表示sentinel集群中至少2台认为master宕机,就failover
sentinel auth-pass mymaster
sentinel down-after-milliseconds mymaster 30000   #30秒ping不通主节点的信息,主观认为master宕机
sentinel failover-timeout mymaster 180000         #故障转移开始,三分钟内没有完成,则认为转移失败
sentinel parallel-syncs mymaster 1                #故障转移后重新主从复制,1表示串行,>1并行

redis-sentinel  /myredis/sentinel.conf  # 启动哨兵
  • 主观下线与客观下线
    主观指的是单台哨兵服务器检测到master宕机
    客观指检测到master宕机的哨兵达到一定数量后,执行failover
posted @ 2024-05-10 10:33  立勋  阅读(51)  评论(0)    收藏  举报