详解Redis主从复制实践

 更新时间:2021年05月19日 11:24:13   作者:华为云开发者社区  
本文将演示主从复制如何配置、实现以及实现原理,Redis主从复制三大策略,全量复制、部分复制和立即复制。

复制简介

Redis 作为一门非关系型数据库,其复制功能和关系型数据库(MySQL)来说,功能其实都是差不多,无外乎就是实现的原理不同。Redis 的复制功能也是相对于其他的内存性数据库(memcached)所具备特有的功能。

Redis 复制功能主要的作用,是集群、分片功能实现的基础;同时也是 Redis 实现高可用的一种策略,例如解决单机并发问题、数据安全性等等问题。

服务介绍

在本文环境演示中,有一台主机,启动了两个 Redis 示例。

实现方式

Redis 复制实现方式分为下面三种方式:

1. 服务启动时配置

该方式通过在启动 Redis 服务时,通过命令行参数,进行启动主从复制功能。该方式的弊端是不能实现配置持久化,当服务停掉之后,启动服务时,需要添加相同的命令参数。

1.1 master 服务器事先在 redis.confg 增加 requirepass 项。

requirepass 6379

1.2 启动从服务器。

redis-server --port 6380 --replicaof 192.168.2.102 6379

2. 命令行配置

该方式通过使用 redis-cli 进入操作行界面,进行配置。该方式的弊端是不能实现配置持久化,当服务停掉之后,启动服务需要执行同样的命令。

2.1 master 服务器执行。

127.0.0.1:6379> config set requirepass 6379
OK

2.2 从服务器执行。

127.0.0.1:6380> replicaof 192.168.2.102 6379
OK
127.0.0.1:6380> config set masterauth 6379
OK

3. 配置文件配置

该方式是通过 redis.conf 配置文件进行设置,能够实现配置的持久化,是一种推荐使用的方式。

3.1 配置主服务器,redis.config。

requirepass 6379

3.2 配置从服务器,redis.config。

masterauth 6379
replicaof 192.168.2.102 6379

4.配置说明

1.masterauth:设置 redis.confi 连接密码,如果设置了该值。其他客户端在连接该服务器时,需要添加密码才可以访问。

2.requirepass:设置主服务器的连接密码,和 1 中 masterauth 一致。

3.replicaof:从服务器连接到服务器的 IP 地址+端口号。

效果测试

1.主服务器添加数据

2.从服务器获取数据

实现原理

// uml图

@startuml

从服务器->主服务器: 1.保存配置

从服务器->主服务器: 2.建立socket连接

从服务器->主服务器: 3.发送ping命令

从服务器->主服务器: 4.权限验证

从服务器->主服务器: 5.同步数据

从服务器->主服务器: 6.持续复制数据

@enduml

主从复制主要实现的一个流程如上图:

1.第一步,从服务器保存主服务器的配置信息,保存之后待从服务器内部的定时器执行时,就会触发复制的流程。

2.第二步,从服务器首先会与主服务器建立一个socket套字节连接,用作主从通信使用。后面主服务器发送数据给从服务器也是通过该套字节进行。

3.第三步,socket套字节连接成功之后,接着发送鉴权ping命令,正常的情况下,主服务器会发送对应的响应。ping命令的作用是为了,保证socket套字节是否可以用,同时也是为了验证主服务器是否接受操作命令。

4.第四步,接着就是鉴权验证,判断从节点配置的主节点连接密码是否正确。

5.第五步,鉴权成功之后,就可以开始复制数据了。主服务器此时会进行全量复制,将主服务的数据全部发给从服务器,从服务器保存主服务器发送的数据。

6.接下来就是持续复制操作。主服务器会进行异步复制,一边将写的数据写入自身,同时会将新的写命令发送给从服务器。

实现策略

Redis主从复制主要分为三种弄策略方式,不同的策略方式都是针对不同的场景下进行使用。三种场景方式分别如下:

1.全量复制

全量复制用在主从复制刚建立时或者从切主服务器时,从服务器没有主服务器的数据,主服务器会将自身的数据通过rdb文件方式发送给从服务器,从服务器会清空自身数据,接着将主服务器发送的数据加载到自身中。

// uml图

@startuml

从服务器->主服务器: 1.psync ? -1

主服务器->从服务器: 2.fullsync runid offset

从服务器: 3.保存 runid offset

主服务器: 4.执行bgsave生成rdb

主服务器->从服务器: 5.发送rdb

从服务器: 6.清空自身老数据

从服务器: 7.加载主服务器数据

