【Redis】Redis 主从集群(一)

        为了避免 Redis 的单点故障问题,可以搭建一个 Redis 集群,将数据备份到集群中的其它节点上。若一个 Redis 节点宕机,则由集群中的其它节点顶上

1.主从集群搭建

        Redis 的主从集群是一个“一主多从”的读写分离集群。集群中的 Master 节点负责处理客户端的读写请求,而 Slave 节点仅能处理客户端的读请求。之所以要将集群搭建为读写分离模式,是因为对于数据库集群,写操作压力一般都较小,压力大多数来自于读操作请求。所以,只有一个节点负责处理写操作请求即可

     1.1.伪集群搭建与配置

        在采用单线程 IO 模型时,为了提高处理器的利用率,在一个主机中安装多台 Redis, 构建一个 Redis 主从伪集群

        1)复制 redis.conf:在 redis 安装目录中新建一个目录,名称随意。然后将 redis.conf 文件复制到该目录中。该文件后面会被其它配置文件包含,所以该文件中需要设置每 个 Redis 节点相同的公共的属性

        2)修改 redis.conf:

           a.masterauth:搭建主从集群,每个主机都有可能会是 Master,所以最好不要设置密码验证属性 requirepass。如果真需要设置,一定要每个主机的密码都设置为相同的

           b.repl-disable-tcp-nodelay:该属性用于设置是否禁用 TCP 特性 tcp-nodelay。设置为 yes 则禁用 tcp-nodelay,此时 master 与 slave 间的通信会产生延迟,但使用的 TCP 包数量会较少,占用的网络带宽会较小。反之网络延迟会变小,但使用的 TCP 包数量会较多,相应占用的网络 带宽会大

        3)新建 redis6380.conf:新建一个 redis 配置文件 redis6380.conf,该配置文件中的 Redis 端口号为 6380

        4)再复制出两个 conf 文件:再使用 redis6380.conf 复制出两个 conf 文件:redis6381.conf 与 redis6382.conf。然后分别修改其中的内容

        5)启动三台 Redis

        6)设置主从关系:打开三个会话框,分别使用客户端连接三台 Redis。然后通过 slaveof 命令,指定 6380 的 Redis 为 Master

        7)查看状态信息:通过 info replication 命令可查看当前连接的 Redis 的状态信息

     1.2.分级管理

        若 Redis 主从集群中的 Slave 较多时,其数据同步过程会对 Master 形成较大的性能压力,因此可以对这些 Slave 进行分级管理,让低级别 Slave 指定其 slaveof 的主机为其上一级 Slave

     1.3.容灾冷处理

        Master 出现宕机有两种处理方式:一种是通过手工角色调整,使 Slave 晋升为 Master 的冷处理;一种是使用哨兵模式,实现 Redis 集群的高可用 HA,即热处理

        无论 Master 是否宕机,Slave 都可通过 slaveof no one 将自己由 Slave 晋升为 Master。如 果其原本就有下一级的 Slave,那么,其就直接变为了这些 Slave 的真正的 Master 了。而原来的 Master 也会失去这个原来的 Slave

