iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何解析Redis中的集群主从复制原理
  • 536
分享到

如何解析Redis中的集群主从复制原理

2024-04-02 19:04:59 536人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关如何解析Redis中的集群主从复制原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 本篇文章带大家

这篇文章将为大家详细讲解有关如何解析Redis中的集群主从复制原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

本篇文章带大家深入理解下Redis集群主从复制原理,希望对大家有所帮助!

一、首先思考一个问题,为什么redis性能这么高还需要分布式方案?

1、实现更高性能:高并发应用,单机性能会有影响,需要更多redis服务器分担压力,实现负载均衡

2、实现高可用:如果单机,防止宕机/硬件故障

3、实现可扩展:单机内存和硬件有限制,实现横向扩展

冗余或者分片存储实现如上特性。

二、主从复制-replication配置

kafka,Mysql,RocketMQ一样,redis支持集群部署,集群节点有master和slave之分,主节点是master,从节点是slave(最新叫副本replica).slave会通过复制机制,从master同步最新的数据。Redis提供了非常方便的命令开启主从复制。【相关推荐:Redis视频教程

如何配置开启主从复制?

以本机搭建伪集群为例,6379端口是从节点,6378作为主节点。

1、从节点redis.conf配置 replicaof masterip masterport 从节点启动后,自动连接到master节点,开始同步数据.

如何解析Redis中的集群主从复制原理如何解析Redis中的集群主从复制原理如何解析Redis中的集群主从复制原理如何解析Redis中的集群主从复制原理如何解析Redis中的集群主从复制原理如何解析Redis中的集群主从复制原理

源码说明:

//每1s执行这个方法
void replicationCron(void) {
    ...
    //检查是否需要连接到master 如果是REPL_STATE_CONNECT状态,必须连接到master
    //#define REPL_STATE_CONNECT 1  Must connect to master 
    if (server.repl_state == REPL_STATE_CONNECT) {
        serverLog(LL_NOTICE,"Connecting to MASTER %s:%d",
            server.masterhost, server.masterport);
        //和master创建连接    
        if (connectWithMaster() == C_OK) {
            serverLog(LL_NOTICE,"MASTER <-> REPLICA sync started");
        }
    }
    
    //发送ping命令给slave 
    if ((replication_cron_loops % server.repl_ping_slave_period) == 0 &&
        listLength(server.slaves))
    {
        
        int manual_failover_in_progress =
            server.cluster_enabled &&
            server.cluster->mf_end &&
            clientsArePaused();

        if (!manual_failover_in_progress) {
            ping_argv[0] = createStrinGobject("PING",4);
            replicationFeedSlaves(server.slaves, server.slaveseldb,
                ping_argv, 1);
            decrRefCount(ping_argv[0]);
        }
    }
    
    //发送换行符到所有slave,告诉slave等待接收rdb文件
    listRewind(server.slaves,&li);
    while((ln = listNext(&li))) {
        client *slave = ln->value;

        int is_presync =
            (slave->replstate == SLAVE_STATE_WAIT_BGSAVE_START ||
            (slave->replstate == SLAVE_STATE_WAIT_BGSAVE_END &&
             server.rdb_child_type != RDB_CHILD_TYPE_Socket));

        if (is_presync) {
            if (write(slave->fd, "\n", 1) == -1) {
                
            }
        }
    }
    ...
}

3、全量复制流程-支持无盘复制或者rdb持久化复制

如何解析Redis中的集群主从复制原理

当slave连接到master后,使用psync(以前是sync命令,它不允许部分重新同步,所以现在改用PSYNC)命令初始化复制,将主节点replication id和处理过最大offset发送到master。

master节点拥有如下两个属性,一个replication id(标志实例),一个offset(标志写入从节点的stream)

Replication ID, offset

如果主节点缓冲区中没有足够的积压工作,或者如果复制副本引用的是不再已知的历史记录(复制ID),则会发生完全重新同步