@enduml

2.部分复制

部分复制用在一些异常情况下,例如主从延迟、从服务宕机之后重新启动接收主服务器发送的部分数据。

部分复制的实现主要依赖于复制缓存区、主服务的runid、主从服务器各自的复制偏移量(offset)。

复制缓存区:主服务在接收写命令时,会将命令写入缓存区,以便从服务器在异常情况下,减少数据的丢失。当从服务器正常连接之后,主服务器会将缓存区内的数据发送给从服务器。这里的缓存区是一个长队列。

主服务器runid:主服务器会在每次服务启动之后,会生成一个唯一的ID,作为自身标识。从服务器会将该标识保存起来,发送部分复制命令时,会使用该runid。

psync runid offset

主从复制各自偏移量:主从服务在建立复制之后,都会有自身的偏移量。从节点会每秒钟发送自身复制的偏移量给从节点,主节点在发送写命令之后,从节点也会增加自身的复制偏移量。主节点在每次进行了写命令之后,也会增加自身的偏移量。这里的偏移量是通过命令的字节长度累加计算。

3.异步复制

异步复制是针对主从建立复制关系之后,主从服务器持续保持复制关系。

场景问题

1.数据安全

// 从服务器只读
replica-read-only yes
// 从服务器连接密码
masterauth

2.数据延迟

默认的情况下主节点存在新数据不会立即发送给从服务器,如果开启,则会理解发送给从服务器。默认的时间拒绝与Linux内核。

// 复制延迟
repl-disable-tcp-nodelay yes

3.主从节点连接状态

主从节点一旦建立连接之后,会定时模拟成对方的客户端,检测对方的服务状态。主节点可以通过设置repl-ping-replica-period配置参数进行设置。默认的频率是10s。

从节点咋执行replconf ack {offsetid}时,也会将自身的复制偏移量发送给主服务器,主服务根据偏移量进行判断数据延迟。存在数据延迟就会从复制积压缓冲区的数据汇中,将对应的数据补发给从节点。

以上就是详解Redis主从复制实践的详细内容,更多关于Redis主从复制实践的资料请关注脚本之家其它相关文章!

相关文章

  • 安装redis(windows和Ubuntu)详解

    安装redis(windows和Ubuntu)详解

    这篇文章主要介绍了Redis在Ubuntu和Windows下的安装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Python的Flask框架使用Redis做数据缓存的配置方法

    Python的Flask框架使用Redis做数据缓存的配置方法

    Redis数据库依赖于主存,在关系型数据库以外再配套Redis管理缓存数据将对性能会有很大的提升,这里我们就来看一下Python的Flask框架使用Redis做数据缓存的配置方法
    2016-06-06
  • redis分布式锁实现示例

    redis分布式锁实现示例

    本文主要介绍了redis分布式锁实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • Redis删除某个目录下的数据的实现

    Redis删除某个目录下的数据的实现

    本文介绍了如何在Redis中删除指定目录下的数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • Redis的数据过期策略和数据淘汰策略

    Redis的数据过期策略和数据淘汰策略

    本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • Redis+threading实现多线程消息队列的使用示例

    Redis+threading实现多线程消息队列的使用示例

    Redis多线程消息队列是一种使用Redis作为存储后端的消息队列实现,它利用Redis的线程并发处理能力来提高消息队列的处理效率,本文主要介绍了Redis+threading实现多线程消息队列的使用示例,感兴趣的可以了解一下
    2023-12-12
  • Windows下注册Redis服务失败的解决方案

    Windows下注册Redis服务失败的解决方案

    在Windows系统中,有时候我们需要将Redis作为一个服务运行,以便于在后台长期运行并提供服务,本篇技术博客文章将为你解答在Windows下注册Redis服务失败的一些常见问题,并提供相应的解决方案,需要的朋友可以参考下
    2024-11-11
  • redis中的常用5大数据类型

    redis中的常用5大数据类型

    这篇文章主要介绍了redis中的常用5大数据类型,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Redis并发访问问题详细讲解

    Redis并发访问问题详细讲解

    本文主要介绍了Redis如何应对并发访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • Redis中过期键删除的三种方法

    Redis中过期键删除的三种方法

    Redis中可以设置键的过期时间,并且通过取出过期字典(expires dict)中键的过期时间和当前时间比较来判断是否过期,那么一个过期的键是怎么被删除的呢?本文给大家总结了三种方法,选了其中两种给大家详细的介绍一下,需要的朋友可以参考下
    2024-05-05

最新评论