当前位置: 首页 > news >正文

Redis --- 第八讲 --- 关于主从复制哨兵

主从复制的补充问题

从节点和主节点之间断开连接,有两种情况:

1、从节点和主节点断开连接

slaveof no one 命令。这个时候,从节点就能能够晋升成主节点。意味着我们程序员要主动修改redis的组成结构。,

2、主节点挂了

这个时候从节点不会晋升成主节点的。必须通过人工干预的方式恢复主节点。

这个是脱离咱们掌控的。

Redis主节点无法重启的问题:

通过service redis-server start 启动的redis服务器,是通过一个redis这样的用户,来启动的。而redis server需要按照可读可写的方式打开aof文件,而这个文件对于root之外的用户只有读权限。因此service redis-server start启动的redis服务器无法打开appendonly.aof文件。因为这里我们的三个服务器是使用的同一个appendonly.aof文件。

解决方案:把三个redis服务器的生成的文件,也给区分开。更靠谱的是,直接把三个redis服务器的工作目录区分开。(修改配置文件中的dir选项)

1、停止之前的redis服务器

2、删除之前工作目录下,已经生成的aof文件或者通过也可以通过chown命令修改以下所属用户。

3、给从节点创建出新的目录,用来作为从节点的工作目录。并且修改从节点的配置文件,设定成新的目录为工作目录。

4、启动redis服务器。

一、哨兵机制

人工,大部分是不太靠谱的。通过自动化的手段来解决主节点挂了的问题。也就是哨兵机制。

更哨兵机制有关的概念

哨兵机制是通过独立的进程来体现的和之前的redis-server是不同的进程。redis-sentinel不负责存储数据,只是对其他的redis-server起到监控的作用。通常哨兵节点,也会搞一个集合。单个哨兵节点挂了咋办。

Redis sentinel架构

单独的redis sentinel进程,提供了多个。并且这三个哨兵进程就会自动监控现有的redis master和slave。监控:这些进程之间,会建立tcp长连接,通过这样的长连接,定期发送心跳包。借助上述的监控机制,就可以即使发现某个主机是否是挂了。如果是从节点挂了,其实没有关系。如果是主节点挂了,哨兵就要发挥作用了。

第一步:此时一个哨兵节点发现主节点挂了,还不够,需要多个哨兵节点来共同认同这件事情,主要是为了防止出现误判。

第二步:主节点确实是挂了,这些哨兵节点中,就会推举一个leader,有这个leader负责从现有从节点中挑一个作为新的主节点。

第三步:挑选出新的主节点之后,哨兵节点,就会自动控制该被选中的节点,执行slaveof no one,并且控制其他从节点,修改slaveof到新的主节点上。

第四步:哨兵节点会自动的通知客户端程序,告知新的主节点是谁,并且后续客户端再进行写操作,就会针对新的主节点进行操作了。

Redis哨兵的核心功能:

1、监控

2、自动的故障转移

3、进行通知

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

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

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

基本原则:在分布式系统中,应该避免使用单点。也就是冗余。哨兵节点最后要搞奇数个,最少也应该是3个。

使用docker搭建环境

一个主节点和两个从节点,和三个哨兵的节点。

按理说,这6个节点,是要在6个不同的服务器主机上的。此时,只有一个云服务器,就在一个云服务器上,来完成这里的环境搭建。在实际工作中,把上述节点放到一个服务器上,是没有意义的。当前这么做只是迫于无奈的。

由于这些节点还挺多的,相互之间容易打架,依赖的端口号/配置文件/数据文件。如果咱们直接部署,就需要小心翼翼的去避开这些冲突。这种方式比较繁琐。也会和不同主机上部署,存在较大差异。

但是我们使用docker就可以有效的解决上述的问题。

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

docker中关键概念:容器,看作一个轻量级的虚拟机。

1、需要安装docker和docker-compose。

2、停止之前的redis服务器。

3、使用docker获取到redis的镜像。docker中的镜像和容器类似于可执行程序和进程的关系。镜像可以自己构建,也可以直接拿别人已经构建好的。docker hub。包含了很多其他大佬们构建好的镜像。

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

