redis主从搭建

news2025/3/16 5:42:11

1. 哨兵

1.1 ⼈⼯恢复主节点故障

        Redis 的主从复制模式下,⼀旦主节点由于故障不能提供服务,需要⼈⼯进⾏主从切换,同时⼤量 的客⼾端需要被通知切换到新的主节点上,对于上了⼀定规模的应⽤来说,这种⽅案是⽆法接受的, 于是Redis从2.8开始提供了RedisSentinel(哨兵)加个来解决这个问题。

        通过自动化的手段,来解决主节点挂了的问题。哨兵机制,是通过独立的进程来体现的和之前redis-server是不同的进程。redis-sentinel不负责存储数据,只是对其他的redis-server进程起到监控的效果。通常哨兵节点,也会搞一个集合(多个哨兵节点构成的),防止单个哨兵节点挂了。

        Redis 主节点故障后需要进⾏的操作

          程序如何恢复:

          1.先看看主节点还能不能抢救了,好不好抢救。

          2.如果主节点这边是啥原因挂的,不好定位;或者原因知道,但是短时间难以解决 ,就需要挑一个从节点,设置为新的主节点~

            a)把选中的从节点,通过slaveof no one,自立山头

           b)把其他的从节点,修改slaveof的主节点ip port,连上新的主节点

           c)告知客户端(修改客户端的配置),让客户端能够连接新的主节点,用来完成修改数据的操作。

        当之前的挂了的主节点,修好了之后,就可以作为一个新的从节点,挂到这组机器中。

1.2  哨兵⾃动恢复主节点故障 

        当主节点出现故障时,Redis Sentinel能⾃动完成故障发现和故障转移,并通知应⽤⽅,从⽽实现 真正的⾼可⽤。

        Redis Sentinel 是⼀个分布式架构,其中包含若⼲个Sentinel节点和Redis数据节点,每个 Sentinel 节点会对数据节点和其余Sentinel节点进⾏监控,当它发现节点不可达时,会对节点做下线表⽰。如果下线的是主节点,它还会和其他的Sentinel节点进⾏“协商”,当⼤多数Sentinel节点对 主节点不可达这个结论达成共识之后,它们会在内部“选举”出⼀个领导节点来完成⾃动故障转移的 ⼯作,同时将这个变化实时通知给Redis应⽤⽅。整个过程是完全⾃动的,不需要⼈⼯介⼊。整体的 架构如图所⽰。

        这⾥的分布式架构是指:Redis数据节点、Sentinel节点集合、客⼾端分布在多个物理节点 上。

        Redis Sentinel 架构

        如果是从节点挂了~~其实没关系~
        1、如果是主节点挂了,哨兵就要发挥作用了。
           此时,一个哨兵节点发现主节点挂了还不够,需要多个哨兵节点来共同认同这件事情,主要是为了防止出现误判。
        2、主节点确实是挂了,这些哨兵节点中,就会推举出一个leader,由这个leader负责从现有的从节点中,挑选一个作为新的主节点

        3、挑选出新的主节点之后,哨兵节点就会自动控制该被选中的节点,执行slaveof no one,并且控制其他从节点,修改 slaveof 到新的主节点上。
        4、哨兵节点会自动的通知客户端程序,告知新的主节点是谁,并且后续客户端再进行的写
操作,就会针对新的主节点进行操作了。

1.3 redis哨兵核心功能

         1.监控

         2.自动的故障转移

         3.通知

        注意,redis哨兵节点有一个也是可以的。

        1.如果哨兵节点只有一个,它自身也是容易出现问题,万一这个哨兵节点挂了,后续redis节点也挂了,就无法进行自动的恢复过程了。

        2.哨兵节点出现误判的概率也比较高,网络传数据是容易出现抖动或者延退或者丢包的,如果只有一个哨兵节点,出现上述问题之后,影响就比较大。

        基本的原则:在分布式系统中,应该避免使用“单点“,尽量冗余一点。

        哨兵节点,最好要搞奇数个,建议最少也应该是3个。

