万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • Redis

  • 集群架构

    • Redis主从模式
      • 主从配置
      • 主从作用
      • 主从原理与实现
    • Redis Sentinel 集群部署
    • Redis集群分区
    • 缓存架构设计
    • 分布式缓存问题
    • Redis分布式锁
  • Redis
  • 集群架构
2022-03-31
目录

Redis主从模式

# Redis主从模式

我们知道单机的Redis是无法保证高可用性的,一旦Redis服务器宕机后,即使在有持久化的机制下也无法保证不丢失数据。

通常,采用Redis多机和集群的方式来保证Redis的高可用性。

下文讲Redis的主从模式。

# 主从配置

Redis支持一主一从、一主多从、从传递复制,通过执行replicaof(Redis5之前是slaveof)命令或者在配置文件中设置replicaof(Redis5之前是slaveof)来开启主从复制功能。

master_slave1.png

配置主从时,主Redis无需进行特殊的配置,从Redis需要修改redis.conf配置文件:

 # 当前【从服务器】对应的【主服务器】的IP是127.0.0.1,端口是6379。 
 # slaveof <masterip> <masterport>
 replicaof 127.0.0.1 6379

这里是我伪生产,在虚拟机新建了一个Redis实例6380(安装参考这里 (opens new window),这里不再赘述),进行主从配置后,可以执行info replication检查主从复制情况:

127.0.0.1:6379> info replication
# Replication
role:master # 主节点
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=742,lag=0 # lag网络延迟
master_replid:0aa75695a9fd13040fc3447feadaa62109715c22
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:742
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:742

127.0.0.1:6380> info replication
# Replication
role:slave # 从节点
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:630
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:0aa75695a9fd13040fc3447feadaa62109715c22
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:630
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:630

# 主从作用

一主多从,主从同步主要的作用就是可以读写分离、数据容灾。

  • 读写分离:主负责写,从负责读,提升Redis的性能和吞吐量。(容忍主从的数据一致性问题)
  • 数据容灾:从机是主机的备份,默认情况下主机宕机后,从机不可为主机,但是可以利用哨兵Sentinel可以实现主从切换,做到高可用。

# 主从原理与实现

下面主Redis称为master、从Redis统称slaver。

# 复制过程

主从的复制流程可以划分为保存主信息、建立连接、同步数据集、命令传播四步。

# 保存主信息

当配置了slaver配置了master的信息,slaver服务器会将master服务器的信息(IP、端口)保存到redisServer的masterhost和masterport中。接下来就准备开始复制工作。

Struct redisServer{ 
  // ......
  char *masterhost; // 主服务器ip 
  int masterport; // 主服务器端口 
  // ......
} ;

# 建立连接

在保存主服务器信息后,主从之间会建立socket连接。过程包括ping-pong确认连接、权限验证、发送slaver端口。

master_slave2.png

slaver向master发送ping命令(检测socket的读写状态,检测master能否正常处理),master正常响应pong(有可能返回错误或timeout)。

master_slave4.png

主从正常连接后,后续进行权限验证,主要是密码,从的masterauth=主的requirepass或者从通过auth命令向主发送密码。

master_slave5.png

在身份验证步骤之后,slaver服务器将执行命令REPLCONF listening-port,向master服务器发送从服务器的监听端口号。

master_slave6.png

当完成这些步骤后,master服务器会accept从服务器Socket连接后,创建相应的客户端状态。也就是slaver服务器相当于master服务器的Client。建立好连接之后,主从之间就准备开始同步数据。

master_slave3.png

# 同步数据集

主从同步数据,Redis 2.8以前使用SYNC命令同步复制,Redis 2.8之后采用PSYNC命令替代SYNC,开始有全量同步和增量同步。

在同步完数据集后,后面都会进入命令传播阶段。

# Redis 2.8以前-清空覆盖

Redis 2.8以前,使用SYNC命令同步复制,同步操作步骤如下:

  1. 从服务器发送到SYNC命令给主服务器
  2. 主服务器生成RDB文件并发送给从服务器,同时发送保存所有写命令给从服务器
  3. 从服务器清空之前数据并执行解释RDB文件
  4. 短暂数据保持一致性,后续通过命令传播保持

master_slave7.png

Redis 2.8以前,没有全量同步和增量同步的概念,从服务器在同步时会清空所有数据,主从服务器断线后,主服务器会重新生成RDB文件和重新记录缓冲区的所有命令,并全量同步到从服务器上。我们可以理解为清空覆盖。

# Redis 2.8以后-全量&增量

在Redis 2.8之后使用PSYNC命令,具备完整重同步和部分重同步模式,即分为全量同步和增量同步。

只有从机第一次连接上主机是全量同步,断线重连有可能触发全量同步也有可能是增量同步( master 判断 runid 是否一致),除此之外的情况都是增量同步。

master_slave8.png

Redis 的全量同步过程主要分三个阶段:

  1. 同步快照阶段: master 创建并发送RDB快照给 slave , slave 载入并解析快照。 master 同时将此阶段所产生的新的写命令存储到缓冲区。
  2. 同步写缓冲阶段: master 向 slave 同步存储在缓冲区的写操作命令。
  3. 同步增量阶段: master 向 slave 同步写操作命令。

master_slave9.png

Redis 增量同步主要指slave完成初始化后开始正常工作时, master 发生的写操作同步到 slave 的过程。通常情况下, master 每执行一个写命令就会向 Slave 发送相同的写命令,然后 Slave 接收并执行,即使断线重连,也是从最近的同步开始继续同步。

# 命令传播

当同步数据完成后,主从服务器就会进入命令传播阶段,主服务器只要将自己执行的写命令发送给从服务器,而从服务器只要一直执行并接收主服务器发来的写命令。

# 心跳检测

在命令传播阶段,从服务器默认会以每秒一次的频率向主服务器发送命令:

replconf ack <replication_offset> 
# -- ack: 应答 
# -- replication_offset:从服务器当前的复制偏移量

主要作用有三个:

  • 检测主从网络连接状态:通过向主服务器发送info replication命令,可以列出从服务器列表,可以看出从最后一次向主发送命令距离现在过了多少秒。lag(的值应该在0或1之间跳动,如果超过1则说明主从之间的连接有故障)。

  • 辅助实现min-slaves:Redis可以通过配置防止主服务器在不安全的情况下执行写命令

    # min-slaves-to-write 3 
    # min-slaves-max-lag 10
    min-replicas-to-write 3
    min-replicas-max-lag 10
    

    上面的配置表示:从服务器的数量少于3个,或者三个从服务器的延迟值都大于或等于10秒时,主服务器将拒绝执行写命令。这里的延迟值就是上面info replication命令的lag值。

  • 检测命令丢失:如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发送REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器。(增量补发机制)

上次更新: 5/30/2023, 11:42:20 PM
Redis Sentinel 集群部署

Redis Sentinel 集群部署→

最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式