源码说明:

    //没有在rdb进程,没有aof重写进程
    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1) {
        time_t idle, max_idle = 0;
        int slaves_waiting = 0;
        int mincapa = -1;
        listnode *ln;
        listIter li;

        listRewind(server.slaves,&li);
        while((ln = listNext(&li))) {
            client *slave = ln->value;
            //判断slave是否是等待bgsave状态
            if (slave->replstate == SLAVE_STATE_WAIT_BGSAVE_START) {
            //多久没有发送心跳或查询数据了 空闲时间间隔
                idle = server.unixtime - slave->lastinteraction;
                if (idle > max_idle) max_idle = idle;
                slaves_waiting++;
                mincapa = (mincapa == -1) ? slave->slave_capa :
                                            (mincapa & slave->slave_capa);
            }
        }

        if (slaves_waiting &&
            (!server.repl_diskless_sync ||
             max_idle > server.repl_diskless_sync_delay))
        {
            
             //bgsave rdb生成
            startBgsaveForReplication(mincapa);
        }
    }

复制过程中,slave状态转换流程。

如何解析Redis中的集群主从复制原理如何解析Redis中的集群主从复制原理

四、复制id理解

每次实例作为主实例从头开始重新启动,或者将复制副本提升为主实例,都会为此实例生成一个新的复制ID。如果两个replica的复制id相同,则他们可能在不同的时间,有相同的数据,对于保存最新数据集的给定历史记录(复制ID),偏移量作为一个逻辑时间来理解。需要通过Replication ID, offset两个数据来判断。用来判断从节点同步数据到哪了。

五、主从复制常见问题

1、slave本身有数据,会怎么样?

slave先删除自身的数据,再用rdb文件加载。

2、生成rdb文件的过程中,客户端写命令怎么处理?

保存到内存缓存中,rdb发送完成后发送到slave。

3、Redis复制如何处理key过期的?

1、副本不会使key过期,而是等待主机使key过期。当主机使key过期(或由于LRU而将其逐出)时,它将合成一个DEL命令,该命令将传输到所有副本。

2、但是,由于主机驱动的expire,有时副本可能仍然具有逻辑上已过期的内存密钥,因为主服务器无法及时提供DEL命令。为了处理这个问题,副本使用它的逻辑时钟来报告一个key不存在,只用于不违反数据集一致性的读取操作(因为来自主服务器的新命令将到达)

3、在lua脚本执行期间,不执行密钥过期。当Lua脚本运行时,从概念上讲,主节点中的时间是冻结的,因此给定的键在脚本运行的所有时间内都将存在或不存在。这可以防止key在脚本中间过期,并且需要key才能以保证在数据集中具有相同效果的方式将相同的脚本发送到副本。

一旦复制副本升级为主副本,它将开始独立地使key过期,并且不需要旧主副本的任何帮助。

六、主从复制总结

1、解决了数据备份的问题,但是rdb文件大,传输大文件,恢复时间也长

2、如果master异常,需要手工将replica选举为master

3、1主多从,1主1从的情况下,还是存在单点问题

4、Redis版本2.8.18后支持无盘复制,性能更高。

七、复制说明

1、默认用异步复制,通过异步确认同步的命令数量

2、1个master可以有多个副本

3、副本也可以有自己的副本,从redis4.0开始,副本都会从主节点接收完全相同的复制流

4、复制既可以用于可扩展性,也可以用于只读查询的多个副本

关于如何解析Redis中的集群主从复制原理就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: 如何解析Redis中的集群主从复制原理