查看镜像。

基于docker来搭建redis哨兵环境了。

通过docker-compose来进行容器编排,此处涉及到多个redis server 也有多个redis哨兵节点。每一个redis server或者每一个redis哨兵节点都是作为一个单独的容器了。我们现在又6个容器了。

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

<>中成对出现的标签。html中的标签,都是标准规定的。xml中的标签,都是自定义的。写起来特别啰嗦。并且也比较占用空间。后来,又有了json这样的格式。

yml格式和json有一些相似之处,yml虽然没有json格式这么火,也还是挺广泛使用的。

和json都是这种比较直观的键值对结构,json是使用{}来表示层级结构,yml则是使用缩进来表示。yml相对于json的优势。对于格式要求的更严格,可读性会更好。更有助于人来理解。

编排工作:

1)创建三个容器,作为redis的数据节点(一个主,两个从)

2)创建三个容器,作为redis的哨兵节点。

文件名必须是固定的。

书写以下信息

version版本号

services启动哪些服务器

master,slave1,slave2 主从服务器名。

image:容器基于哪一个镜像。

command:启动redis服务器的选项。

ports:端口映射,docker容器,可以理解成是一个轻量的虚拟机。在这个容器里,端口号和外面宿主机的端口号是两个体系。如果容器外面使用了5000端口,在容器内部也可以使用5000彼此不会冲突。有的时候,希望在容器外面能够访问到容器里面的端口号。就可以把容器内部的端口映射成宿主机的端口。

有的端口,希望在容器外访问容器内部的端口,需要进行端口映射,把容器里的端口映射到宿舍主机上,后续访问宿主机的这个端口,就相当于在访问对应容器的对应端口了。站在宿主的角度,访问上述几个端口的时候,也不知道这个端口实际上是一个宿主机上的服务,还是一个来自于一个容器内部的服务。只要正常去使用即可。这里的映射过程非常像NAT一样。

启动容器。

查看对应的日志。

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

文件映射:哨兵节点,会在运行过程中,对配置文件进行自动的修改。因此,就不能拿一个配置文件,给三个容器分别映射。

接下里再来看这三个配置文件的具体细节。初始情况下,这三个配置文件内容可以是一样的。

bind 绑定ip,port 端口号,sentinel monitor告诉哨兵节点监控哪个redis服务器。ip,端口号,法定票数。这里的票数就是为了更稳健的确认当前redis-server是否挂了,不能只听一个哨兵的一面之词。

down-after-milliseconds 心跳包的超时时间。

创建redis-sentinel1文件。把上述的内容写到该文件中。复制出2和3文件。但是这里报了一个错误。

docker-compose以下启动了N个容器。此时N个容器都处于同一个局域网中,可以使者N个容器之间可以相互访问。三个redis-server节点是一个局域网。三个哨兵节点,是另一个局域网。默认情况下,这两网络似乎不能互通的。解决方案:可以使用docker-compose把此处的两组服务给放到同一个局域网中,docker network ls 列出当前docker中的局域网。

此处先启动了三个redis server节点,就相当于自动创建了第一个局域网。在启动后面三个哨兵节点,就直接让这三个节点加入到上面的局域网中,而不是创建新的局域网。

通过上述的操作,就完成了此处的配置。

启动后我们发现sentinel1文件里的内容已经被我们的程序自动配置重写了。

哨兵存在的意义,能够在redis主从结构出现问题的时候,此时哨兵节点就能够自动的帮我们重新选出一个主节点,来代替之前挂了的节点,保证整个redis仍然是可用的状态。

手动把主节点干掉

当主节点挂了之后,哨兵节点就开始工作了。

sdown主观下线,本哨兵节点,认为该主节点挂了,odown客观下线:好几个哨兵都认为该节点挂了,达成了一致,此时主节点挂了这个事情就被实锤了。

此时就需要哨兵节点选出一个从节点,作为新的主节点,此处就需要提拔出一个新的主节点。

切换过程。

如果主节点挂了之后,恢复过来,作为了一个从节点。

主从切换具体流程