2.使用docker搭建环境

        docker的安装

        只有一个云服务器,就在一个云服务器上配置六个节点,来完成这里的环境搭建,使用docker可以有效解决上面环境搭建文件配置繁琐的问题。

        虚拟机,通过软件在一个电脑上模拟出另外的一些硬件(构造了另一个虚拟的电脑),虚 拟机这样的软件,就可以使用一个计算机,来模拟出多个电脑的情况~
          但是虚拟机有一个很大的问题:比较吃配置,这个事情对于咱们的云服务器来说,压力山大。docker可以认为是一个“轻量级”的虚拟机,起到了虚拟机这样的隔离环境的效果,但是又没有吃很多的硬件资源,即使是配置比较拉的云服务器,也能构造出好几个这样的虚拟的环境,docker也是现在后端开发这块非常流行的组件。

        1.安装docker和docker-compose                                  
        2.停止之前的redis服务器

        service redis-server stop

        3.使用docker获取到redis的镜像

      docker pull redis:5.0.9

         docker pull使用docker从中央仓库(默认就是从docker hub)来拉取镜像拉取到的镜像,里面包含一个精简的Linux操作系统,并且上面会安装redis.只要直接基于这个镜像创建一个容器跑起来,此时,redis服务器就搭建好了。

        基于docker来搭建redis哨兵环境了,使用docker-compose来进行容器编排。此处涉及到多个redis server,也有多个redis哨兵节点。每一个redis server或者每一个redis哨兵节点都是作为一个单独的容器了。

        通过一个配置文件,把具体要创建哪些容器,每个容器运行的各种参数,描述清楚。后续通过一个简单的命令,就能够批量的启动/停止这些容器。使用yml这样的格式来作为配置文件,spring也是使用yml来作为配置文件的。

3. 搭建redis数据节点

        1)创建三个容器,作为redis的数据节点(一个主两个从)   
        2)创建三个容器,作为redis的哨兵节点                
       其实也是可以用一个yml文件,直接启动6个容器,如果把这个6个容器同时启动,可能是哨兵先启动完成,数据节点后启动完成,哨兵可能就会先认为是数据节点挂了,虽然对于大局不影响,但是会影响到观察执行日志的过程~

        配置文件的名字docker-compose.yml是固定的。

下面的客户端连接的容器中的镜像redis服务器:


                                    

4. 搭建redis哨兵节点

        redis哨兵节点是单独的redis服务器进程。

        理解 sentinel monitor

         sentinel monitor 主节点名 主节点 ip 主节点端⼝ 法定票数

        • 主节点名,这个是哨兵内部⾃⼰起的名字.

         • 主节点ip,部署redis-master的设备ip.此处由于是使⽤docker,可以直接写docker的容器名,会 被⾃动DNS成对应的容器ip

         • 主节点端⼝,不解释.

        • 法定票数,哨兵需要判定主节点是否挂了.但是有的时候可能因为特殊情况,⽐如主节点仍然⼯作正 常,但是哨兵节点⾃⼰⽹络出问题了,⽆法访问到主节点了.此时就可能会使该哨兵节点认为主节点 下线,出现误判.使⽤投票的⽅式来确定主节点是否真的挂了是更稳妥的做法.需要多个哨兵都认为 主节点挂了,票数>=法定票数之后,才会真的认为主节点是挂了

        创建配置⽂件

后台方式启动docker:

查看docker运行日志:

        docker-compose logs

列出当前docker中的局域网

 

重新修改yml文件 vim docker-compose.yml

关闭之前开启的容器,重新开启,发现此处的配置。

        是否可以把六个容器,都写到同一个yml配置中,一次全都启动不就直接保证互通问题了嘛?

        如果使用这种方案,由于docker-compose启动容器的顺序不确定,就不能保证redis-server一定是在哨兵之前启动的!最终结果也能正确运行,但是执行的日志可能有变数 ,分成两组来启动,就可以保证上述顺序.  观察到的日志,比较可控的。

        重新打开哨兵节点的配置文件,发现被重写。