本文链接: https://www.lsjlt.com/news/72029.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解析Redis中的集群主从复制原理
    这篇文章将为大家详细讲解有关如何解析Redis中的集群主从复制原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 本篇文章带大家...
    99+
    2024-04-02
  • redis中主从复制、哨兵、集群的原理是什么
    这篇文章主要介绍了redis中主从复制、哨兵、集群的原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇redis中主从复制、哨兵、集群的原理是什么文章都会有所收获,下面我...
    99+
    2024-04-02
  • Redis中主从复制、哨兵、集群的示例分析
    这篇文章将为大家详细讲解有关Redis中主从复制、哨兵、集群的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Redis 主从复制1. 主从复制的概述主从复制,...
    99+
    2024-04-02
  • redis主从复制、哨兵和集群的示例分析
    这篇文章主要介绍了redis主从复制、哨兵和集群的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、主从复制1. 主从同步的用处  ...
    99+
    2024-04-02
  • Redis中主从复制、Sentinel、集群有什么用
    这篇文章主要为大家展示了“Redis中主从复制、Sentinel、集群有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redis中主从复制、Sentine...
    99+
    2024-04-02
  • redis中主从复制原理的的示例分析
    这篇文章将为大家详细讲解有关redis中主从复制原理的的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.复制过程从节点执行 slaveof 命令。从节点只是保存...
    99+
    2024-04-02
  • 浅谈Redis主从复制以及主从复制原理
    目录面临问题解决办法主从复制主从复制的作用主从复制启用面临问题 1. 机器故障。我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的。...
    99+
    2024-04-02
  • MySQL中主从复制的原理分析
    今天就跟大家聊聊有关MySQL中主从复制的原理分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.1.1 MySQL主从复制介绍MySQL数据库支...
    99+
    2024-04-02
  • Redis cluster集群模式的原理解析
    redis cluster redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求 自动将数据进行分片,每个master上放...
    99+
    2024-04-02
  • Redis主从复制的原理是什么
    Redis主从复制是通过将主节点的数据同步复制到从节点来实现数据的备份和高可用性。实现主从复制的原理主要包括以下几个步骤: 从节...
    99+
    2024-03-11
    Redis
  • Redis主从复制原理是什么
    Redis主从复制原理是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!一、什么是Redis主从复制?主从复制就是现在有...
    99+
    2024-04-02
  • Redis集群主从模式的示例分析
    这篇文章主要介绍了Redis集群主从模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。redis集群主从模式介绍: &n...
    99+
    2024-04-02
  • MySQL主从复制的原理分析
    本篇文章为大家展示了MySQL主从复制的原理分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。主从复制是怎么实现的呢更新语句会记录 binlog,它是一种逻辑日志。...
    99+
    2024-04-02
  • MySQL的主从复制和集群解决方案
    MySQL的主从复制和集群是两种常见的解决方案,用于提高数据库的可用性和性能。 主从复制是指将一个MySQL数据库服务器作为主服务器...
    99+
    2024-03-06
    MySQL
  • Redis replication主从复制原理及配置
    本文主要介绍Redis replication 主从复制原理和配置及基本操作 等 主要参考官方文档: https://redis.io/topics/replication ...
    99+
    2024-04-02
  • Docker进阶:mysql 主从复制、redis集群3主3从【扩缩容案例】
    Docker进阶:mysql 主从复制、redis集群3主3从【扩缩容案例】 一、Docker常规软件安装1.1 docker 安装 tomcat(默认最新版)1.2 docker 指定安装 ...
    99+
    2023-09-05
    运维 mysql 主从复制 redis集群3主3从 redis集群扩缩容案例 容器 云原生 虚拟化技术 mysql redis 原力计划
  • Redis中主从复制的示例分析
    这篇文章给大家分享的是有关Redis中主从复制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。面临问题 机器故障。我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数...
    99+
    2023-06-15
  • redis集群原理的示例分析
    这篇文章主要介绍redis集群原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!redis集群的原理如果说依靠哨兵可以实现redis的高可用,如果还想在支持高并发同时容纳海...
    99+
    2024-04-02
  • Redis中如何实现主从复制
    Redis中如何实现主从复制,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Redis复制概论数据库复制指的是发生在不同数据库实...
    99+
    2024-04-02
  • MongoDB中复制集集群的原理是什么
    这篇文章给大家介绍MongoDB中复制集集群的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。复制集介绍MongoDB中的复制集(也被称为副本)是一组维护相同数据集的mongo...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作