【Redis技术专题】「高可用技术基础」一同分析一下Redis高可用的“基石”之主从架构的本质原理解析

news2024/12/23 19:45:56

📕技术箴言

当心中有更高的山峰去攀登,就不会在意脚下的泥沼。

📕前提概要

Redis高可用的方案包括:持久化主从复制(及读写分离)哨兵集群(Cluster)

📕📕 持久化:

侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份),数据可用性以及可靠性。

📕📕 主从复制

侧重解决数据的多机热备,以及从实例角度进行解决提高了高可用(故障切换),主从复制还可以实现负载均衡(高性能)

📕📕 哨兵

侧重于服务实例角度,自动进行监控和切换,进行解决实例之间提高了高可用(故障切换)

📕📕 集群

侧重于服务实例和数据角度,进行数据容灾以及高可用的能力,此外可以扩展单节点redis的数据存储上限

📕 内容提要

本片文章主要将详细介绍Redis主从复制的内容包括如何使用主从复制、主从复制的原理(重点是全量复制和部分复制、以及心跳机制)、实际应用中需要注意的问题(如数据不一致问题、复制超时问题、复制缓冲区溢出问题)、主从复制相关的配置(重点是repl-timeout、client-output-buffer-limit slave)等。

📕主从复制的概述

总体过程

  1. 主节点负责写数据,从节点负责读数据。

  2. 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。

  3. 前者称为主节点(master),后者称为从节点(slave);

  4. 数据的复制是单向的,只能由主节点到从节点。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

📕主从复制的作用

  • 数据冗余主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式,数据可以保证可用性和一致性

  • 故障恢复当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余

  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

  • 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

📕主从复制的拓扑

📕📕一主一从

  • 主节点故障转移从节点,当主节点的“写”命令并发高且需要持久化,可以只在从节点开启AOF(主节点不需要),这样即保证了数据的安全性,也避免AOF持久化对主节点的影响

📕📕一主多从

  • 针对“读”较多的场景,“读”由多个从节点来分担,但节点越多,主节点同步到多节点的次数也越多,影响带宽,也加重主节点的负担

📕📕 树状主从:

  • 一主多从的缺点(主节点推送次数多压力大)可用些方案解决,主节点只推送一次数据到从节点B,再由从节点B推送到C,减轻主节点推送的压力。

📕 主从复制的原理

了解redis复制原理对日后运维有很大帮助,包括如何规划节点,如何处理节点故障,redis复制过程可分为三个阶段:

  • 复制初始化阶段
  • 数据同步阶段
  • 命令传播阶段

📕📕 复制初始化阶段

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

1. 当执行完slaveof/replica masterip port命令时候,从库根据指明的master节点ip和port向主库发起socket连接,主库收到socket连接之后将连接信息保存,此时连接建立,从服务器保存主服务器的配置信息,保存之后待从服务器内部的定时器执行时,就会触发复制的流程


注意:replicaof 是新版本的命令,旧版本是 slaveof 命令,如果你使用的是 Redis 5.0.0 之前的版本,那么请使用 SLAVEOF 命令代替本章中的 REPLICAOF 命令,并使用 slaveof 配置选项代替本章中的 replicaof 配置选项


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

3. socket套字节连接成功之后,接着发送鉴权ping命令,正常的情况下,主服务器会发送对应pong的响应。ping命令的作用是为了,保证socket套字节是否可以用,同时也是为了验证主服务器是否接受操作命令,否则可能出现超时或者主库此时在处理其他任务阻塞那么此时从库将断开socket连接,然后进行重试

4. 如果主库连接设置了密码,则从库需要设置masterauth参数此时从库会发送auth命令,命令格式为“auth + 密码”进行密码验证,其中密码为masterauth参数配置的密码,需要注意的是如果主库设置了密码验证,从库未配置masterauth参数则报错,socket连接断开。当身份验证完成以后,从节点发送自己的监听端口,主库保存其端口信息,此时进入下一个阶段:数据同步阶段

5. 可以开始复制数据了。主服务器此时会进行全量复制,将主服务的数据全部发给从服务器,从服务器保存主服务器发送的数据。

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

📕📕 数据同步阶段

  1. 主库和从库都确认对方信息以后,便可开始数据同步,此时从库向主库发送psync命令(需要注意的是redis4.0版本对2.8版本的psync做了优化,后续会进行说明),

  2. 主库收到该命令后判断是进行增量复制还是全量复制然后根据策略进行数据的同步,当主库有新的写操作时候此时进入复制第三阶段:命令传播阶段