5. 哨兵存在的意义

        哨兵存在的意义,能够在redis主从结构出现问题的时候(比如主节点挂了),此时哨兵节点就能够自动的帮我们重新选出一个主节点,来代替之前挂了的节点,保证整个redis仍然是可用状态。
        手动把主节点给干掉,当主节点挂了之后,哨兵节点就开始工作了!如下:

        docker stop master-redis;

        查看日志:

         docker stop master-redis;在重新启动主节点。

        哨兵重新选取主节点的流程:

        1.主观下线

          哨兵节点通过心跳包,判定redis服务器是否正常工作,如果心跳包没有如约而至,就说明redis服务器挂了,此时还不能排除网络波动的影响,因此就只能是单方面认为这个redis节点挂了        

        2.客观下线

         多个哨兵都认为主节点挂了.(认为挂了的哨兵节点数目达到法定票数),哨兵们就认为这个主节点是客观下线

         3.要让多个哨兵节点,选出一个leader节点,由这个leader负责选一个从节点作为新的主节点

        4.此时leader选举完毕,leader就需要挑选一个从节点,作为新的主节点

       1)优先级:每个redis数据节点,都会在配置文件中有一个优先级的设置.slave-priority,优先级高的从节点,就会胜出       

        2) offset最大,就胜出。offset从节点从主节点这边同步数据的进度。数值越大,说明从节点的数据和主节点就越接近                                

     3)runid每个redis节点启动的时候随机生成的一串数字(大小全凭缘分了,此时,选谁都可以了,随便挑一个)
      把新的主节点指定好了之后,leader就会控制这个这个节点,执行slave no one,成为master,再控制其他节点执行slave of,让这些其他节点,以新的master作为主节点了。

        哨兵小结:

• 哨兵节点不能只有⼀个.否则哨兵节点挂了也会影响系统可⽤性.

• 哨兵节点最好是奇数个.⽅便选举leader,得票更容易超过半数.

• 哨兵节点不负责存储数据.仍然是redis主从节点负责存储.

• 哨兵+主从复制解决的问题是"提⾼可⽤性",不能解决"数据极端情况下写丢失"的问题.

• 哨兵+主从复制不能提⾼数据的存储容量(redis集群,解决存储容量问题的有效方案).当我们需要存的数据接近或者超过机器的物理内存,这样 的结构就难以胜任了.

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

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

相关文章

Linux中Gdb调试工具常用指令大全

1.gdb的安装 如果你是root用户直接用指令 :yum install gdb ;如果你是普通用户用指令:sudo yum install gdb; 2.gdb调试前可以对你的makefile文件进行编写: 下面展示为11.c文件编写的makefile文件: code…

操作系统-八股

进程基础: 进程定义:运行中的程序,有独立的内存空间和地址,是系统进行资源调度和分配的基本单位。 并发,并行 并发就是单核上面轮询,并行就是同时执行(多核); 进程上下…

ICLR2025 | SLMRec: 重新思考大语言模型在推荐系统中的价值

note 问题背景:序列推荐(SR)任务旨在预测用户可能的下一个交互项目。近年来,大型语言模型(LLMs)在SR系统中表现出色,但它们巨大的规模使得在实际平台中应用变得低效和不切实际。 研究动机&…

71.HarmonyOS NEXT PicturePreviewImage组件深度剖析:从架构设计到核心代码实现

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT PicturePreviewImage组件深度剖析:从架构设计到核心代码实现 (一) 文章目录 HarmonyOS NEXT PicturePreviewImage组件深…

简单实现京东登录页面