2.主从复制原理

     2.1.主从复制过程

        1)保存 master 地址:当 slave 接收到 slaveof 指令后,slave 会立即将新的 master 的地址保存下来

        2)建立连接:slave 中维护着一个定时任务,该定时任务会尝试着与该 master 建立 socket 连接。如果连接无法建立,则其会不断定时重试,直到连接成功或接收到 slaveof no one 指令

        3)slave 发送 ping 命令:连接建立成功后,slave 会发送 ping 命令进行首次通信。如果 slave 没有收到 master 的 回复,则 slave 会主动断开连接,下次的定时任务会重新尝试连接

        4)对 slave 身份验证:如果 master 收到了 slave 的 ping 命令,并不会立即对其进行回复,而是会先进行身份验证。如果验证失败,则会发送消息拒绝连接;如果验证成功,则向 slave 发送连接成功响应

        5)master 持久化:首次通信成功后,slave 会向 master 发送数据同步请求。当 master 接收到请求后,会 fork 出一个子进程,让子进程以异步方式立即进行持久化

        6)数据发送:持久化完毕后 master 会再 fork 出一个子进程,让该子进程以异步方式将数据发送给 slave。slave 会将接收到的数据不断写入到本地的持久化文件中。在 slave 数据同步过程中,master 的主进程仍在不断地接受着客户端的写操作,且不仅 将新的数据写入到了 master 内存,同时也写入到了同步缓存。当 master 的持久化文件中的 数据发送完毕后,master 会再将同步缓存中新的数据发送给 slave,由 slave 将其写入到本地 持久化文件中。数据同步完成。

        7)slave 恢复内存数据:当 slave 与 master 的数据同步完成后,slave 就会读取本地的持久化文件,将其恢复到 本地内存,然后就可以对外提供读服务了

        8)持续增量复制:在 slave 对外提供服务过程中,master 会持续不断的将新的数据以增量方式发送给 slave, 以保证主从数据的一致性

     2.2.数据同步演变过程

        1)sync 同步:Redis 2.8 版本之前,首次通信成功后,slave 会向 master 发送 sync 数据同步请求。然后 master 就会将其所有数据全部发送给 slave,由 slave 保存到其本地的持久化文件中。这个过 程称为全量复制

               问题:由于全量复制过程非常耗时,所以期间出现网络抖动的概率很高,从而导致复制过程中断。 网络恢复后,slave 与 master 重新连接成功,此时 slave 会重新发送 sync 请求,然后会从头开始全量复制,不仅需要消耗大量的系统资源、网络带宽,而且可能会出现长时间无法完成全量复制的情况

        2)psync 同步:Redis 2.8 版本之后,全量复制采用了 psync(不完全同步)同步策略。当 全量复制过程出现由于网络抖动而导致复制过程中断时,当重新连接成功后,复制过程可以 “断点续传”。即从断开位置开始继续复制,而不用从头再来。这就大大提升了性能

           a.复制偏移量:系统为每个要传送数据进行了编号,该编号从 0 开始,每个字节一个编号,该编号称为复制偏移量,参与复制的主从节点都会维护该复制偏移量。master 每发送过一个字节数据后就会进行累计。统计信息通过 info replication 的 master_repl_offset 可查看到

           b.主节点复制 ID:当 master 启动后就会动态生成一个长度为 40 位的 16 进制字符串作为当前 master 的复 制 ID,该 ID 是在进行数据同步时 slave 识别 master 使用的。通过 info replication 的 master_replid 属性可查看到该 ID

           c.复制积压缓冲区:当 master 有连接的 slave 时,在 master 中就会创建并维护一个队列 backlog,默认大小 为 1MB,该队列称为复制积压缓冲区。master 接收到了写操作数据不仅会写入到 master 主 存,写入到 master 中为每个 slave 配置的发送缓存,而且还会写入到复制积压缓冲区。其作 用就是用于保存最近操作的数据,以备“断点续传”时做数据补偿,防止数据丢失

           d.psync 同步过程:

           e.psync 存在的问题:在 psync 数据同步过程中,若 slave 重启,在 slave 内存中保存的 master 的动态 ID 与续 传 offset 都会消失,“断点续传”将无法进行,从而只能进行全量复制,导致资源浪费;在 psync 数据同步过程中,master 宕机后 slave 会发生“易主”,从而导致 slave 需要从 新 master 进行全量复制,形成资源浪费

        3)psync 同步的改进:Redis 4.0 对 psync 进行了改进,提出了“同源增量同步”策略

           a.解决 slave 重启问题:将 master 的动态 ID 直接 写入到了 slave 的持久化文件中

           b.解决 slave 易主问题:slave 易主后需要和新 master 进行全量复制,本质原因是新 master 不认识 slave 提交的 psync 请求中“原 master 的动态 ID”。由于改进后的 psync 中每个 slave 都在本地保存了当前 master 的动态 ID,所以当 slave 晋升为新的 master 后,其本地仍保存 有之前 master 的动态 ID。

        4)无盘操作:Redis 6.0 对同步过程又进行了改进,提出了“无盘全量同步”与“无盘加载”策略,避免了耗时的 IO 操作

           a.无盘全量同步:master 的主进程 fork 出的子进程直接将内存中的数据发送给 slave,无 需经过磁盘

           b.无盘加载:slave 在接收到 master 发送来的数据后不需要将其写入到磁盘文件,而是直 接写入到内存,这样 slave 就可快速完成数据恢复

        5)共享复制积压缓冲区:Redis 7.0 版本对复制积压缓冲区进行了改进,让各个 slave 的发送缓冲区共享复制积压缓冲区。这使得复制积压缓冲区的作用,除了可以保障数据的安全性外,还作为所有 slave 的发送缓冲区,充分利用了复制积压缓冲区

