Redis-主从

数据库的发展总是从 单机 -> 主从 -> 分片集群

Redis的主从复制

从单机到主从的根本优势在于:

  • 可实现读写分离,分摊读压力;某个从库用于做统计等后台功能
  • 数据可靠,一份数据,多处拷贝,一台机器坏掉了,也不至于数据没了
  • 服务可靠,主节点挂了不能写,可以从从节点选一个上来

主从 – 主从从

主节点需要负责生成RDB,并传输RDB给从节点。如果从库太多且都需要全量复制的话,主库会忙于fork子线程进行复制工作,传输RDB也会占用主库的网络带宽,为了分担这个压力,Redis可以使用主从级联模式,即让从库也去做一些复制工作同步数据到其他从库。

Redis-主从

复制机制

第一次全量复制

  • 在从节点上执行 replicaof xx.xx.xx.xx 6379命令后,会进行第一次的数据拷贝。首先从节点会发送命令 psync slave_repl_offset给主节点,slave_repl_offset = -1 代表偏移量为-1即需要全量的数据。
  • 主节点收到后,返回 FULLRESYNC{runID}{offset}给从节点,runID是redis实例启动后生成的该实例进程id(全局唯一),offset是发送的数据的起始偏移量。
  • 主节点开始生成RDB。
  • 主节点发送RDB文件给从节点,从节点清空现有数据并加载RDB。
  • 主节点继续发送后续的写命令后的数据给从库。这个专门给从库同步数据的缓存写操作的buffer叫做replication buffer。

至此,主从就完成了第一次数据同步。

Redis-主从

增量复制

为了避免网络断连导致的主从全量同步数据的问题(Redis 2.8之前),Redis也通过增量复制机制来提高效率。主库不仅有replication buffer 这个用于缓存发送给从库写命令的buffer,还有一个repl_backlog_buffer用于记录自己写到哪儿了。而从库,也有一个repl_backlog_buffer用于记录自己读到哪儿了。而主从库repl_backlog_buffer的偏移差也就是主从同步的延迟体现。正常情况下是基本一致的。

和MySQL的redo log一样, repl_backlog_buffer也是一个环形的缓冲区。当连接断开后,主库的repl buffer还在继续写,而从库的repl buffer就停止在断连前的位置。此时再重新连上后,从库会发送 psync slave_repl_offset给主节点,主节点会把自己buffer位置到从库偏移量的之间的数据同步给从库。

环形缓冲区,那么就存在数据被覆盖的可能,一旦比如说断连时间太长,或者从库读取数据速度慢很多,就有可能发生,并最后导致主从数据的不一致。可以使用 repl_backlog_size来调整缓冲区大小。经验值是 2 * (主库写入速度 * 操作数大小 – 网络传输速度 * 操作数大小)

哨兵模式

Redis哨兵模式,即Redis Sentinel,最基础的部署方案是,一主,二从,三哨兵,如下图:

Redis-主从

哨兵节点的存在只是为了监控主从节点的正常,所以他们一般有三个作用:

  • 监控 : 定期给主从节点发ping,判断他们是健康的,且避免误判(3个哨兵就是为了避免误判)
  • 选主 : 主节点不健康,这个时候,要根据共识协议选出Leader哨兵并进行主从切换(在Raft那章描述过,哨兵需要一个Leader来具体执行通知工作)。成为一个新的主节点的依据,依据大概是1.优先级,2.同步进度,3.ID小的
  • 通知 : 新的主节点确定后,Leader哨兵还需要1.通知客户端主节点变了 2.通知各位从库主节点变了

通信

哨兵只需要连最开始的主节点,从节点也连主节点(replicaof xx), 利用Redis的Pub/Sub机制,哨兵把自己的ip端口发布到一个 __sentinel__:hello频道上,其他哨兵订阅这个频道,那么哨兵们也都能”认识”其他哨兵小伙伴,建立连接进行通信了。

哨兵还通过向主库发送INFO命令来获取其他从库的ip端口等信息,并与从库建立连接。

哨兵和客户端的通信也是通过Pub/Sub机制,客户端可以从哨兵订阅消息,那么一旦换主了,哨兵发布消息,客户端就能感知到了。