哨兵重新选取主节点的流程(经典面试题)

1、主观下线

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

2、客观下线

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

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

每个哨兵手里只有一票。当哨兵1第一个发现当前是客观下线之后,就立即给自己投了一票,并且告诉了2,3我来负责这个事情,2 3反应慢了半拍,才发现是客观下线,一看1乐意负责这个事情,立即投了赞成票。如果总的票数超过哨兵总数的一半,选举完成了。上面的投票过程看谁反应快。谁的网络延时小。

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

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

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

3)run-id每个redis节点启动的时候,都会随机生成一串数字。(大小全凭缘分了)此时选谁都可以了,随便挑一个。

把新的主节点指定好了之后,leader就会控制这个节点,执行slave no one,成为master。在控制其他的节点,执行slave of,让其他节点,以新的master作为主节点了。

总结:

哨兵节点不能只有一个。

哨兵节点最好是奇数个。大部分情况下3个就够了。

哨兵节点不负责存储数据,仍然是redis主从节点负责存储。哨兵节点就可以使用一些配置不高的机器来部署。但是不能搞一个机器部署三个哨兵。

哨兵 + 主从复制 提高可用性。

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

相关文章:

Redis --- 第八讲 --- 关于主从复制哨兵

主从复制的补充问题 从节点和主节点之间断开连接&#xff0c;有两种情况&#xff1a; 1、从节点和主节点断开连接 slaveof no one 命令。这个时候&#xff0c;从节点就能能够晋升成主节点。意味着我们程序员要主动修改redis的组成结构。&#xff0c; 2、主节点挂了 这个时…...

【数据结构】时间和空间复杂度-Java

如何衡量算法的好坏 根据时间复杂度和空间复杂度来判断 比较项目时间复杂度空间复杂度定义衡量算法执行时间与问题规模之间的关系衡量算法在运行过程中所占用的额外存储空间与问题规模之间的关系表达方式通常用大O符号表示&#xff0c;如O&#xff08;n&#xff09;、O(n^2&am…...

tensorRT安装详解(linux与windows)

目录 tensorRT介绍 前置准备 安装cuda与cudnn linux windows cuda版本查看 下载安装包 linux安装 安装 安装验证 windows安装 安装 环境变量配置 安装验证 tensorRT介绍 有关tensorRT的介绍见 TensorRT简介-CSDN博客 前置准备 安装cuda与cudnn linux Linux下…...

MYSQL OPTIMIZE TABLE 命令重建表和索引

在 MySQL 中&#xff0c;OPTIMIZE TABLE 命令用于重建表和相关索引&#xff0c;以及回收未使用的空间。这个命令对于维护和优化数据库表的性能非常有用&#xff0c;特别是在进行了大量的数据删除操作之后。OPTIMIZE TABLE 可以减少数据文件的碎片化&#xff0c;确保数据存储更加…...

开发指南075-各种动画效果

方法一、使用动画GIF图标 方法二、使用vue-count-to import CountTo from vue-count-to components: { CountTo }, <count-to :start-val"0" :end-val"num" :duration"num>0?num:1" class"card-panel-num" /> 方法…...

使用 el-upload 如何做到发送一次请求上传多个文件

在使用 Element UI 的 el-upload 组件时&#xff0c;默认情况下每次选择文件都会触发一次上传请求。如果你需要一次性上传多个文件&#xff0c;而不是每个文件都触发一次请求&#xff0c;可以通过一些配置和代码处理来实现。 方法一&#xff1a;通过配置file-list&#xff08;…...

GEE引擎架设好之后进游戏时白屏的解决方法——gee引擎白屏修复

这两天测试GeeM2引擎的服务端&#xff0c;最常见的问题就是点击开始游戏出现白屏&#xff0c;最早还以为是服务端问题&#xff0c;结果是因为升级了引擎&#xff0c;而没有升级NewUI这份文件导致的。解决方法如下&#xff1a; 下载GEE引擎包最新版&#xff0c;&#xff08;可以…...

Linux LVS 通用命令行