Entry Component struct Index {State message: string ;build() { Column(){//顶部区域Row(){Image($r(app.media.jd_cancel)).width(20).height(20)Text(帮助)}.width(100%).justifyContent(FlexAlign.SpaceBetween)//logo图标Image($r(app.media.jd_logo)).width(250).heig…

9.贪心算法

简单贪心 1.P10452 货仓选址 - 洛谷 #include<iostream> #include<algorithm> using namespace std;typedef long long LL; const int N 1e510; LL a[N]; LL n;int main() {cin>>n;for(int i 1;i < n;i)cin>>a[i];sort(a1,a1n);//排序 LL sum 0…

大模型训练全流程深度解析

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 1. 大模型训练概览1.1 训练流程总览1.2 关键技术指标 2. 数据准备2.1 数据收集与清洗2.2 数据…

每日一题---单词搜索(深搜)

单词搜索 给出一个二维字符数组和一个单词&#xff0c;判断单词是否在数组中出现&#xff0c; 单词由相邻单元格的字母连接而成&#xff0c;相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。 数据范围&#xff1a; 0 < 行长度 < 100 0 < 列长度 <…

插入排序c++

插入排序的时间复杂度为O&#xff08;N^2&#xff09;&#xff0c;和冒泡排序的时间复杂度相同&#xff0c;但是在某些情况下插入排序会更优。 插入排序的原理是&#xff1a;第1次在0~0范围内排序&#xff0c;第2次在0~1范围内排序&#xff0c;第3次在0~2范围内排序……相当于…

Swagger 从 .NET 9 中删除:有哪些替代方案

微软已经放弃了对 .NET 9 中 Swagger UI 包 Swashbuckle 的支持。他们声称该项目“不再由社区所有者积极维护”并且“问题尚未得到解决”。 这意味着当您使用 .NET 9 模板创建 Web API 时&#xff0c;您将不再拥有 UI 来测试您的 API 端点。 我们将调查是否可以在 .NET 9 中使用…

嵌入式八股ARM篇

前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…

使用DeepSeek和墨刀AI,写PRD文档、画原型图的思路、过程及方法

使用DeepSeek和墨刀AI&#xff0c;写PRD文档、画原型图的思路、过程及方法 现在PRD文档要如何写更高效、更清晰、更完整&#xff1f; 还是按以前的思路写PRD&#xff0c;就还是以前的样子。 现在AI这么强大&#xff0c;产品经理如何使用DeepSeek写PRD文档&#xff0c;产品经…

【VUE2】第五期——VueCli创建项目、Vuex多组件共享数据、json-server——模拟服务端api

黑马程序员视频地址&#xff1a;091-vuex的基本认知_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1HV4y1a7n4?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p91 目录 1 VueCli 自定义创建项目 2 Eslint代码规范 2.1 规…

rpmlib(SetVersions) is needed by can-uilts-v2019.00.0-alt1.aarch64

在我在Linux中安装离线CAN工具时&#xff0c;出现了一个问题&#xff0c; rootwanghuo:~# rpm -ivh can-uilts-v2019.00.0-alt1.aarch64.rpm error: Failed dependencies:rpmlib(SetVersions) is needed by can-uilts-v2019.00.0-alt1.aarch64 意思是尝试安装 can-uilts-v20…

CNN 稠密任务经典结构

FCN UNet FPN FCNUNETFPNpadding无&#xff08;逐渐变小&#xff09; 有&#xff08;左右对称&#xff09;上采样 双线性双线性 最近邻跳跃链接 相加 Cropcat 1x1卷积相加 三个网络差不多&#xff0c;UNet名字最直观&#xff0c;后续流传…

算法刷题整理合集(二)

本篇博客旨在记录自已的算法刷题练习成长&#xff0c;里面注有详细的代码注释以及和个人的思路想法&#xff0c;希望可以给同道之人些许帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误或遗漏之处&#xff0c;望各位可以在评论区指正出来&#xf…

STM32配套程序接线图

1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…

Houdini学习笔记

1. Houdini中一次只能显示一个物体 如果要都显示 需要 merge 节点 粉色的是 以参考显示 2.对任意一个节点按F1 可以弹出houdini官方文档 3. 恢复视角 Space H,居中 Space G 居中选中物体

仿Ant Design Vue风格自定义浏览器滚动条样式

仿Ant Design Vue风格自定义浏览器滚动条样式 问题原因 浏览器默认的滚动条样式很丑&#xff0c;无法满足需求&#xff0c;需要自定义滚动条样式&#xff0c;参考ant-design-vue的样式 css修改滚动相关属性可查阅官方文档 选择器介绍 ::webkit-scrollbar&#xff1a;滚动条…

单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明

单元测试、系统测试、集成测试、回归测试的梳理说明 单元测试 步骤&#xff1a; 编写测试用例&#xff0c;覆盖代码的各个分支和边界条件。使用测试框架&#xff08;如JUnit、NUnit&#xff09;执行测试。检查测试结果&#xff0c;确保代码按预期运行。修复发现的缺陷并重新测…