Original: https://www.cnblogs.com/rachel-aoao/p/redis_master_slave.html
Author: rachel_aoao
Title: Redis-主从

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601480/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Mysql数据库体系

    Mysql数据库体系如下(手绘): 描述: 1.DBMS:database system management是数据库管理软件,平时我们使用的数据库的全称,是C/S架构(clien…

    数据库 2023年6月6日
    093
  • 【Java基础】– FileUtils工具类常用方法

    1.FileUtils介绍 文件IO是我们日常项目中经常使用到的基础API,常见的IO读写操作基础类字节流InputStream与OutputStream、字符流Reader与Wr…

    数据库 2023年6月6日
    0361
  • 内部类

    🐓内部类 可以将一个类定义在另一个类或方法中,这样的类称为内部类 将类定义在另一个类中成员的位置 public class Inner { // 定义在类内部 class Demo…

    数据库 2023年6月14日
    077
  • InnoDB 中不同SQL语句设置的锁

    锁定读、UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁。语句中是否存在排除该行的WHERE条件并不重要。InnoDB不记得确切的WHE…

    数据库 2023年6月14日
    0111
  • Java 使用Stream处理List对象去重

    // 根据name去重 List unique = persons.stream().collect( Collectors.collectingAndThen( Collecto…

    数据库 2023年6月16日
    077
  • 生成随机数的若干种方法

    背景: 创建账户时我们需要配置初始随机密码,使用手机号注册时需要随机验证码,抽奖活动需要随机点名,俄罗斯方块游戏需要随机出形状。这些案例都在说明一个问题,随机数据很重要!而在 Sh…

    数据库 2023年6月14日
    073
  • 计算机网络基础

    计算机网络基础 计算机网络的定义和功能 计算机网络是利用通信设备和线路,将分布在地理位置不同的、功能独立的多个计算机系统连接起来,以功能完善的网络软件(网络通信协议及网络操作系统等…

    数据库 2023年6月16日
    085
  • 23种设计模式之中介者模式(Mediator)

    文章目录 概述 中介者模式的优缺点 中介者模式的使用场景 中介者模式的结构和实现 * 模式结构 模式实现 总结 概述 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式…

    数据库 2023年6月6日
    0103
  • 一篇文章带你掌握主流基础框架——Spring

    一篇文章带你掌握主流基础框架——Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要…

    数据库 2023年6月14日
    0107
  • 2018年最新JAVA面试题总结之JavaWeb(2)

    转自于:https://zhuanlan.zhihu.com/p/39522575 1、tomcat的优化方式?回答:Tomcat的优化我准备从三方面来说: 第一部分: 内存优化T…

    数据库 2023年6月16日
    091
  • MIB MODULE HOST-RESOURCES-MIB

    Textual Conventions Name: BooleanSyntax: Enumerated Name: KBytesSyntax: Integer Range Name…

    数据库 2023年6月11日
    0101
  • 打破千篇一律,DIY属于自己独一无二的商城

    随着线上购物成为了人们的主要消费之一,搭建商城系统也成为一大热门的发展方向,在现在的电商市场中,经营的主体规模非常庞大,各种各样的电商系统琳琅满目,但是只要仔细观察就会发现,有很大…

    数据库 2023年6月14日
    0111
  • jupyter使用虚拟环境

    为了在jupyter中使用pyTorch的虚拟环境,来记录一下怎么操作一、conda命令的使用因为使用的是jupyter,所有就使用Anaconda Prompt来创建虚拟环境(也…

    数据库 2023年6月14日
    085
  • 送分题,ArrayList 的扩容机制了解吗?

    1. ArrayList 了解过吗?它是啥?有啥用? 众所周知,Java 集合框架拥有两大接口 Collection 和 Map,其中, Collection 麾下三生子 List…

    数据库 2023年6月6日
    083
  • [LeetCode]1221. 分割平衡字符串

    在一个「平衡字符串」中,’L’ 和 ‘R’ 字符的数量是相同的。 给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。 返回…

    数据库 2023年6月9日
    092
  • Linux 服务管理

    Linux 服务管理 1. 基本介绍 服务的本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如mysqld,sshd,防火墙等,因此我们又称为守护线程…

    数据库 2023年6月6日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球