LVS&#xff08;Linux Virtual Server&#xff09;是一种基于Linux操作系统的负载均衡技术&#xff0c;它通过网络负载均衡技术将客户端请求分发到多台实际服务器上&#xff0c;以提高系统的性能和可靠性。在LVS中&#xff0c;常用的命令行工具主要是ipvsadm&#xff0c;以及一…...

laravel .env环境变量原理

介绍 对于应用程序运行的环境来说&#xff0c;不同的环境有不同的配置通常是很有用的。Laravel 利用 Vance Lucas 的 PHP 库 DotEnv 使得此项功能的实现变得非常简单。当应用程序收到请求时&#xff0c;.env 文件中列出的所有变量将被加载到 PHP 的超级全局变量 $_ENV 中。 使…...

Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解

title: Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解 date: 2024/10/19 updated: 2024/10/19 author: cmdragon excerpt: app:templatesGenerated 是 Nuxt.js 的一个生命周期钩子,在模板编译到虚拟文件系统(Virtual File System, VFS)之后被调用。这个钩子允许…...

新时代AI桌宠:XGO Rider让你的办公室瞬间高大上

​ XGO Rider Luwu 智能打造了桌面双轮足式机器人 XGO Rider&#xff0c;这款全球首创的轮腿式桌面AI机器人&#xff0c;正在悄然改变我们的办公环境。它不仅是一个高科技玩具&#xff0c;更是一个能大幅提升工作效率和办公室科技感的智能助手。 XGO Rider 新时代“桌宠” micr…...

matlab的resample函数

MATLAB中resample函数用法 - 知乎 (zhihu.com) 主要是经常忘记了重采样时哪个是原采样率&#xff0c;哪个是重采样后的采样率&#xff08;目标采样率&#xff09;。这里记录下&#xff0c;目标采样率在前面&#xff01;...

idea怎么取消自动打开项目

idea设置不自动打开项目 选择File>> Settings 选择Appearance & Behavior >> System Settings 去掉勾选的Reopen last project on startup...

蓄电池在线监测系统 各大UPS铅酸蓄电池监测 保障安全

蓄电池的不断普及&#xff0c;确实推动了蓄电池监控和管理技术的持续升级。蓄电池检测系统的研发为我们带来了诸多好处&#xff0c;这些好处主要体现在以下几个方面&#xff1a; 一、提高蓄电池管理的智能化水平 蓄电池检测系统通过实时监测蓄电池的电压、电流、温度等关键参数…...

Python基础Day13

1.字符串 count(x)统计x出现的次数 split(m,n)以括号内的m为分隔符&#xff0c;将字符串分开n1个字符串 strip删除两端的空格 lstrip删除左边空格 rstrip删除右边空格 join(m)以m为分隔符&#xff0c;将分割开的字符串组合成一个新的字符串 max&#xff08;&#xff09;/min&am…...

有趣的css - 跷跷板加载动画

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是使用 css 模拟一个跷跷板效果的加载动画效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…...

与机器学习的邂逅--自适应神经网络结构的深度解析

引言 随着人工智能的发展&#xff0c;神经网络已成为许多应用领域的重要工具。自适应神经网络&#xff08;Adaptive Neural Networks&#xff0c;ANN&#xff09;因其出色的学习能力和灵活性&#xff0c;逐渐成为研究的热点。本文将详细探讨自适应神经网络的基本概念、工作原理…...

用python怎么实现办公自动化【批量生成出货清单】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

【Qt】控件——Qt输入类控件、常见的输入类控件、输入类控件的使用、Line Edit、Text Edit、Combo Box、Spin Box

文章目录 Qt5. Qt显示类控件Line EditText EditCombo BoxSpin BoxQDateTimeEditDialSlider Qt 5. Qt显示类控件 Line Edit QLineEdit 用于表示单行输入框。可以输入一段文本&#xff0c;但是不能换行。 属性说明text输入框中的文本inputMask输入内容格式约束maxLength最大长度…...

单臂交换知识点

要求&#xff1a;pc1要与pc2 ping通 命令&#xff1a; LSW1命令解析&#xff1a; system-view: 这个命令用于进入交换机的全局配置模式。在这个模式下&#xff0c;用户可以配置设备的全局设置。 vlan batch 10 20: 创建VLAN 10和VLAN 20。VLAN&#xff08;虚拟局域网&#x…...