📕📕 命令传播阶段

  • 当数据同步完成以后,在此后的时间里主从维护着心跳检查来确认对方是否在线,每隔一段时间(默认10秒,通过repl-ping-replica-period/repl-ping-slave-period参数指定)主节点向从节点发送PING命令判断从节点是否在线。

  • 从节点每秒1次向主节点发送REPLCONF ACK命令,命令格式为:REPLCONF ACK {offset},其中offset指从节点保存的复制偏移量。

    • 作用一是汇报自己复制偏移量,主节点会对比复制偏移量向从节点发送未同步的命令
    • 作用二在于判断主节点是否在线,从库接送命令并执行,最终实现与主库数据相同

📕📕 主从乐观复制机制

Redis采用量乐观复制策略,容忍在一定时间内主从数据内容是不同的,但是两者的数据最终会同步

📕📕 主从复制实现策略

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

📕📕📕 全量复制

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

1. 从服务器->主服务器: 1.psync ? -1
2. 主服务器->从服务器: 2.fullsync runid offset
3. 从服务器: 保存 runid offset
4. 主服务器: 执行bgsave生成rdb
5. 主服务器->从服务器: 发送rdb
6. 从服务器: 清空自身老数据
7. 从服务器: 加载主服务器数据

📕📕📕 部分复制

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

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

📕📕📕📕 复制缓存区**

repl_backlog_size保存在主节点上的一个固定长度的先进先出队列,默认大小是1MB

  • 主服务在接收写命令时,会将命令写入缓存区,以便从服务器在异常情况下,减少数据的丢失

  • 当从服务器正常连接之后,主服务器会将缓存区内的数据发送给从服务器。这里的缓存区是一个长队列

  • 主节点发送数据给从节点过程中,主节点还会进行一些写操作,这时候的数据存储在复制缓冲区中。从节点同步主节点数据完成后,主节点将缓冲区的数据继续发送给从节点,用于部分复制

  • 主节点响应写命令时,不但会把写命令发送给从节点,还会写入复制积压缓冲区,用于复制命令丢失的数据补救。

📕📕📕📕 主服务器runid

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

psync runid offset

📕📕📕📕 主从复制各自偏移量:

主从服务在建立复制之后,都会有自身的偏移量offset。

  • 主节点在每次进行了写命令之后,也会增加自身的偏移量(offset=offset+命令的字节长度)。这里的偏移量是通过命令的字节长度累加计算

  • 从节点会每秒钟发送自身复制的偏移量给主节点,主节点在发送写命令之后,从节点也会增加自身的复制偏移量(也会增加自己的offset)

主节点同时保存自己的offset和从节点的offset,通过对比offset来判断主从节点数据是否一致

📕📕📕 异步复制

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

📕📕 场景问题

📕📕📕 数据安全

  • 从服务器只读

replica-read-only yes

  • 从服务器连接密码

masterauth

📕📕📕 数据延迟。

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

  • 复制延迟

repl-disable-tcp-nodelay yes

📕📕📕 主从节点连接状态。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式注册服务中心etcd在云原生引擎中的实践

作者:王雷 etcd是什么 etcd是云原生架构中重要的基础组件,由CNCF孵化托管。ETCD是用于共享配置和服务发现的分布式,一致性的KV存储系统,是CoreOS公司发起的一个开源项目,授权协议为Apache。etcd 基于Go语言实现&…

vivo 推荐业务 x DeepRec:全链路优化实践

作者: vivo - 人工智能推荐团队:何鑫、李恒、周健、黄金宝 背景 vivo 人工智能推荐算法团队在深耕业务同时,也在积极探索适用于搜索/广告/推荐大规模性稀疏性算法训练框架。分别探索了 tensornet/XDL/tfra 等框架及组件,这些框…

docker高级篇第二章-分布式存储之实战案例:主从容错切换迁移案例

在上一篇,学会了3主3从的Redis集群搭建。那么接下来,我们就来学习Redis集群主从容错切换迁移案例 本次案例从模拟两个场景 1:数据读写存储 a:一个新key数据来了,是否会按照预设的进入槽中?集群是否生效 …

黄病毒蛋白酶底物,113866-14-1,Boc-GRR-AMC

Boc-GRR-AMC被拟南芥的II型半胱氨酸蛋白酶Atmc4和Atmc9切割。Boc GRR AMC的储备溶液最好在DMSO中制备。 A substrate for flavivirus proteases such as West Nile virus protease, yellow fever virus NS3 protease, and dengue virus NS2B-NS3 protease.Boc-GRR-AMC is cleav…

JSP ssh排放登记管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh 排放登记管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

