Redis 主从同步

一、Redis 主从同步介绍

Redis 是一个开源的内存数据库,用 C 语言编写,支持多种数据结构,如字符串、哈希表、列表等。Redis 使用异步 IO,在内存中存储数据,非常适用于缓存和实时数据分析等场景。Redis 的主从同步机制是实现高可用架构的重要组成部分。

Redis 主从同步,一般指一主多从的同步模式,其中主节点负责写入数据,从节点负责读取数据并保持和主节点数据的同步。在这种模式下,主节点将写入数据同步到所有从节点,从而实现数据的备份、读取负载均衡和故障切换等功能。

Redis 的主从同步采用异步复制方式,从节点会定期发送同步请求给主节点,主节点在接收到同步请求后会将当前的数据快照和写入操作异步推送到从节点。从节点会先接收到全量同步,之后再接收到增量同步,从而把自己的数据与主节点的数据保持同步。

二、Redis 主从同步配置

在 Redis 中,实现主从同步需要进行一些配置。首先,需要在主节点和从节点之间建立连接,然后在主节点上进行配置,启用主从同步功能,设置从节点的 IP 和端口号。

具体的配置步骤如下:

# 在主节点上配置
slaveof master_ip master_port

# 在从节点上配置
# 如果主节点和从节点不在同一台机器上,需要设置主节点的 IP 和端口号
# 如果主节点和从节点在同一台机器上,则不需要设置
replicaof master_ip master_port

其中,slaveof 命令用于在主节点上配置从节点,replicaof 命令用于在从节点上配置主节点。在配置完成后,从节点会自动连接到主节点,并开始数据同步。

三、Redis 主从同步实现原理

Redis 的主从同步实现依赖于复制和命令传播两个模块。

复制模块

复制模块由同步源和同步目标两个部分组成,同步源即主节点,同步目标即从节点。同步源在接收到同步请求后,会将当前执行的写命令内容和参数进行序列化,并发送给同步目标,从而实现数据的同步。

// 同步请求处理实现
void syncCommand(client *c) {
    // 序列化当前执行的写命令并发送给同步目标
    replicationFeedSlaves(c->db->id, &c->argv, c->argc);
    c->flags |= CLIENT_MASTER_FORCE_REPLY;
    addReply(c, shared.ok);
}

命令传播模块

当主节点执行写入命令时,需要将命令发送给所有从节点进行同步。消息的发送有两种方式:异步复制和主节点判断从节点已经收到的可靠复制。

在异步复制方式中,主节点将命令发送给所有从节点,并返回结果。在写入数据前,主节点会将写操作添加到写命令 AOF(append-only file)文件中,从节点会定期读取 AOF 文件,从而保持和主节点数据的一致性。

// AOF 文件写操作实现
int flushAppendOnlyFile(int force) {
    ...
    if (server.aof_selected_db->dirty == 0) {
        ...
        return C_OK;
    }
    // 将 AOF 文件和复制缓存中的内容发送给所有从节点
    feedSlaves(ALL_SLAVES,server.delCommand,c->db->id,c->argv,c->argc,"del",OBJ_SHARED_INTEGERS[2]->ptr);
    ...
    // 将写操作添加到 AOF 文件中
    addReply(c,shared.ok);
    writeCommandsVectorLenToFile(c->db->id,c->argv,c->argc);
    ...
}

在可靠复制方式中,主节点根据从节点的复制缓冲区中保存的 offset 和 ACK 信息来判断哪些命令已经被从节点接收并执行。主节点会等待从节点的 ACK 信息后,再执行后续操作。

// 可靠复制方式实现
void syncWithMaster(void) {
    while(1) {
        // 读取主节点发送的命令并执行
        if (syncReadLine(reply,buf,PROTO_REPLY_CHUNK_BYTES,maxlen,&rlen) == -1) goto cleanup;
        if (rlen == 0) goto cleanup;
        if (buf[0] == '-') {
            // 命令出错,中止同步
            ...
        } else if (buf[0] == '+') {
            // 命令执行成功,继续同步
            ...
        } else if (buf[0] == '*') {
            // 命令包含多个回复,解析后继续同步
            ...
        } else if (buf[0] == '$') {
            // 命令结果为 BulkString 类型,解析后继续同步
            ...
        } else if (buf[0] == ':') {
            // 命令结果为 Integer 类型,解析后继续同步
            ...
        }
        // 发送 ACK 信息给主节点
        if (write(sfd,"+",1) != 1) goto cleanup;
    }
}

四、Redis 主从同步流程

Redis 主从同步流程可以分为全量同步和增量同步两个阶段。

全量同步

全量同步也叫 initial sync,是主从节点第一次进行同步时使用的同步方式。全量同步会在从节点启动时自动触发,主节点会将当前的数据快照和写命令推送给从节点,从节点会接收到全量同步数据并进行加载,之后再接收增量同步。

具体的全量同步流程如下:

  1. 从节点请求主节点进行全量同步
  2.     # 在从节点上执行
        SLAVEOF master_ip master_port
        
  3. 主节点返回 RDB 快照文件
  4.     # 主节点发送 RDB 快照文件
        $redis-benchmark -t set -n 100000 -r 100000 -D redis-master
        
  5. 从节点加载 RDB 快照文件,并接收增量同步