CentOS7 上安装GitLab的经历

一、安装必要的基础环境 1.安装依赖包 [rootgitlab-server ~]#yum install curl policycoreutils openssh-server openssh-clients postfix wget git patch -y [rootgitlab-server ~]# systemctl start postfix 2.配置yum源(由于网络问题&#xff0c;国内用户请使用清华大学…...

用python-pptx轻松统一调整演示文档配色方案

哈喽,大家好,我是木头左! 安装与准备:python-pptx入门 确保你的Python环境中已经安装了python-pptx库。如果没有,可以通过pip进行快速安装: pip install python-pptx此外,对于PPT文档的操作,了解一些基本的PowerPoint概念是有帮助的,比如幻灯片母版(Slide Master)…...

MySQL-30.索引-介绍

一.索引 为什么需要索引&#xff1f;当我们没有建立索引时&#xff0c;要在一张数据量极其庞大的表中查询表里的某一个值&#xff0c;会非常的消耗时间。以一个6000000数据量的表为例&#xff0c;查询一条记录的时间耗时约为13s&#xff0c;这是因为要查询符合某个值的数据&am…...

6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss 方法与 hide 方法)

对话框 对话框&#xff08;Dialog&#xff09;是一种常用的 UI 组件&#xff0c;它主要用于显示信息、接收用户操作反馈 对话框可以包含各种元素&#xff0c;但是主要还是以文本、按钮为主&#xff0c;其次是列表 其中&#xff0c;基础对话框是 Android 中最简单的对话框&…...

git配置以及如何删除git

你努力学习和充实自己&#xff0c;除了提升自身的价值&#xff0c;最实际的是当遇到有喜欢的人和事的时候&#xff0c;除了一片真心&#xff0c;还有拿得出手的东西 作用 记录开发的历史&#xff0c;每次记录就是一个版本&#xff0c;而且可以回到历史的某个版本可以实现多人合…...

深入理解new Function

基础语法 let func new Function([arg1,arg2,arg3,...argN],functionBody)函数是通过使用参数 arg1…argN 和给定的 functionBody 创建。 调用 Function 时可以使用或不使用 new&#xff0c;两者都会创建一个新的 Function 实例 举例1: 带有两个参数的函数 let sum new Fun…...

服务器训练神经网络必备工具Screen使用教程

使用服务器训练网络时&#xff0c;不敢关闭终端窗口&#xff1f;用screen~ 服务器训练神经网络必备工具Screen使用教程 使用服务器训练网络时&#xff0c;不敢关闭终端窗口&#xff1f;用screen~一、Screen常用命令1. 启动新会话2. 重新连接会话3. 列出所有会话4. 窗口管理5. 断…...

跨越数字鸿沟,FileLink文件摆渡系统——您的数据安全高效传输新选择

在这个信息爆炸的时代&#xff0c;数据的流通与共享已成为推动各行各业发展的关键力量。然而&#xff0c;随着数据量的激增&#xff0c;如何在保证数据安全的前提下&#xff0c;实现高效、便捷的文件传输&#xff0c;成为了众多企业和个人用户面临的重大挑战。正是在这样的背景…...

递归之吃桃问题

题目如下&#xff1a; XXX买了一堆桃子不知道个数&#xff0c;第一天吃了一半的桃子&#xff0c;还不过瘾&#xff0c;又多吃了一个。以后他每天吃剩下的桃子的一半还多一个&#xff0c;到 n 天只剩下一个桃子了。XXX想知道一开始买了多少桃子。 首先我们看到题目就应该想边界…...

CZX前端秘籍2

vue生命周期&#xff08; 组件从创建到销毁的过程就是它的生命周期&#xff09; 创建前 beforeCreat&#xff08; 在这个阶段属性和方法都不能使用&#xff09; 创建时 created&#xff08; 这里时实例创建完成之后&#xff0c; 在这里完成了数据监测&#xff0c; 可以使用数…...