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
相关推荐
虹科网络安全4 分钟前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_7717172125 分钟前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
小江的记录本1 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi1 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dFObBIMmai1 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw01 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python
czlczl200209252 小时前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询
数据库·mysql
ACP广源盛139246256732 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑
Elastic 中国社区官方博客2 小时前
ES|QL METRICS_INFO 和 TS_INFO:为你的时间序列数据建立目录
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索
俺不要写代码3 小时前
数据库:函数
数据库·mysql