抗疫逆行者网页作业 感动人物HTML网页代码成品 网页作业带JS下拉菜单 最美逆行者网页模板 致敬疫情感动人物网页设计制作

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

洛谷P1319 压缩技术

压缩技术 题目描述 设某汉字由 NNN \times NNN 的 0\texttt 00 和 1\texttt 11 的点阵图案组成。 我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有…

使用go语言开发自动化脚本 - 一键定场、抢购、预约、捡漏

原文地址:码农在新加坡的个人博客 背景 不知道大家有没有这种经历,想要抢课,定场,发现抢不到,想要捡漏,又要随时刷,今天我就来讲一下我是怎么使用Go语言开发自动化脚本来解决定场,抢…

圆梦腾讯之路6面阿里、5面字节、4面腾讯,终斩腾讯Offer

6年前,BAT冲到了风口浪尖,美国上市的阿里成为中国体量最大的互联网公司,腾讯借助微信成为移动互联网的霸主,外企开始撤离中国,国企的光环也慢慢褪去。 到了近年,应届毕业生心中最炙手可热的公司换成了TMD及…

数据结构刷题训练营3

开启蓝桥杯备战计划,每日练习算法一题!!坚持下去,想必下一年的蓝桥杯将会有你!!笔者是在力扣上面进行的刷题!!由于是第一次刷题!找到的题目也不咋样!所以&…

[附源码]计算机毕业设计Python工程施工多层级管理架构(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

逃离美国,跨越8000公里远程办公,他开发了世界上最强的虚拟机

“从前”有一门编程语言叫Smalltalk,它是世界上第一个纯粹的面向对象编程语言。 Smalltalk有很多忠实拥趸,在Java崛起之前,它独自可以抗衡C。 著名的《设计模式》一书,其中的代码示例就是C和Smalltalk。 但是Smalltalk运行速度太慢…

缓存架构,减少不必要的计算

前言: 互联网应用的主要挑战就是在高并发情况下,大量的用户请求到达应用系统服务器,造成巨大的计算压力。互联网应用的核心解决思路就是采用分布式架构,提供更多的服务器,从而提供更多的计算的资源,应对高…

VUE3-创建项目《一》

本案例使用vue3进行学习记录,和vue2有些是通用的。 1.需要了解HTML,CSS,JavaScript。 2.了解Node和NPM,node是vue的开发环境,npm是依赖管理包,npm就和Java的maven一样,和c#的NuGet一样&#x…

mac 微信备份到外接硬盘方案(软链接)

mac版本微信中并没有指定备份路径的功能,备份的聊天记录文件也在一个很难找的位置。对于使用256g硬盘的mac的用户,微信聊天记录动辄十几G、几十G的大小,会造成非常严重的硬盘容量恐慌。所以把微信备份文件迁移到外置硬盘是一件非常有意义的工…

实景三维数据汇交、接缝处理难?用网格大师轻松搞定!

为满足全国城市化、智慧化建设发展,实景三维建设进程加快,建设成果日渐增多,随之而来的数据汇交需求增大。然而在实际数据汇交过程中,不仅需要考虑到模型能否直接融合与替换的问题,还将面临几何接缝、色彩不均等问题。…

【DELM回归预测】基于matlab人工蜂群算法改进深度学习极限学习机数据回归预测【含Matlab源码 1885期】

⛄一、PSO-DELM简介 1 DELM的原理 在2004年,极限学习机(extreme learning machine,ELM)理论被南洋理工大学的黄广斌教授提出,ELM是一种单隐含层前馈神经网络(single-hidden layer feedforward neural network,SLFN&am…

虹科新闻 | 虹科与RACOM正式建立合作伙伴关系

近日,虹科与RACOM正式建立合作伙伴关系,双方就工业应用自动化领域进行深入的交流与合作,未来将共同致力于为客户提供高效、可靠的工业通信解决方案,帮助客户布局工业信息系统。 虹科与RACOM都表示十分期待这次的合作。虹科CEO陈秋…

【信管4.3】确认与控制范围

确认与控制范围在范围管理中,我们已经讲完了 4 个管理过程,剩下的两个过程就是对范围的确认以及在整个项目执行过程中进行范围的监控管理。这两个过程的内容都不多,所以今天的内容还是非常轻松的,在正式学习之前,我们先…

再学C语言9:数据类型(7)——总结

一、sizeof()函数检测C环境中数据类型大小 代码&#xff1a; #include <stdio.h> int main(void) {printf("Type int has a size of %u bytes.\n", sizeof(int));printf("Type char has a size of %u bytes.\n", sizeof(char));printf("Type …