3.哨兵机制实现

        在集群中再引入一个节点,该节点充当 Sentinel 哨兵,用于监视 Master 的运行状态,并在 Master 宕机后自动指定一个 Slave 作为新的 Master。 整个过程无需人工参与,完全由哨兵自动完成。

        不过哨兵又成为了一个单点故障点:若哨兵发生宕机,整个集群将瘫痪。所以为了解决这个问题,又要为哨兵创建一个集群,即哨兵集群。一个哨兵的宕机,将不会影响到 Redis 集群的运行

        每个 Sentinel 都会定时会向 Master 发送心跳,如果 Master 在有效时间内向它们都进行了响 应,则说明 Master 是“活着的”。如果 Sentinel 中有 quorum 个哨兵没有收到响应,那么就认为 Master 已经宕机,然后会有一个 Sentinel 做 Failover 故障转移。即将原来的某一个 Slave 晋升为 Master

     3.1.Redis 高可用集群搭建

        可以让 Sentinel 占用独立的主机,即在 Redis 主机上只启动 Redis 进程,在 Sentinel 主机上只启动 Sentinel 进程。下面搭建一个“一主二从三哨兵”的高可用伪集群

角色端口角色端口
master6380sentinel26380
slave6381sentinel26381
slave6382sentinel26382

        1)复制 sentinel.conf:将 Redis 安装目录中的 sentinel.conf 文件复制到 cluster 目录中。该配置文件中用于存放 一些 sentinel 集群中的一些公共配置

        2)修改 sentinel.conf:修改 cluster/sentinel.conf 配置文件

           a.sentinel monitor:该配置用于指定 Sentinel 要监控的 master 是谁

           b.sentinel auth-pass:指定 master 的主机名 与访问密码。以方便 sentinel 监控 master

        3)新建 sentinel26380.conf:在 Redis 安装目录下的 cluster 目录中新建 sentinel26380.conf 文件作为 Sentinel 的配置文件,内容:

        4)再复制两个 conf 文件:再使用sentinel26380.conf 复制出两个conf文件:sentinel26381.conf与sentinel26382.conf,内容:

     3.2.高可用集群的启动

        1)启动并关联 Redis 集群:启动三台 Redis,然后再通过 slaveof 关联它们

        2)启动命令:两种方式本质相同,redis-sentinel 命令是 redis-server 命令的软链接

           a.方式一,使用 redis-sentinel 命令:redis-sentinel sentinel26380.conf

           b.方式二,使用 redis-server 命令:redis-server sentinel26380.conf --sentinel

        3)查看 Sentinel 信息:运行中的 Sentinel 就是一个特殊 Redis,其也可以通过客户端连接,然后通过 info sentinel 来查看当前连接的 Sentinel 的信息

     3.3.Sentinel 优化配置

        在公共的 sentinel.conf 文件中,通过修改一些其它属性的值来达到对 Sentinel 的 配置优化

        1)sentinel down-after-milliseconds:每个 Sentinel 会通过定期发送 ping 命令来判断 master、slave 及其它 Sentinel 是否存活。 如果 Sentinel 在该属性指定的时间内没有收到它们的响应,那么该 Sentinel 就会主观认为该 主机宕机。默认为 30 秒

        2)sentinel parallel-syncs:该属性用于指定,在故障转移期间,即老的 master 出现问题,新的 master 刚晋升后, 允许多少个 slave 同时从新 master 进行数据同步。默认值为 1 表示所有 slave 逐个从新 master 进行数据同步

        3)sentinel failover-timeout:指定故障转移的超时时间,默认时间为 3 分钟。用途:由于第一次故障转移失败,在同一个 master 上进行第二次故障转移尝试的时间为该 failover-timeout 的两倍;新 master 晋升完毕,slave 从老 master 强制转到新 master 进行数据同步的时间阈值;取消正在进行的故障转换所需的时间阈值;新 master 晋升完毕,所有 replicas 的配置文件更新为新 master 的时间阈值

        4)sentinel deny-scripts-reconfig:指定是否可以通过命令 sentinel set 动态修改 notification-script 与 client-reconfig-script 两 个脚本。默认是不能的。这两个脚本如果允许动态修改,可能会引发安全问题

        5)动态修改配置:通过 redis-cli 连接上 Sentinel 后,通过 sentinel set 命令可动态修改配置信息。例如,下 面的命令动态修改了 sentinel monitor 中的 quorum 的值