增量同步

增量同步也叫 partial sync,是在全量同步完成后进行的同步方式。增量同步会在主节点执行写入操作后,将写入操作推送给所有从节点,从节点接收到写入操作后进行同步。

具体的增量同步流程如下:

  1. 从节点连接主节点,并请求进行数据同步
  2.     # 在从节点上执行
        SLAVEOF master_ip master_port
        
  3. 主节点接收到同步请求,并推送写入命令给所有从节点
  4.     # 主节点推送命令给所有从节点
        SET key value
        
  5. 从节点接收到命令并执行

五、Redis 主从同步优化

为了提高 Redis 主从同步的效率和稳定性,我们可以进行一些优化。

优化复制缓冲区

为了避免从节点处理速度低于主节点的写入速度,导致从节点复制缓冲区积压过多,我们可以扩大从节点复制缓冲区的大小。

# 在从节点上配置
repl_backlog_size size

优化 AOF 缓冲区

为了避免从节点读取 AOF 文件时,因为 AOF 缓冲区写满而阻塞,导致数据同步失败,我们可以启用 AOF 重写机制,定期对 AOF 文件进行重写。

# 在主节点上配置
auto-aof-rewrite-percentage percentage
auto-aof-rewrite-min-size size

启用故障转移机制

在主从同步环境下,如果主节点出现故障,则需要从节点接替主节点成为新的主节点。为了实现自动切换,我们可以启用 Redis 的 Sentinel(哨兵)机制。

# 在主节点和从节点上启用 Sentinel
sentinel monitor master_name master_ip master_port num_slaves

六、总结

Redis 主从同步是实现高可用的必要手段,在多节点环境下具有重要意义。掌握 Redis 主从同步的配置、实现原理和优化策略,可以提高系统的稳定性和性能。

原创文章,作者:TJND,如若转载,请注明出处:https://www.506064.com/n/142168.html

(0)
TJNDTJND
上一篇 2024-10-10
下一篇 2024-10-10

相关推荐

  • 如何在Ubuntu上安装Navicat

    如果您是一名软件开发人员,并且使用MySQL或MariaDB作为数据库系统,请注意——Navicat是一款免费的数据库图形化管理工具,它支持多个数据库服务器,包括MySQL、Mar…

    编程 2024-10-03
  • 企业邮箱搭建指南

    一、企业邮箱搭建教程 如果你想要在自己的企业或团队中使用高效的邮箱服务进行沟通和协作,那么企业邮箱无疑是你的首选。Google、腾讯企业邮、阿里云企业邮箱等都是著名的企业邮箱服务商…

    编程 2024-10-04
  • c语言查看数组,c语言数组大小

    本文目录一览: 1、C语言查找数组中的数据 2、c语言 数组查询 3、如何用c语言编写查询数组中的元素 4、C语言数组的查找函数 C语言查找数组中的数据 #define IntSi…

    编程 2024-10-04
  • cad红色显示不全怎么办,cad2014显示不全 怎么解决

    本文目录一览: 1、AUTO CAD 打开图纸显示不全怎么解决? 2、CAD图显示不全怎么办? 3、cad打开图纸为什么显示不全? 4、CAD字体显示不全怎么办? 5、cad显示不…

    编程 2024-10-03
  • formmethod详解

    一、methods methods 属性指定在提交表单时使用 HTTP 方法的类型。常用的 HTTP 方法有 GET 和 POST,但除此之外还有其他 HTTP 方法,比如 PUT…

    编程 2024-10-04
  • Python 程序:计算 LCM

    在这个简单的 python 程序中,我们需要找到两个数字的 lcm。这是一个数字 python 程序。 要理解这个例子,您应该了解以下 Python 编程主题: Python 函数…

    编程 2024-10-03
  • 文件Base64的详细阐述

    一、Base64的基本概念 Base64是一种将二进制数据转换成可打印字符的编码方式。它将3个字节的数据转换成4个可打印字符,很多地方都会用到Base64编码,例如HTTP协议基本…

    编程 2024-10-03
  • 使用Linux zip-r命令对目录及其子目录进行压缩

    一、zip-r命令的功能介绍 zip-r命令是Linux系统中使用较多的一个命令,它可以将指定目录及其子目录中的所有文件和子目录进行压缩。 zip-r命令同时支持加密、压缩等多个选…

    编程 2024-10-14
  • php修改png图片dpi,png图片可以修改吗

    本文目录一览: 1、照片分辨辨率dpi修改 2、图片dpi怎么设置 3、怎样修改图片的DPI值? 照片分辨辨率dpi修改 1.打开压缩啦网站,在导航栏点击“分辨率修改”功能,进入图…

    编程 2024-10-04
  • 关于c语言auto是什么意思及用法的信息

    本文目录一览: 1、C语言中的关键字:auto是什么意思?怎么用 2、c语言中auto什么意思 3、AUTO数值是什么 4、电脑里的AUTO什么意思? 5、AUTO是什么意思 6、…

    编程 2024-10-04

发表回复

登录后才能评论