Redis_主从复制

8. 主从复制

8.1 简介

主从库采用读写分离的方式

  • 读操作:主库、从库都可以处理
  • 写操作:首先写到主库执行,然后再将主库同步给从库。

实现读写分离,性能扩展

容灾快速恢复

8.2 主从复制步骤

  1. 创建一个目录 ,在root下创建一个myredis的目录

    shell 复制代码
    mkdir myredis//创建目录
    cd myredis //进行目录
    cp /opt/reids-6.2.6/redis.conf redis_1.conf //cp 源文件 目标文件
    ls
  2. 关闭aof

  3. 使用vi编辑三个conf文件,redis_6379.conf,redis_6380.conf,redis_6381.conf做为一主二从配置,配置文件内容如下所示:

    shell 复制代码
    include redis_1.conf
    pidfile /var/run/reids_6379.pid
    port 6379
    dbfilename dump6379.rdb
  4. 分别启动三个服务

    shell 复制代码
    [root@localhost myredis]# redis-server redis_6379.conf
    [root@localhost myredis]# redis-server redis_6380.conf
    [root@localhost myredis]# redis-server redis_6381.conf
    [root@localhost myredis]# ps -ef|grep redis
    root 7289 1 0 17:35 ? 00:00:00 redis-server 127.0.0.1:6379
    root 7296 1 0 17:35 ? 00:00:00 redis-server 127.0.0.1:6380
    root 7302 1 0 17:35 ? 00:00:00 redis-server 127.0.0.1:6381
    root 7316 6663 0 17:35 pts/0 00:00:00 grep --color=auto redis
  5. 在三个客户端,模拟分别连接到不同服务器

    shell 复制代码
    redis-cli -p 端口号
    redis-cli -p 6379
    redis-cli -p 6380
    redis-cli -p 6381
  6. 查看服务器状态

    shell 复制代码
    info replication
  7. 在6380和6381上调用replicaof ,将其从属于6379(如果是三台服务器以上步骤可以跳过,直接配置从属服务器)

    shell 复制代码
    replicaof 127.0.0.1 6379
  8. 在主库上可以写入数据,从库不能写入数据

  9. 主库和从库都可以读数据

8.3 服务器宕机演示

8.3.1 从服务器宕机

  • 6381上调用shutdown
  • 在主服务器上写入数据
  • 6381重新连上时,仍然可以接收到主服务器的数据

8.3.2 主服务器宕机

  • 6379服务器调用shutdown
  • 在从服务器上仍然可以读取数据
  • 从服务器显示主服务器的状态为down
  • 当主服务器重新启动,从服务器显示主服务器的状态是up

8.4 主从同步原理

第一阶段

  • 主从建立连接,协商同步。从库和主库建立连接,告诉主库即将进行同步操作。主库需要确认并回复,主从就可以开始进行同步处理了。
  • 从库向主库发送一个psync指令,包含两个参数。一个是主库的runID,另一个是复制进度offset。
    • runID是每个redis实例启动时生成的一个随机ID,唯一标识。第一次复制时,从库不知道主库的runid,所以设为一个"?"。
    • offset,-1表示第一次复制
  • 主库收到指令后,会发送给从库fullresync指令去响应,带着主库的runid,还有目前复制进度offset。
  • 从库会记录下这两个参数。fullresync表示全量复制。主库把所有内容都复制给从库

第二阶段

  • 主库将所有数据发送给从库进行同步。从库收到rdb文件后,在本地把原有的数据清除,同步从主库接收到的rdb文件 。
  • 如果在主库把数据跟从库同步的过程中,主库还有数据写入,为了保证主从数据的一致性,主库会在内
  • 存中给一块空间replication buffer,专门记录rdb文件生成后收到的所有写操作

第三阶段

  • 主库把第二阶段执行过程中新收到的操作,再发送给从库,从库再加载执行这些操作,就实
    现同步处理了。

8.5 主-从-从模式

采用主-从-从模式,将主库生成和传输rdb文件的压力,以级联方式分散到从库上。

8.6 网络连接异常情况

在redis2.8之前,如果网络异常,再次连接后,需要做全量复制

从redis2.8之后,采用增量复制方式。repl_backlog_buffer缓冲区。当主从网络断开后,主库把收到写

操作,写入replication buffer,同时,也写入到repl_backlog_buffer缓冲区.

这个缓冲区,是一个环形缓冲区 ,主库会记录自己写到的位置,从库会记录自己读到的位置。
在之前还是会识别一下环形缓冲区还能不能够提供完整的数据,如果不能就进行全量同步了

  • repl_backlog_size参数
    • 缓冲空间大小=主库写入速度 * 操作大小-主从库网络传输速度 * 操作大小
    • repl_backlog_size=缓冲空间大小*2
    • 2000 * 2-1000 * 2=2000 大约为2M 乘2 所以repl_backlog_size值为4M
相关推荐
希忘auto44 分钟前
详解Redis的常用命令
redis·1024程序员节
云和数据.ChenGuang5 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys5 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi5 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据6 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi7 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀7 小时前
Redis梳理
数据库·redis·缓存
独行soc7 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天8 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭8 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员