参数示例
quorumsentinel set mymaster quorum 2
down-after-millisecondssentinel set mymaster down-after-milliseconds 50000
failover-timeoutsentinel set mymaster failover-timeout 300000
parallel-syncssentinel set mymaster parallel-syncs 3
notification-scriptsentinel set mymaster notification-script /var/redis/notify.sh
client-reconfig-scriptsentinel set mymaster client-reconfig-script /var/redis/reconfig.sh
auth-passsentinel set mymaster auth-pass 111

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

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

相关文章

从油猴脚本管理器的角度审视Chrome扩展

从油猴脚本管理器的角度审视Chrome扩展 在之前一段时间,我需要借助Chrome扩展来完成一个需求,当时还在使用油猴脚本与浏览器扩展之间调研了一波,而此时恰好我又有一些做的还可以的油猴脚本TKScript (点个star吧 😁),相…

面向对象 05:三大特性之——继承,继承在 Java 中的相关使用,区分关键字 super 和 this,方法重写的注意点

一、前言 记录时间 [2024-05-13] 系列文章简摘: 面向对象 01:Java 面向对象相关内容整体概述 面向对象 02:区分面向过程与面向对象,类和对象的关系 面向对象 03:类与对象的创建、初始化和使用,通过 new 关键…

数字人解决方案——AniPortrait音频驱动的真实肖像动画合成

概述 在当今数字化时代,将静态图像和音频素材转化为动态、富有表现力的肖像动画,已经成为游戏、数字媒体、虚拟现实等多个领域的重要技术。然而,开发人员在创建既具有视觉吸引力又能保持时间一致性的高质量动画框架方面面临着巨大挑战。其中…

k8s endpoint

Endpoint Service 并不是和 pod 直接相连的,Endpoint 介于两者之间。Endpoint 资源就是暴露一个服务的 IP 地址和端口的列表。 虽然在 spec 服务中定义了 pod 选择器,但在重定向传入连接时不会直接使用它。选择器用于构建 IP 和端口列表,然…

数据特征降维 | t-分布随机邻域嵌入(t-SNE)附Python代码

t-分布随机邻域嵌入(t-Distributed Stochastic Neighbor Embedding,t-SNE)是一种非线性降维和可视化技术,广泛用于高维数据的可视化和聚类分析。 t-SNE的基本思想是通过在高维空间中测量样本之间的相似性,将其映射到低维空间中,以便更好地展示数据的结构和关系。与传统的…

优思学院:精益六西格玛如何影响企业文化?

精益六西格玛(Lean Six Sigma)是一种在优化生产过程、提高效率、减少浪费的管理方法论。其影响远不止于生产线或质量控制部门,实际上,精益六西格玛的实施可以深刻影响企业文化的各个层面,從而令企業獲得真正最大的成功…

libxml2解析xml文档,c语言实现,并给出案例

test.xml文档内容如下&#xff1a; <root><name>Debug.group</name><website>https://debug.group</website><function><json>https://debug.group/json.html</json><sql>https://debug.group/sql.html</sql><…

SpringBoot MockMvc

SpringBoot MockMvc 1 什么是 MockMvc&#xff1f;2 为什么使用 MockMvc&#xff1f;3 如何使用 MockMvc&#xff1f;3.1 Controller3.2 测试方法一3.3 测试方法二 1 什么是 MockMvc&#xff1f; Spring Boot 提供了一个方便的测试工具类 MockMvc&#xff0c;用于对 Controlle…

【JavaScript超详细的学习笔记-下】JavaScrip超详细的学习笔记,共27部分,12多万字,学习js不错的选择,内容超详细

