• Redis之主从复制


    什么是主从复制

    持久化保证了即使 redis 服务重启也会丢失数据,因为 redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 redis 服务器的硬盘损坏了可能会导致数据丢失,如果通过 redis 的主从复制机制就可以避免这种单点故障,如下图:

    Redis主从复制看这篇就够了

    说明:

    • 主 redis 中的数据有两个副本(replication)即从 redis1 和从 redis2,即使一台 redis 服务器宕机其它两台 redis 服务也可以继续提供服务。

    • 主 redis 中的数据和从 redis 上的数据保持实时同步,当主 redis 写入数据时通过主从复制机制会复制到两个从 redis 服务上。

    • 只有一个主 redis,可以有多个从 redis。

    • 主从复制不会阻塞 master,在同步数据时,master 可以继续处理 client 请求。

    • 一个 redis 可以即是主又是从,如下图:

    Redis主从复制看这篇就够了

    主从配置

    1、主 redis 配置

    无需特殊配置。

    2、从redis配置

    修改从 redis 服务器上的 redis.conf 文件,添加 slaveof 主 redisip 主 redis 端口。

    Redis主从复制看这篇就够了

    上边的配置说明当前该从 redis 服务器所对应的主 redis 是192.168.101.3,端口是6379。

    主从复制过程

    1、完整复制过程

    在 redis2.8 版本之前主从复制过程如下图:

    Redis主从复制看这篇就够了

    复制过程说明:

    1. slave 服务启动,slave 会建立和 master 的连接,发送 sync 命令。

    2. master 启动一个后台进程将数据库快照保存到 RDB 文件中

    注意:此时如果生成 RDB 文件过程中存在写数据操作会导致 RDB 文件和当前主 redis 数据不一致,所以此时 master 主进程会开始收集写命令并缓存起来。

    1. master 就发送 RDB 文件给 slave

    2. slave 将文件保存到磁盘上,然后加载到内存恢复

    3. master 把缓存的命令转发给 slave

    注意:后续 master 收到的写命令都会通过开始建立的连接发送给 slave。

    当 master 和 slave 的连接断开时 slave 可以自动重新建立连接。如果 master 同时收到多个 slave 发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有 slave。

    完整复制的问题:

    在 redis2.8 之前从 redis 每次同步都会从主 redis 中复制全部的数据,如果从 redis 是新创建的从主 redis 中复制全部的数据这是没有问题的,但是,如果当从 redis 停止运行,再启动时可能只有少部分数据和主 redis 不同步,此时启动 redis 仍然会从主 redis 复制全部数据,这样的性能肯定没有只复制那一小部分不同步的数据高。

    2、部分复制

    Redis主从复制看这篇就够了

    部分复制说明:

    从机连接主机后,会主动发起 PSYNC 命令,从机会提供 master 的 runid(机器标识,随机生成的一个串) 和 offset(数据偏移量,如果offset主从不一致则说明数据不同步),主机验证 runid 和 offset 是否有效,runid 相当于主机身份验证码,用来验证从机上一次连接的主机,如果 runid 验证未通过则,则进行全同步,如果验证通过则说明曾经同步过,根据 offset 同步部分数据。

  • 相关阅读:
    未能加载文件或程序集“xxx, Version=x.x.x.x, Culture=neutral, PublicKeyToken=xxxxxxxxxxxx”或它的某一个依赖项。系统找不到指定的文件
    RabbitMQ本地正常,发布到服务器上 出行连接失败
    Windows 服务 创建 安装 卸载 和调试
    CSS 格式化 一行一条
    ES6---new Promise()讲解,Promise对象是用来干嘛的?
    Win Server 2008 R2 IIS 默认只能添加一个 443 HTTPS 端口
    MVC 部分视图:Partial() 、RenderPartial() 、 Action() 、RenderAction() 、 RenderPage() 区别
    ;(function ($, undefined){ })(jQuery); 的使用及说明
    JS中的call()方法和apply()方法用法总结
    MongoDB服务无法启动,windows提示发生服务特定错误:100
  • 原文地址:https://www.cnblogs.com/xingxia/p/redis_master_slave_replication.html
Copyright © 2020-2023  润新知