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

Redis高可用:哨兵机制(Redis Sentinel)详解

目录

1.什么是哨兵机制(Redis Sentinel)

2.哨兵机制基本流程

3.哨兵获取主从服务器信息

4.多个哨兵进行通信

5.主观下线和客观下线

6.哨兵集群的选举

7.新主库的选出

8.故障的转移

9.基于pub/sub机制的客户端事件通知


1.什么是哨兵机制(Redis Sentinel)

Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入。哨兵的核心功能是主节点的自动故障转移。

哨兵机制(sentinel)是Redis解决高可用的一种解决方案:它是由一个或者多个sentinel 实例组成的一个sentinel 系统。

下图是一个典型的哨兵集群监控的逻辑图:

哨兵实现了什么功能呢?下面是Redis官方文档的描述:

  • 监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。
  • 自动故障转移(Automatic failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
  • 配置提供者(Configuration provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
  • 通知(Notification):哨兵可以将故障转移的结果发送给客户端。

其中,监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移;而配置提供者和通知功能,则需要在与客户端的交互中才能体现。 

2.哨兵机制基本流程

sentinel(哨兵机制)其实就是一个运行在特殊模式下的Redis服务器。

在服务器初始化时,普通Redis服务器初始化时会通过载入RDB文件或者AOF文件来恢复数据库状态,而sentinel服务器由于不使用数据库,所以它在初始化时无需载入RDB文件或者AOF文件。

我们先看监控。监控指的就是哨兵进程运行时,它会周期性地心跳检测,检测所有主从服务器是否正常运行。心跳检测方式为周期性向主从服务器发送PING命令,若主从服务器在规定时间内响应哨兵进程,则判断该服务器处于存活状态;若主从服务器在规定时间内没有响应哨兵进程,则哨兵进程会判定其下线。

如下图所示,主服务器server2在规定时间内未响应sentinel进程,则sentinel进程判断主服务器server2主观下线,进行选举操作。

若主服务器处于下线状态时,哨兵进程会进行故障转移,也就是重新选主。选主就是会从其所属的多个从服务器中选举一个服务器作为新的主服务器,来提供服务。选举成功后,哨兵进程让已下线主服务器属下的所有从服务器去复制新的主服务器,这一动作会通过向从服务器发送SLAVEOF命令来实现。

如下图,则展示了在故障转移操作中,server1已下线server2选举成为主节点,sentinel节点向已下线主服务器server1的两个从服务器server3发送SLAVEOF命令,进行复制新的主服务器数据信息。

若旧的主服务器重新启动后,会成为新的主服务器的从服务器。

如下图所示,旧主服务器server1重新启动后,会默认成为新主服务器server2的从服务器,进行运行。

哨兵选举出新的主服务器后,会将新主服务器信息发送给客户端,让它和新的主服务器建立连接就行,并不涉及决策的逻辑。但是,在监控和选举过程中,哨兵需要做出两个决策:一个是判断主库是否下线;第二个是在选举过程中,选举哪个从服务器作为新的主服务器,提供服务。 

3.哨兵获取主从服务器信息

sentinel(哨兵)进程默认会以每隔10秒一次的频率,通过命令连接向被连接的主服务器发送INFO命令,并通过分析INFO命令返回的数据来获取主服务器的当前信息以及所属从服务器信息。

如下图所示,主服务器server2和其三个从服务器server1、server3、server4。sentinel进程会向主服务器server2发送INFO命令,主服务器会返回对应的主服务器和从服务器的信息。

同理,sentinel进程也会向从服务器发送INFO命令,获取从服务器对应的节点信息。频率默认10秒一次。

 

4.多个哨兵进行通信

在哨兵集群下,哨兵实例进行通信,是基于Redis提供的pub/sub机制的,也就是发布/订阅模式

在主从集群中,哨兵节点不会直接与其他哨兵节点建立连接,而是首先会和主库建立起连接,然后向一个名为"_sentinel_:hello"频道发送自己的信息(IP+port),其他订阅了该频道的哨兵节点就会获取到该哨兵节点信息,从而哨兵节点之间互知。

通俗讲,Redis哨兵模式中,哨兵节点的互通是通过订阅指定的频道来进行的,而不是直接与其他sentinel节点建立起连接。

举个例子,假如现在有sentinel1、sentinel2、sentinel3三个sentinel在监控同一个服务器,那么当sentinel1向主服务器的_sentinel_:hello频道发送一条信息时,所有订阅了_sentinel_:hello频道的sentinel(包含sentinel自己在内)都会收到这条消息。如下图所示:

当一个sentinel从_sentinel_:hello频道收到一条消息后,sentinel会对这条信息进行分析,提取出信息中的sentinel IP地址、sentinel端口号、sentinel运行ID等八个参数,并进行检查:

  • 如果信息中记录的sentinel运行ID和接收信息的sentinel的运行ID相同,那么说明这条消息是sentinel自己发送的,sentinel将丢失这条信息,不做进一步处理。
  • 相反地,如果信息记录的sentinel运行ID和接收信息的sentinel的运行ID不相同,那么说明这条信息是监控同一个服务器的其他sentinel发来的,接收信息的sentinel将根据信息中的各个参数,对相应主服务器的实例结构进行更新。

5.主观下线和客观下线

哨兵如何判断主库已经下线了呢?

  • 主观下线:任何一个哨兵都是可以监控探测,并作出Redis节点下线的判断;
  • 客观下线:有哨兵集群共同决定Redis节点是否下线;

首先先解释一下什么是"主观下线"

哨兵进程会使用PING命令的方式来检测各个主库和从库的网络连接情况,用来判断实例状态。如果哨兵发现主库或者从库响应超时,那么哨兵会判定其为"主观下线"。

如果哨兵检测从库,发现从库在规定时间内未响应,那么哨兵就会把它标记为"主观下线",因为从库的下线影响一般不太大,集群的对外服务不会间断。但是,如果检测主库,哨兵不会简单把它标记为"主观下线",开启主从切换。

因为很有可能会有一种特殊情况:哨兵误判。也就是说主库本身没有故障,但由于哨兵的误判,判断它为下线状态。一旦启动主从切换,后续的选举和通知操作都会带来额外的计算和通信开销。因此,为了不必要开销,我们要严格注意误判的情况。

在哨兵集群中,判定主库是否处于下线状态,不是由一个哨兵来决定的,而是只有大多数哨兵认为主库已经"主观下线",主库才会标记为"客观下线"。这种判断机制为:少数服从多数。同时会触发主从切换模式。

举个例子,现在有sentinel1、sentinel2、sentinel3三个哨兵和master1一个主库和slave1、slave2、slave3三个从服务器。但sentinel1和sentinel2 判断master1处于上线状态,而sentinel3判断master1处于"主观下线",那么最终master1仍然为上线状态。

简单的来说,"客观下线"的标准为,当有N个实例,最好要有N/2+1个哨兵实例认为其"主观下线",那么主库才是"客观下线"。这样的好处减少了误判的概率,避免了不必要的开销。(当然,有多个实例做出"主线下线"的判断才可以,也可以由Redis管理员自行设定)

6.哨兵集群的选举

判断完主库下线后,由哪个哨兵节点来执行主从切换呢?这里就需要哨兵集群的选举机制了。

  • 为什么必然会出现选举/共识机制

为了避免哨兵的单点情况发生,所以需要一个哨兵的分布式集群。作为分布式集群,必然涉及共识问题(即选举问题);同时故障的转移和通知都只需要一个主的哨兵节点就可以了。

  • 哨兵的选举机制是什么样的

哨兵的选举机制其实很简单,就是一个Raft选举算法选举的票数大于等于num(sentinels)/2+1时,将成为领导者,如果没有超过,继续选举

  • 任何一个想成为 Leader 的哨兵,要满足两个条件
    • 第一,拿到半数以上的赞成票;
    • 第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。

以 3 个哨兵为例,假设此时的 quorum 设置为 2,那么,任何一个想成为 Leader 的哨兵只要拿到 2 张赞成票,就可以了。

再看一个例子。Redis 1主4从,5个哨兵,哨兵配置quorum为2,如果3个哨兵故障,当主库宕机时,哨兵能否判断主库“客观下线”?能否自动切换?

1、哨兵集群可以判定主库“主观下线”。由于quorum=2,所以当一个哨兵判断主库“主观下线”后,询问另外一个哨兵后也会得到同样的结果,2个哨兵都判定“主观下线”,达到了quorum的值,因此,哨兵集群可以判定主库为“客观下线”

2、但哨兵不能完成主从切换。哨兵标记主库“客观下线后”,在选举“哨兵领导者”时,一个哨兵必须拿到超过多数的选票(5/2+1=3票)。但目前只有2个哨兵活着,无论怎么投票,一个哨兵最多只能拿到2票,永远无法达到N/2+1选票的结果。

7.新主库的选出

主库既然判定客观下线了,那么如何从剩余的从库中选择一个新的主库呢?

  • 过滤掉不健康的(下线或断线),没有回复过哨兵ping响应的从节点
  • 选择salve-priority从节点优先级最高(redis.conf)的
  • 选择复制偏移量最大,只复制最完整的从节点

8.故障的转移

新的主库选择出来后,就可以开始进行故障的转移了。

假设:判断主库客观下线了,同时选出sentinel 3是哨兵leader

故障转移流程如下

 

  • 将slave-1脱离原从节点(PS: 5.0 中应该是replicaof no one),升级主节点,
  • 将从节点slave-2指向新的主节点
  • 通知客户端主节点已更换
  • 将原主节点(oldMaster)变成从节点,指向新的主节点

转移之后:

9.基于pub/sub机制的客户端事件通知

从本质上说,哨兵就是一个运行在特定模式的Redis,只不过它并不服务于请求操作,只是完成监控、故障转移、通知的任务。每个哨兵提供pub/sub机制,客户端可以从哨兵订阅消息。

客户端可以从哨兵订阅所有事件,这样客户端不仅可以在主从切换后得到新主库的连接信息,还可以监控主从库切换过程中发生的各个重要事件。

有了pub/sub机制,哨兵和哨兵之间、哨兵与从库之间、哨兵与客户端之间就能连接起来了,再加上上述将的主库判断依据和选举依据,哨兵集群的监控、选举、通知三个任务就可以正常运行了。

总结

  • sentinel只是一个运行在特殊环境下的Redis,不提供数据存储服务。
  • sentinel会通过向主服务器发送INFO命令获取主服务器所属的从服务器的地址信息,并为这些从服务器创建相应的实例结构,以及向这些从服务器发送命令连接和订阅连接。
  • 在一般情况下,sentinel会以每10s一次的频率向被监视的主库和从库发送INFO命令,获取主库和从库的相关信息。当主库处于下线状态,或者sentinel正对主服务器进行故障转移操作时,sentinel向从服务发送INFO命令的频率修改为每秒一次。
  • 对于监控同一个主服务器的哨兵来说,他们通过向主服务器的_sentinel_:hello发送消息来向其他sentinel告知自己的存在。其他订阅了该频道的sentinel都可以接收到,从而各个sentinel互知。
  • sentinel只会与主服务器和从服务器之间建立命令连接和订阅连接,而sentinel之间只会建立命令建立,进行通信。
  • sentinel会以每秒一次的频率向实例(从服务器、主服务器、其他sentinel)发送PING命令,并根据实例对PING命令的回复来判断实例是否在线,当一个实例在指定时间内未响应PING命令,则判定其为主观下线。
  • 在哨兵集群下,当sentinel收到足够多的主观下线投票之后,他会将主服务器判断为客观下线,并发起一个针对主服务器的故障转移操作。

参考:1.一文读懂Redis的哨兵机制 - 知乎 (zhihu.com)

           2.<<Redis设计与实现>> 书籍

相关文章:

Redis高可用:哨兵机制(Redis Sentinel)详解

目录 1.什么是哨兵机制&#xff08;Redis Sentinel&#xff09; 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 1.什么是哨兵机制&#xf…...

Hadoop小结(上)

最近在学大模型的分布式训练和存储&#xff0c;自己的分布式相关基础比较薄弱&#xff0c;基于深度学习的一切架构皆来源于传统&#xff0c;我总结了之前大数据的分布式解决方案即Hadoop&#xff1a; Why Hadoop Hadoop 的作用非常简单&#xff0c;就是在多计算机集群环境中营…...

ORA-600 ksuloget2 恢复----惜分飞

客户在win 32位的操作系统上调至sga超过2G,数据库运行过程中报ORA-600 ksuloget2错误 Thread 1 cannot allocate new log, sequence 43586 Checkpoint not complete Current log# 1 seq# 43585 mem# 0: D:\ORACLE\ORADATA\ORCL\REDO01.LOG Fri Aug 04 14:57:02 2023 Errors i…...

NLP的tokenization

GPT3.5的tokenization流程如上图所示&#xff0c;以下是chatGPT对BPE算法的解释&#xff1a; BPE&#xff08;Byte Pair Encoding&#xff09;编码算法是一种基于统计的无监督分词方法&#xff0c;用于将文本分解为子词单元。它的原理如下&#xff1a; 1. 初始化&#xff1a;将…...

【宝藏系列】一文讲透C语言数组与指针的关系

【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】 文章目录 【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】&#x1f468;‍&#x1f3eb;前言1️⃣指针1️⃣1️⃣指针的操作1️⃣2️⃣关于指针定义的争议1️⃣3️⃣对教材错误写法的小看法 2️⃣指针和数组的区别2️⃣…...

Jenkins+Jmeter集成自动化接口测试并通过邮件发送测试报告

一、Jenkins的配置 1、新增一个自由风格的项目 2、构建->选择Excute Windows batch command&#xff08;因为我是在本地尝试的&#xff0c;因此选择的windows&#xff09; 3、输入步骤&#xff1a; 1. 由于不能拥有相同的jtl文件&#xff0c;因此在每次构建前都需要删除jtl…...

clickhouse入门

clickhouse 1 课程介绍 和hadoop无关&#xff0c;俄罗斯&#xff0c;速度快3 介绍&特点 1 列式存储 在线分析处理。 使用sql进行查询。列式存储更适合查询分析的场景。新增时候有一个寻址的过程。更容易进行压缩行式存储。增删改查都需要的时候。2 DBMS功能 包括ddl,d…...

中间件: ElasticSearch的安装与部署

文档地址&#xff1a; https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 单机部署 创建用户&#xff1a; useradd es chown -R es /opt/soft/ mkdir -p /var/log/elastic chown -R es /var/log/elastic mkdir -p /tmp/elastic chown -R es /tmp…...

LabVIEW模拟化学反应器的工作

LabVIEW模拟化学反应器的工作 近年来&#xff0c;化学反应器在化学和工业过程领域有许多应用。高价值产品是通过混合产品&#xff0c;化学反应&#xff0c;蒸馏和结晶等多种工业过程转换原材料制成的。化学反应器通常用于大型加工行业&#xff0c;例如酿酒厂公司饮料产品的发酵…...

Python基础语法入门(第二十三天)——正则表达式

正则表达式是一种文本模式&#xff0c;用于匹配字符串&#xff0c;它是由字符和特殊字符组成的模式。正则表达式可以用于验证、搜索、替换和提取字符串。其能够应用于各种编程语言和文本处理工具中&#xff0c;如Python、Java、JavaScript等。 正则表达式在线测试工具&#xf…...

山西电力市场日前价格预测【2023-08-20】

日前价格预测 预测明日&#xff08;2023-08-20&#xff09;山西电力市场全天平均日前电价为341.71元/MWh。其中&#xff0c;最高日前电价为367.66元/MWh&#xff0c;预计出现在20: 30。最低日前电价为318.47元/MWh&#xff0c;预计出现在04: 15。 价差方向预测 1&#xff1a; 实…...

C++中function,bind,lambda

c11之前&#xff0c;STL中提供了bind1st以及bind2nd绑定器 首先来看一下他们如何使用&#xff1a; 如果我们要对vector中的元素排序&#xff0c;首先会想到sort&#xff0c;比如&#xff1a; void output(const vector<int> &vec) {for (auto v : vec) {cout <&l…...

跟着美团学设计模式(感处)

读了着篇文章之后发现真的是&#xff0c;你的思想&#xff0c;你的思维是真的比比你拥有什么技术要强的。 注 开闭原则 开闭原则&#xff08;Open-Closed Principle&#xff09;是面向对象设计中的基本原则之一&#xff0c;它的定义是&#xff1a;一个软件实体应该对扩展开放…...

2023/8/19 小红书 Java 后台开发面经

项目都做了些什么&#xff0c;怎么实现的用Redis实现了什么&#xff0c;Redis是单线程的吗&#xff0c;Redis是单线程的为什么快&#xff0c;IO多路复用模型具体实现&#xff0c;持久化怎么实现的为什么用Kafka&#xff0c;架构是什么样的&#xff0c;Broker、Topic、Partition…...

基于traccar快捷搭建gps轨迹应用

0. 环境 - win10 虚拟机ubuntu18 - i5 ubuntu22笔记本 - USB-GPS模块一台&#xff0c;比如华大北斗TAU1312-232板 - 双笔记本组网设备&#xff1a;路由器&#xff0c;使得win10笔记本ip&#xff1a;192.168.123.x&#xff0c;而i5笔记本IP是192.168.123.215。 - 安卓 手机 1.…...

【深度学习-图像识别】使用fastai对Caltech101数据集进行图像多分类(50行以内的代码就可达到很高准确率)

文章目录 前言fastai介绍数据集介绍 一、环境准备二、数据集处理1.数据目录结构2.导入依赖项2.读入数据3.模型构建3.1 寻找合适的学习率3.2 模型调优 4.模型保存与应用 总结人工智能-图像识别 系列文章目录 前言 fastai介绍 fastai 是一个深度学习库&#xff0c;它为从业人员…...

Debian10: 安装nut服务器(UPS)

UPS说明&#xff1a; UPS的作用就不必讲了&#xff0c;我选择是SANTAKTGBOX-850&#xff0c;规格为 850VA/510W&#xff0c;可以满足所需&#xff0c;关键是Debian10自带了驱动可以支持&#xff0c;免去安装驱动&#xff0c;将UPS通过USB线连接服务器即可&#xff0c;如下图所示…...

神经网络基础-神经网络补充概念-47-动量梯度下降法

概念 动量梯度下降法&#xff08;Momentum Gradient Descent&#xff09;是一种优化算法&#xff0c;用于加速梯度下降的收敛速度&#xff0c;特别是在存在高曲率、平原或局部最小值的情况下。动量法引入了一个称为“动量”&#xff08;momentum&#xff09;的概念&#xff0c…...

C++11并发与多线程笔记(13) 补充知识、线程池浅谈、数量谈、总结

C11并发与多线程笔记&#xff08;13&#xff09; 补充知识、线程池浅谈、数量谈、总结 1、补充一些知识点1.1 虚假唤醒&#xff1a;1.2 atomic 2、浅谈线程池&#xff1a;3、线程创建数量谈&#xff1a; 1、补充一些知识点 1.1 虚假唤醒&#xff1a; notify_one或者notify_al…...

python高级基础

文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础 闭包 简单解释一下闭包就是可以在内部访问外部函数的变量&#xff0c;因为如果声明全局变量&#xff0c;那在后面就有可能会修改 在闭包中的…...

使用线性回归模型优化权重:探索数据拟合的基础

文章目录 前言一、示例代码二、示例代码解读1.线性回归模型2.MSE损失函数3.优化过程4.结果解读 总结 前言 在机器学习和数据科学中&#xff0c;线性回归是一种常见而重要的方法。本文将以一个简单的代码示例为基础&#xff0c;介绍线性回归的基本原理和应用。将使用Python和Nu…...

亿级短视频,如何架构?

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常指导大家面试架构&#xff0c;拿高端offer。 前几天&#xff0c;指导一个年薪100W小伙伴&#xff0c;拿到字节面试邀请。 遇到一个 非常、非常高频的一个面试题&#xff0c;但是很不好回答&#xff0…...

jenkins pipeline方式一键部署github项目

上篇&#xff1a;jenkins一键部署github项目 该篇使用jenkins pipeline-script一键部署&#xff0c;且介绍pipeline-scm jenkins环境配置 前言&#xff1a;按照上篇创建pipeline任务&#xff0c;结果报mvn&#xff0c;jdk环境不存在&#xff0c;就很疑惑&#xff0c;然后配置全…...

Vue 项目搭建

环境配置 1. 安装node.js 官网&#xff1a;nodejs&#xff08;推荐 v10 以上&#xff09; 官网&#xff1a;npm 是什么&#xff1f; 由于vue的安装与创建依赖node.js&#xff08;JavaScript的运行环境&#xff09;里的npm&#xff08;包管理和分发工具&#xff09;&#xff…...

【NetCore】09-中间件

文章目录 中间件&#xff1a;掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过…...

机器学习深度学习——BERT(来自transformer的双向编码器表示)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——transformer&#xff08;机器翻译的再实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&am…...

Datawhale Django后端开发入门 Vscode TASK02 Admin管理员、外键的使用

一.Admin管理员的使用 1、启动django服务 使用创建管理员之前&#xff0c;一定要先启动django服务&#xff0c;虽然TASK01和TASK02是分开的&#xff0c;但是进行第二个流程的时候记得先启动django服务&#xff0c;注意此时是在你的项目文件夹下启动的&#xff0c;时刻注意要执…...

【ES5和ES6】数组遍历的各种方法集合

一、ES5的方法 1.for循环 let arr [1, 2, 3] for (let i 0; i < arr.length; i) {console.log(arr[i]) } // 1 // 2 // 32.forEach() 特点&#xff1a; 没有返回值&#xff0c;只是针对每个元素调用func三个参数&#xff1a;item, index, arr &#xff1b;当前项&#…...

学科在线教育元宇宙VR虚拟仿真平台落实更高质量的交互学习

为推动教育数字化&#xff0c;建设全民终身学习的学习型社会、学习型大国&#xff0c;元宇宙企业深圳华锐视点深度融合VR虚拟现实、数字孪生、云计算和三维建模等技术&#xff0c;搭建教育元宇宙平台&#xff0c;为学生提供更加沉浸式的学习体验&#xff0c;提高学习效果和兴趣…...

[python爬虫] 爬取图片无法打开或已损坏的简单探讨

本文主要针对python使用urlretrieve或urlopen下载百度、搜狗、googto&#xff08;谷歌镜像&#xff09;等图片时&#xff0c;出现"无法打开图片或已损坏"的问题&#xff0c;作者对它进行简单的探讨。同时&#xff0c;作者将进一步帮你巩固selenium自动化操作和urllib…...

vue项目预览pdf功能(解决动态文字无法显示的问题)

最近&#xff0c;因为公司项目需要预览pdf的功能&#xff0c;开始的时候找了市面上的一些pdf插件&#xff0c;都能用&#xff0c;但是&#xff0c;后面因为pdf变成了需要根据内容进行变化的&#xff0c;然后&#xff0c;就出现了需要动态生成的文字不显示了。换了好多好多的插件…...

vue3 样式穿透:deep不生效

初学vue3&#xff0c;今天需要修改el-input组件的属性&#xff08;去掉border和文字居右&#xff09; 网上搜了一下&#xff0c;大致都是采用:deep 样式穿透来修改el-input的属性 <div class"input-container"><el-input placeholder"请输入111&qu…...

云原生反模式

通过了解这些反模式并遵循云原生最佳实践&#xff0c;您可以设计、构建和运营更加强大、可扩展和成本效益高的云原生应用程序。 1.单体架构&#xff1a;在云上运行一个大而紧密耦合的应用程序&#xff0c;妨碍了可扩展性和敏捷性。2.忽略成本优化&#xff1a;云服务可能昂贵&am…...

【2023年11月第四版教材】《第5章-信息系统工程(合集篇)》

《第5章-信息系统工程&#xff08;合集篇&#xff09;》 章节说明1 软件工程1.1 架构设计1.2 需求分析1.3 软件设计1.4 软件实现&#xff3b;补充第三版教材内容&#xff3d; 1.5 部署交付 2 数据工程2.1 数据建模2.2 数据标准化2.3 数据运维2.4 数据开发利用2.5 数据库安全 3 …...

【qiankun】微前端在项目中的具体使用

1、安装qiankun npm install qiankun --save2、主应用中注册和配置qiankun 在主应用的入口文件main.ts中&#xff0c;引入qiankun的注册方法&#xff1a; import { registerMicroApps, start } from qiankun;创建一个数组&#xff0c;用于配置子应用的相关信息。每个子应用都…...

云安全与多云环境管理:讨论在云计算和多云环境下如何保护数据、应用程序和基础设施的安全

随着云计算和多云环境的广泛应用&#xff0c;企业正面临着数据、应用程序和基础设施安全的新挑战。在这个数字化时代&#xff0c;保护敏感信息和业务运作的连续性变得尤为重要。本文将深入探讨在云计算和多云环境下如何有效地保护数据、应用程序和基础设施的安全。 章节一&…...

npm install ffi各种失败,换命令npm i ffi-napi成功

网上各种帖子安装ffi&#xff0c;基本上到了windows build tools这里会卡住。 使用命令npm install --global --production windows-build-tools 安装报错信息如下&#xff1a; PS E:\codes\nodejsPath\tcpTest> npm install --global --production windows-build-tools …...

0.flink学习资料

论文&#xff1a; &#xff08;1&#xff09;google dataflow model 下载链接&#xff1a;p1792-Akidau.pdf (vldb.org) Akidau T, Bradshaw R, Chambers C, et al. The dataflow model: a practical approach to balancing correctness, latency, and cost in massive-scal…...

C语言:字符函数和字符串函数

往期文章 C语言&#xff1a;初识C语言C语言&#xff1a;分支语句和循环语句C语言&#xff1a;函数C语言&#xff1a;数组C语言&#xff1a;操作符详解C语言&#xff1a;指针详解C语言&#xff1a;结构体C语言&#xff1a;数据的存储 目录 往期文章前言1. 函数介绍1.1 strlen1.…...

基于.Net Core开发的医疗信息LIS系统源码

SaaS模式.Net Core版云LIS系统源码 医疗信息LIS系统是专为医院检验科设计的一套实验室信息管理系统&#xff0c;能将实验仪器与计算机组成网络&#xff0c;使病人样品登录、实验数据存取、报告审核、打印分发&#xff0c;实验数据统计分析等繁杂的操作过程实现了智能化、自动化…...

部署工业物联网可以选择哪些通信方案?

部署工业物联网有诸多意义&#xff0c;诸如提升生产效率&#xff0c;降低管理成本&#xff0c;保障生产品质稳定&#xff0c;应对长期从业劳动力变化趋势等。针对不同行业、场景&#xff0c;工业物联网需要选择不同的通信方案&#xff0c;以达到成本和效益的最佳平衡。本篇就简…...

flutter-移动端适配

不同屏幕之间的尺寸适配 使用插件 flutter_screenutil flutter_screenutil flutter 屏幕适配方案&#xff0c;用于调整屏幕和字体大小的flutter插件&#xff0c;让你的UI在不同尺寸的屏幕上都能显示合理的布局! 安装 # add flutter_screenutil flutter_screenutil: ^5.8.4 o…...

MySQL 常用函数

一、数学函数 1、ABS(x) 返回绝对值。 mysql> select abs(-4); --------- | abs(-4) | --------- | 4 | --------- 1 row in set (0.00 sec) 2、PI&#xff08;&#xff09; 返回圆周率&#xff0c;并四舍五入保留五位小数。 mysql> select pi(); ----------…...

动态路由的实现—正则表达式

文章目录 前言一、什么是正则表达式&#xff1f;二、正则表达式在动态路由中的作用三、实现一个简单的路由调度器总结 前言 动态路由有很多种实现方式&#xff0c;支持的规则、性能等有很大的差异。例如开源的路由实现gorouter支持在路由规则中嵌入正则表达式&#xff0c;例如…...

Android实现超出固定行数折叠文字“查看全文“、“收起全文“

先上效果图 分析问题 网上有很多关于这个的代码&#xff0c;实现都过于复杂了&#xff0c;github上甚至还看到一篇文章600多行代码&#xff0c;结果一跑起来全是bug。还是自己写吧&#xff01;&#xff01;&#xff01; 如果我们需要换行的"查看全文"、"收起全…...

Python上楼梯问题:递归解法探究(斐波那契变种)(记忆化递归)

文章目录 上楼梯问题&#xff1a;递归解法探究问题定义解决方案1. 递归2. 记忆化递归关于python memo{}默认参数和字典的语法语法功能版本信息注意事项 结论 上楼梯问题&#xff1a;递归解法探究 在这篇文章中&#xff0c;将对上楼梯问题进行深入探讨。上楼梯问题是一种常见的…...

AI重新定义音视频生产力“新范式”

// 编者按&#xff1a;AIGC无疑是当下的热门话题和场景。面对AI带来的技术变革和算力挑战&#xff0c;该如何应对&#xff1f;LiveVideoStackCon 2023上海站邀请到了网心科技副总裁武磊为我们分享网心在面对AI应用场景和业务需求下的实践经验。 文/武磊 编辑/LiveVideoStack …...

Jmeter生成可视化的HTML测试报告

Jmeter也是可以生成测试报告的。 性能测试工具Jmeter由于其体积小、使用方便、学习成本低等原因&#xff0c;在现在的性能测试过程中&#xff0c;使用率越来越高&#xff0c;但其本身也有一定的缺点&#xff0c;比如提供的测试结果可视化做的很一般。 不过从3.0版本开始&…...

5G技术与其对智能城市、物联网和虚拟现实领域的影响

随着第五代移动通信技术&#xff08;5G&#xff09;的到来&#xff0c;我们即将迈向一个全新的数字化世界。5G技术的引入将带来更高的速度、更低的延迟和更大的连接性&#xff0c;推动了智能城市、物联网和虚拟现实等领域的发展。 首先&#xff0c;5G技术将带来超越以往的网络速…...

leetcode做题笔记88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…...