想要获取笔记的可以点击下面链接获取&#xff0c;或者私信我 ** JavaScript超详细的学习笔记&#xff0c;点击我获取 13&#xff0c;闭包 13-1 闭包 闭包是指有权访问另一个函数作用域中的变量的函数&#xff1b;其本质就是在一个函数内部创建另一个内部函数&#xff1b;并…

基于若依的开源网盘系统

简介 在线网盘系统&#xff0c;使用了DFA算法&#xff0c;实现了文件夹的创建与修改&#xff0c;多级目录&#xff0c;很正常的文件夹一样&#xff0c;支持所有文件上传&#xff0c;并按文件类型分类&#xff0c;支持文件删除&#xff0c;回收站管理&#xff0c;恢复与彻底删除…

数据特征降维 | 局部线性嵌入(LLE)

局部线性嵌入(Locally Linear Embedding,LLE)是一种非线性降维和数据嵌入技术,用于将高维数据映射到低维空间中,以便更好地展示数据的结构和关系。 LLE的基本思想是假设数据样本在局部区域内可以近似由其相邻样本的线性组合表示。通过保持这种局部线性关系,LLE能够在低维…

掌握QPainter:Qt中的绘图艺术

目录标题 1. QPainter概述2. 创建QPainter对象3. 绘制基本图形4. 绘制文本5. 绘制图像6. 使用画笔&#xff08;QPen&#xff09;7. 使用画刷&#xff08;QBrush&#xff09;8. 图形变换9. 抗锯齿与优化10. 实例代码与解析11. 总结 在Qt的世界里&#xff0c;QPainter是一位多才多…

设计模式-11 - Adapter Pattern 适配器设计模式

设计模式-11 - Adapter Pattern 适配器设计模式 1.定义 适配器模式是一种结构型设计模式&#xff0c;它允许具有不同接口的两个类一起工作。它通过创建一个适配器类来实现这一点&#xff0c;该适配器类将一个类的接口转换为另一个类所需的接口。 2.内涵 适配器设计模式的内涵…

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势&#xff0c;其市场价值不仅体现在竞赛本身&#xff0c;还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目&#xff0c;包括竞速赛、技巧赛、航拍赛等。每个项目…

Ubuntu下C++编程总结AllInOne

之前主要是在win下用VisualStudio&#xff0c;现在研究总结在ubuntu下使用CMake编程经验&#xff0c;填坑记录 目录 0. 前述1.Ubuntu下多线程使用 0. 前述 1.Ubuntu下多线程使用 出现的问题&#xff1a;undefined reference to symbol pthread_create 使用多线程&#xff0c…

HR人才测评:自控能力与岗位胜任力素质测评

自控能力是什么&#xff1f; 自控能力可以解释为自我控制的能力&#xff0c;指一个人在应对人事物突发事件时&#xff0c;及时调整进行的自我控制的表现&#xff0c;它是实行自我支配的一种能力&#xff0c;在能进行自主支配时&#xff0c;一个人就成熟不少了&#xff0c;也可以…

js的跳转传参方式

在JavaScript中&#xff0c;实现页面跳转并传递参数的方式有多种&#xff0c;以下是一些常见的方法&#xff1a; URL参数 你可以通过修改URL的查询字符串&#xff08;query string&#xff09;来传递参数。这些参数会在URL的?之后&#xff0c;并使用&进行分隔。 代码 /…

优选算法——双指针1

双指针 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 对撞指针&#xff1a;⼀般⽤于顺序结构中&#xff0c;也称左右指针。 对撞指针从两端向中间移动。⼀个指针从最左端开始&#xff0c;另⼀个从最右端开始&#xff0c;然后逐渐往中间逼 近…

std::mem_fn和std::mem_fun

std::mem_fn和std::mem_fun&#xff08;deprecated&#xff09; Convert member function to function object&#xff0c;即将成员函数转化为函数对象&#xff0c;这样就可以像普通函数那样使用。 示例一&#xff1a; #include <iostream> // std::cout #include …

MySQL-InnoDB数据存储结构

1、存储结构-页 索引结构提供了高效的索引方式&#xff0c;索引信息以及数据记录都保存在数据文件或索引文件中&#xff08;本质存储在页结构中&#xff09; 1.1、磁盘与内存交互的基本单位&#xff1a;页 在InnoDB中将数据划分为若干页&#xff0c;页的默认大小为&#xff…