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

redis中的哨兵

redis中的哨兵

    • 一、哨兵机制的概念
    • 二、redis哨兵的部署
      • 2.1 docker的安装
      • 2.2 编排redis主从节点
      • 2.3 配置哨兵节点
    • 三、redis哨兵的选举机制
      • 3.1 redis-master宕机之后的情况
      • 3.2 重启redis-master后的情况
    • 四、redis哨兵机制的原理
      • 4.1主观下线
      • 4.2客观下线
      • 4.3选举leader节点
      • 4.4选出合适的从节点
      • 4.5哨兵机制小结

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

一、哨兵机制的概念

Redis Sentinel 相关名词解释 :

名词逻辑结构物理结构
主节点redis主服务一个独立的redis-server进程
从节点redis从服务一个独立的redis-server进程
redis数据节点主从节点主节点和从节点的进程
哨兵节点监控redis数据节点的节点一个独立的redis-sentinel进程
哨兵节点集合若干哨兵节点的抽象组合若干redis-server进程
redis哨兵(sentinel)redis提供的高可用方案哨兵节点集合和redis主从节点
应用方泛指一个或多个客户端一个或多个连接redis的进程

Redis Sentinel 是 Redis 的⾼可⽤实现⽅案,在实际的⽣产环境中,对提⾼整个系统的⾼可⽤是⾮常有帮助的,本节⾸先整体梳理主从复制模式下故障处理可能产⽣的问题,⽽后引出⾼可⽤的概念,最后重点分析 Redis Sentinel 的基本架构、优势,以及是如何实现⾼可⽤的

哨兵⾃动恢复主节点故障

提供多个sentinel哨兵进程监控现有的redis master和slave。这些进程之间会建立tcp长连接,通过这样的长连接,定期发送心跳包。然后就可发现监控的节点是否挂了。

  • 如果从节点挂了,那么哨兵节点不予理会,认为对服务没有什么影响。

  • 如果一个哨兵发现主节点挂了,那么其它哨兵也会进行判断主节点是否挂了,如果超过法定票数个哨兵都认为主节点挂了,那么此时就会在这些从节点中,挑选一个节点作为新的主节点,挑选出的新节点,哨兵会自动控制该节点执行slaveof no one让其成为主节点,并且控制其他从节点,修改slaveof到新的主节点上。

  • 最后哨兵会自动通知客户端程序,告知新的主节点是谁,让客户端后续在进行写操作时,能够在新的主节点上操作,当原来的主节点恢复,执⾏ slaveof {newMasterIp} {newMasterPort}让其成为⼀个从节点

在这里插入图片描述

补充:一般哨兵节点会弄奇数个。

二、redis哨兵的部署

2.1 docker的安装

部署多个节点在一台主机上是非常麻烦的,所以这里使用docker来进行演示。

在Linux上安装docker可看这篇博客

2.2 编排redis主从节点

上述操作必须保证⼯作⽬录在yml的同级⽬录中, 才能⼯作

1.配置文件

在配置redis主从节点之前,先创建一个redis-slave文件夹,然后进入该文件夹,写一下配置文件docker-compose.yml:

version: '3.7' #版本号
services:   #表示启动的服务器master:   #服务名image: 'redis:5.0.9' #容器镜像名称container_name: redis-master  #自定义名称(也可以理解为ip地址)restart: always   #表示总是自动重启command: redis-server --appendonly yes #启动redis时启动的选项ports:- 6379:6379  #端口映射  前面是宿主机端口号  后面是虚拟机的端口号slave1:    #服务名image: 'redis:5.0.9'container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6380:6379slave2:    #服务名image: 'redis:5.0.9'container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379

补充:端口映射

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

容器使用相同的端口号不会冲突吗?

每个容器内部的端口号是不会互相影响的,可以把每个容器理解为一个独立的主机

2.执行指令,启动该配置文件中的docker容器

sudo docker-compose up -d

如果启动后发现前⾯的配置有误, 需要重新操作, 使⽤ docker-compose down 即可停⽌并删除刚才创建好的容器.

sudo docker-compose down

3.查看一下是否成功启动:

sudo docker ps -a

在这里插入图片描述

netstat -anp | grep -E '6379|6380|6381'

在这里插入图片描述

4.查看运⾏⽇志

sudo docker-compose logs

现在客户端就可以连接redis服务器了。

redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381

补充:

也可以把 redis-sentinel 放到和上⾯的 redis 的同⼀个 yml 中进⾏容器编排. 此处分成两组, 主要是为了两⽅⾯:

  • 观察⽇志⽅便

  • 确保 redis 主从节点启动之后才启动 redis-sentinel. 如果先启动 redis-sentinel 的话, 可能触发额外的选举过程, 混淆视听. (不是说先启动哨兵不⾏, ⽽是观察的结果可能存在⼀定随机性)

2.3 配置哨兵节点

1.回到上级目录,新创一个文件夹sentinel,然后进到该文件夹,创建docker-compose.yml文件,然后配置:

version: '3.7'
services:sentinel1:image: 'redis:5.0.9'container_name: redis-sentinel-1restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel1.conf:/etc/redis/sentinel.confports:- 26379:26379sentinel2:image: 'redis:5.0.9'container_name: redis-sentinel-2restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/etc/redis/sentinel.confports:- 26380:26379sentinel3:image: 'redis:5.0.9'container_name: redis-sentinel-3restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel3.conf:/etc/redis/sentinel.confports:- 26381:26379
networks:default:external:name: redis-slave_default  #加入到的局域网名,后面解释

2.创建 sentinel1.conf sentinel2.conf sentinel3.conf . 三份⽂件的内容是完全相同的

bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000

理解 sentinel monitor:

sentinel monitor 主节点名 主节点ip 主节点端⼝ 法定票数
  • 主节点名:这个是哨兵内部⾃⼰起的名字
  • 主节点 ip:部署 redis-master 的设备 ip. 此处由于是使⽤ docker, 可以直接写 docker 的容器名, 会被⾃动 DNS 成对应的容器 ip
  • 主节点端⼝:主节点的端口号
  • 法定票数:哨兵需要判定主节点是否挂了. 但是有的时候可能因为特殊情况, ⽐如主节点仍然⼯作正常, 但是哨兵节点⾃⼰⽹络出问题了, ⽆法访问到主节点了. 此时就可能会使该哨兵节点认为主节点下线, 出现误判. 使⽤投票的⽅式来确定主节点是否真的挂了是更稳妥的做法. 需要多个哨兵都认为主节点挂了, 票数 >= 法定票数 之后, 才会真的认为主节点是挂了

理解 sentinel down-after-milliseconds

主节点和哨兵之间通过⼼跳包来进⾏沟通. 如果⼼跳包在指定的时间内还没回来, 就视为是节点出现故障

既然内容相同, 为啥要创建多份配置⽂件?

redis-sentinel 在运⾏中可能会对配置进⾏ rewrite, 修改⽂件内容. 如果⽤⼀份⽂件, 就可能出现修改混乱的情况

3.启动该配置文件中的docker容器

sudo docker-compose up -d

如果启动后发现前⾯的配置有误, 需要重新操作, 使⽤ docker-compose down 即可停⽌并删除刚才创建好的容器

4.查看运⾏⽇志

docker-compose logs

在这里插入图片描述

出现“WARNING: Sentinel was not able to save the new configuration on disk!!!: Is a directory”错误的原因通常是因为文件权限问题。‌ 在Docker中部署Redis Sentinel时,如果配置文件没有正确的读写权限,Sentinel就无法保存新的配置到磁盘上

修改配置文件的权限‌:确保配置文件有适当的读写权限。可以通过以下命令修改权限:

sudo chmod 777 ./sentinel1.conf ./sentinel2.conf ./sentinel3.conf

这会将配置文件的权限设置为可读、可写、可执行,确保Sentinel能够正常保存配置

出现Reading the configuration file, at line 3 redis-sentinel-2 | >>> ‘sentinel monitor redis-master redis-master 6379 2’
redis-sentinel-2 | Can’t resolve master instance hostname.错误时,表示无法正确解析到主节点的ip地址

在这里插入图片描述

主要原因docker启动容器的时候,会把容器分配在不同的虚拟局域网中,此时主从节点和哨兵节点不在同一个虚拟局域网中,所以也就解析不了主节点的ip地址了。

可通过如下指令查看当前docker容器有哪些虚拟局域网:

docker network ls

主从节点与哨兵节点不在同一个局域网中,此时需要修改用于启动哨兵节点的配置文件docker-compose.yml文件。将虚拟局域网部分改为

networks:default:external:name: redis-slave_default

然后执行docker-compose down 命令将对应的哨兵节点关闭移除掉,然后在调用docker-compose up -d创建启动哨兵节点:

#关闭移除哨兵节点
sudo docker-compose down
#创建启动哨兵节点
sudo docker-compose up -d

哨兵节点启动成功后的日志

在这里插入图片描述

也可以通过如下指令,查看单个哨兵的日志:

#查看docker容器中启动的容器,可以得到哨兵节点的名称,ID
sudo docker ps -a
#得到sentinel名称,ID以后
sudo docker logs 容器的名称(或ID)

在这里插入图片描述

5.观察 redis-sentinel 的配置 rewrite

再次打开哨兵的配置⽂件, 发现⽂件内容已经被⾃动修改了

#配置文件信息
bind 0.0.0.0
port 26379
sentinel myid ccdae87d81bf00f23ca6d4ab869571ef046be71f
sentinel deny-scripts-reconfig yes
# Generated by CONFIG REWRITE
dir "/data"
sentinel monitor redis-master 172.18.0.3 6379 2
sentinel down-after-milliseconds redis-master 1000
sentinel config-epoch redis-master 0
sentinel leader-epoch redis-master 0
sentinel known-replica redis-master 172.18.0.4 6379
sentinel known-replica redis-master 172.18.0.2 6379
sentinel known-sentinel redis-master 172.18.0.6 26379 3b77e18de5fb4ce0bc214f6aa2665b77429a80f2
sentinel known-sentinel redis-master 172.18.0.5 26379 0ccfa9143d636099702b86b36daee36275818d1b
sentinel current-epoch 0

三、redis哨兵的选举机制

3.1 redis-master宕机之后的情况

为了让主节点宕机,我们可以手动把它关掉:

sudo docker stop redis-master

观察哨兵的⽇志:

在这里插入图片描述

可以看到哨兵发现了主节点 sdown, 进⼀步的由于主节点宕机得票达到 3/2 , 达到法定得票, 于是 master 被判定为 odown

  • 主观下线 (Subjectively Down, sdown): 哨兵感知到主节点没⼼跳了. 判定为主观下线

  • 客观下线 (Objectively Down, odown): 多个哨兵达成⼀致意⻅, 才能认为 master 确实下线了

接下来, 哨兵们挑选出了⼀个新的 master. 在上图中, 是 172.18.0.2:6379 这个节点

在这里插入图片描述

此时, 对于 Redis 来说仍然是可以正常使⽤的

3.2 重启redis-master后的情况

⼿动把 redis-master 启动起来:

sudo docker start redis-master

观察哨兵⽇志,可以看到刚才新启动的redis-master 被当成了 slave

在这里插入图片描述

可以登录该客户端执行验证:

redis-cli -p 6379

然后执行写的命令:

set key 'hello'

在这里插入图片描述

此时的redis-master(从节点)已经没有了写的权限。

总结:

  • Redis 主节点如果宕机, 哨兵会主观的认为主节点下线了,当主观认为主节点下线的票数超过一半以后,哨兵节点就会客观认为主节点下线了。

  • 然后哨兵节点会进行投票选举出一个leader哨兵节点(票数需要大于等于二分之一),来让从节点变成主节点。

  • 当之前的 Redis 主节点重启之后, 这个主节点被加⼊到哨兵的监控中, 但是只会被作为从节点使⽤.

四、redis哨兵机制的原理

假定当前环境如上⽅介绍, 三个哨兵(sentinel1, sentinel2, sentinel3), ⼀个主节点(redis-master), 两个从节点(redis-slave1, redis-slave2),当主节点出现故障, 就会触发⼀系列过程

在这里插入图片描述

4.1主观下线

当 redis-master 宕机, 此时 redis-master 和三个哨兵之间的⼼跳包就没有了,此时,站在三个哨兵的⻆度来看,redis-master 出现严重故障,因此三个哨兵均会把 redis-master 判定为主观下线 (sdown)

4.2客观下线

此时, 哨兵 sentinel1, sentinel2, sentinel3 均会对主节点故障这件事情进⾏投票. 当认为主节点下线的票数 >= 配置的法定票数之后,此时意味着 redis-master 故障这个事情被做实了,此时触发客观下线 (odown)

配置的法定票数

sentinel monitor redis-master 172.22.0.4 6379 2

在我们写哨兵节点的三个配置文件的时候,此处所写的2就是法定票数

4.3选举leader节点

接下来需要哨兵把剩余的 slave 中挑选出⼀个新的 master. 这个⼯作不需要所有的哨兵都参与. 只需要选出个代表 (称为 leader), 由 leader 负责进⾏ slave 升级到 master 的提拔过程,这个选举的过程涉及到 Raft 算法

假定⼀共三个哨兵节点, S1, S2, S3,选举过程如下:

  1. 每个哨兵节点都给其他所有哨兵节点, 发起⼀个 “拉票请求”. (S1 -> S2, S1 -> S3, S2 -> S1, S2 -> S3, S3 -> S1, S3 -> S2)
  2. 收到拉票请求的节点, 会回复⼀个 “投票响应”. 响应的结果有两种可能, 投 or 不投,每个节点只有一次投票机会,投了就不能再投了
  3. ⼀轮投票完成之后, 发现得票超过法定票数的节点, ⾃动成为 leader。如果出现平票的情况 (S1 投 S2, S2 投 S3, S3 投 S1, 每⼈⼀票), 就重新再投⼀次即可,这也是为啥建议哨兵节点设置成奇数个的原因. 如果是偶数个, 则增⼤了平票的概率, 带来不必要的开销.
  4. leader 节点负责挑选⼀个 slave 成为新的 master. 当其他的 sentenal 发现新的 master 出现了, 就说明选举结束了

简⽽⾔之, Raft 算法的核⼼就是 “先下⼿为强”. 谁率先发出了拉票请求, 谁就有更⼤的概率成为 leader,这⾥的决定因素成了 “⽹络延时”. ⽹络延时本⾝就带有⼀定随机性,所以哪个节点成为leader是不确定的,当然这也是无关紧要的,成为leader的目的就是为了提拔一个从节点让其成为主节点。

4.4选出合适的从节点

从节点变成主节点的选举规则:

  1. ⽐较优先级. 优先级⾼(数值⼩的)的上位,优先级是配置⽂件中的配置项( slave-priority 或者 replica-priority )
  2. ⽐较 replication offset 谁复制的数据多,⾼的上位
  3. ⽐较 run id , 谁的 id ⼩, 谁上位

当某个 slave 节点被指定为 master 之后,

  1. leader 指定该节点执⾏ slave no one , 成为 master
  2. leader 指定剩余的 slave 节点, 都依附于这个新 master

4.5哨兵机制小结

上述过程, 都是 “⽆⼈值守” , Redis ⾃动完成的. 这样做就解决了主节点宕机之后需要⼈⼯⼲预的问题, 提⾼了系统的稳定性和可⽤性

⼀些注意事项:

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

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

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

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

  • 哨兵 + 主从复制不能提⾼数据的存储容量,当我们需要存的数据接近或者超过机器的物理内存,这样的结构就难以胜任了,此时就需要引入集群结构了。

相关文章:

redis中的哨兵

redis中的哨兵 一、哨兵机制的概念二、redis哨兵的部署2.1 docker的安装2.2 编排redis主从节点2.3 配置哨兵节点 三、redis哨兵的选举机制3.1 redis-master宕机之后的情况3.2 重启redis-master后的情况 四、redis哨兵机制的原理4.1主观下线4.2客观下线4.3选举leader节点4.4选出…...

开源对象存储新选择:在Docker上部署MinIO并实现远程管理

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…...

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前,我们都在讲什么低代码/无代码平台,这个概念很久了,但是,一直没有很好的落地,整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来,各大科技公司也都推出了很多 AI 代码助手&#xff…...

houdini肌肉刷pin点的方法

目标:产生gluetoanimation这个属性 主要节点:attribute paint(或者muscle paint) 步骤1: 导入肌肉资产 导入的是rest shape的肌肉 在有侧边栏可以打开display group and attribute list,方便查看group。不同的肌肉块按照muscl…...

Ubuntu20.04安装NVIDIA显卡驱动

Ubuntu20.04安装NVIDIA显卡驱动 参考资料:https://blog.csdn.net/weixin_39244242/article/details/136282614?fromshareblogdetail&sharetypeblogdetail&sharerId136282614&sharereferPC&sharesourceqq_37397652&sharefromfrom_link 成功配置…...

k8s删除网络组件错误

k8s集群删除calico网络组件重新部署flannel网络组件,再部署pod后出现报错不能分配ip地址 plugin type"calico" failed (add): error getting ClusterInformation: connection is unauthorized: Unauthorized 出现该问题是因为删除网络组件后,网…...

民锋视角:多元化策略实现资产稳健增长

在全球化经济的推动下,市场呈现出高度的复杂性与多样性。面对不同经济周期和市场动态,民锋以多元化投资策略为核心,帮助投资者在不确定性中实现资产的稳健增长。 一、多元化策略的核心价值 降低单一市场风险 单一资产或市场的表现可能因不可…...

[已解决]Visual Studio 2022中如何同时打开多个项目多个独立窗口

同时运行两个VS2022程序,即点击运行Visual Studio 2022.exe后,再点击运行一次运行Visual Studio 2022.exe,效果如图...

11、PyTorch中如何进行向量微分、矩阵微分与计算雅克比行列式

文章目录 1. Jacobian matrix2. python 代码 1. Jacobian matrix 计算 f ( x ) [ f 1 x 1 2 2 x 2 f 2 3 x 1 4 x 2 2 ] , J [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 ] [ 2 x 1 2 3 8 x 2 ] \begin{equation} f(x)\begin{bmatrix} f_1x_1^22x_2\\…...

51c自动驾驶~合集35

我自己的原文哦~ https://blog.51cto.com/whaosoft/12206500 #纯视觉方案的智驾在大雾天还能用吗? 碰上大雾天气,纯视觉方案是如何识别车辆和障碍物的呢? 如果真的是纯纯的,特头铁的那种纯视觉方案的话。 可以简单粗暴的理解为…...

位图和布隆过滤器

目录 一.位图 1.位图的概念 2.位图的实现 3.位图的应用 二.布隆过滤器 1.布隆过滤器的概念 2.布隆过滤器的实现 3.布隆过滤器的优缺点 三.整体代码 1.bitset.h 2.BloomFilter 3.Hash.cpp 一.位图 1.位图的概念 1.面试题 给40亿个不重复的无符号整数,没…...

Java—I/O流

Java的I/O流(输入/输出流)是用于在程序和外部资源(如文件、网络连接等)之间进行数据交换的机制。通过I/O流,可以实现从外部资源读取数据(输入流)或将数据写入外部资源(输出流&#x…...

CSS样式

第一章&#xff1a;CSS类型 1、行内样式 <div style"color:red;font-size:30px;font-weight: 900;font-style: italic;">ABCD</div>注意&#xff1a;行内样式&#xff0c;作用力优先级最高&#xff0c;但是不利于html与css的书写以及修改&#xff0c;会…...

idea_卸载与安装

卸载与安装 卸载1、设置 -> 应用2、查找到应用&#xff0c;点击卸载3、把删除记录和设置都勾选上4、删除其它几个位置的残留 安装1、下载安装包2、欢迎安装 -> Next3、选择安装目录 -> Next4、创建快捷图标和添加到环境变量5、确认文件夹的名称 -> Install6、完成安…...

大数据-237 离线数仓 - 广告业务 需求分析 ODS DWD UDF JSON 串解析

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

视觉语言模型(VLM)学习笔记

目录 应用场景举例 VLM 的总体架构包括&#xff1a; 深度解析&#xff1a;图像编码器的实现 图像编码器&#xff1a;视觉 Transformer 注意力机制 视觉-语言投影器 综合实现 训练及注意事项 总结 应用场景举例 基于文本的图像生成或编辑&#xff1a;你输入 “生成一张…...

Spring 自调用事务失效分析及解决办法

前言 博主在写公司需求的时候&#xff0c;有一个操作涉及到多次对数据库数据的修改。当时就想着要加 Transactional注解来声名事务。并且由于一个方法中有太多行了&#xff0c;于是就想着修改数据库的操作单独提取出来抽象成一个方法。但这个时候&#xff0c;IDEA 提示我自调用…...

【ROS2】Ubuntu22.04安装ROS humble

一. ROS简介 1.1 什么是ROS ROS 是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务&#xff0c;包括硬件抽象&#xff0c;底层设备控制&#xff0c;常用函数的实现&#xff0c;进程间消息传递&#xff0c;以及包管理。ROS的核心思想就是将机器人的软件功能做…...

免费开源的微信开发框架

请求参数 Header 参数 export interface ApifoxModel {"X-GEWE-TOKEN": string;[property: string]: any; } Body 参数application/json export interface ApifoxModel {/*** 设备ID*/appId: string;/*** 是否允许*/enabled: boolean;[property: string]: any; }…...

【第二讲】Spring Boot 3.4.0 新特性详解:新的依赖管理功能

Spring Boot 3.4.0 版本引入了一些显著的改进&#xff0c;其中之一就是新的依赖管理功能。这些改进不仅提升了依赖管理的便利性和一致性&#xff0c;还增强了项目的可维护性和可扩展性。本文将详细介绍 Spring Boot 3.4.0 中新的依赖管理功能&#xff0c;提供具体的使用示例和场…...

CSAPP Cache Lab(缓存模拟器)

前言 理解高速缓存对 C 程序性能的影响&#xff0c;通过两部分实验达成&#xff1a;编写高速缓存模拟器&#xff1b;优化矩阵转置函数以减少高速缓存未命中次数。Part A一开始根本不知道要做什么&#xff0c;慢慢看官方文档&#xff0c;以及一些博客&#xff0c;和B站视频&…...

Vue项目通过Nginx部署多个

1.将Vue项目部署到Nginx根 1.1 修改vue.config.js&#xff0c;默认可以不设置 module.exports {publicPath: / } 1.2 修改index.js&#xff0c;默认可以不设置 export default new Router({...base: "/"... }) 1.3 修改nginx.conf location / {root /usr/shar…...

【React】全局状态管理(Context, Reducer)

以下为知行小课学习笔记。 概述 Context 跨组件共享状态 在 Next 项目&#xff0c;封装 useContext。 AppContext.tsx "use client";import React, {createContext, Dispatch, ReactNode, SetStateAction, useContext, useMemo, useState} from react;type State …...

Docker容器ping不通外网问题排查及解决

Docker容器ping不通外网问题排查及解决 解决方案在最下面&#xff0c;不看过程的可直接拉到最下面。 一台虚拟机里突然遇到docker容器一直访问外网失败&#xff0c;网上看到这个解决方案&#xff0c;这边记录一下。 首先需要明确docker的网桥模式&#xff0c;网桥工作在二层…...

VTK的基本概念(一)

文章目录 三维场景的基本要素1.灯光2.相机3.颜色4.纹理映射 三维场景的基本要素 1.灯光 在三维渲染场景中&#xff0c;可以有多个灯光的存在&#xff0c;灯光和相机是三维渲染场景的必备要素&#xff0c;如果没有指定的话&#xff0c;vtkRenderer会自动创建默认的灯光和相机。…...

【动态规划】股票市场交易策略优化

文章目录 一、问题描述二、解决思路状态转移初始化最终结果 三、代码实现执行流程解析时间和空间复杂度 一、问题描述 我们要解决的是一个关于股票买卖的问题&#xff1a;给定一个股票价格数组 stocks&#xff0c;每一天的价格为数组中的一个元素。我们可以通过买入和卖出的操…...

docker-compose 升级

官方下载地址&#xff1a; https://github.com/docker/compose/releases 下载完放到kali root目录下 # mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose # chmod x /usr/local/bin/docker-compose # docker-compose --version...

node.js @ffmpeg-installer/ffmpeg 桌面推流

//安装npm install --save ffmpeg-installer/ffmpeg //stream.js // 引入所需模块 const ffmpeg require(ffmpeg-installer/ffmpeg); const { exec } require(child_process); // 设置 FFmpeg 路径 const ffmpegPath ffmpeg.path; const rtmpUrl "rtmp://localhost…...

电脑启动需要经历哪些过程?

传统BIOS启动流程 1. BIOS BIOS 启动&#xff0c;BIOS程序是烧进主板自带的ROM里的&#xff0c;所以无硬盘也可以启动。BIOS先进行自检&#xff0c;检查内存、显卡、磁盘等关键设备是否存在功能异常&#xff0c;会有蜂鸣器汇报错误&#xff0c;无错误自检飞快结束。 硬件自检…...

MobaXterm Sessions 批量录入导入,会话批量添加

此脚本用于将服务器批量录入到 MobaXterm 会话 使用方法&#xff1a; 1、将IP列定义在 sessions_ip_list 变量中&#xff08;ssh登录的IP&#xff09; 2、将登录用户定义在 sessions_user 变量中&#xff08;ssh登录的用户&#xff09; 3、将目录名称定义在 folder_name 变…...

ceph的用户管理和cephx认证

用户权限概述 用户格式 参考链接&#xff1a; 权限&#xff1a;https://docs.ceph.com/en/latest/rados/operations/user-management/#authorization-capabilities 用户&#xff1a;https://docs.ceph.com/en/reef/rados/operations/user-management/ ceph的用户格式TYPEID…...

【北京迅为】iTOP-4412全能版使用手册-第二十章 搭建和测试NFS服务器

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…...

MicroSoft Project2007 安装教程

一、安装教程 访问地址 二、安装链接 通过网盘分享的文件&#xff1a;Project2007CD 链接: https://pan.baidu.com/s/1Y8VnhVPiKjcmAEh8cIR5sQ?pwdp2hk 提取码: p2hk --来自百度网盘超级会员v6的分享...

怎样提高自己的能量

能量转换的基本原则是让别人需要你&#xff0c;而不是你去求对方。别人需要你&#xff0c;你的能量就高&#xff0c;你去求别人你的能量就低。 怎样提高自己的能量&#xff1f; 第一&#xff0c;留意你的气场和格局。气场不是说你表现的多么霸道&#xff0c;而是你的信念、决心…...

ScreenshotToCode安装教程

网页截图生成代码&#xff0c;我测试的效果一般 快速安装教程如下 1&#xff0c;首先你得有OpenAI的账号 国内用这个代理就可以&#xff1a; https://www.closeai-asia.com/ 充值一块钱&#xff0c;在本项目中可以生成两次 2&#xff0c;下载程序 下载程序压缩包&#xff1…...

工程企业如何做好成本控制?该如何入手?

工程企业的成本控制是企业管理中的核心工作&#xff0c;其直接关系到项目的盈利能力和市场竞争力。以下从几个关键方向阐述如何入手做好成本控制&#xff1a; 一、明确成本控制目标 成本控制的目标不仅是减少支出&#xff0c;更重要的是保证项目质量和工期&#xff0c;避免因低…...

详解桥接模式

引言 在开发过程中&#xff0c;可能会遇到系统设计有多种维度变化的情况&#xff0c;比如我们想画一幅五彩斑斓的画&#xff0c;需要用到12个颜色&#xff0c;但是需要粗细不同的线条&#xff08;粗、中、细&#xff09;&#xff0c;如果用蜡笔&#xff0c;就需要粗中细三种蜡笔…...

田忌赛马五局三胜问题matlab代码

问题描述&#xff1a;在可以随机选择出场顺序的情况下&#xff0c;如果把比赛规则从三局两胜制改为五局三胜制&#xff0c;齐王胜出的概率是上升了还是下降了&#xff1f;五局三胜的赛制下&#xff0c;大家的马重新分为5个等级。前提条件仍然是齐王每种等级的马都优于田忌同等级…...

Springboot 修改post请求接口入参或重新赋值

前言 很久之前写过一篇就是自动填充接口参数的&#xff0c;利用的 HandlerMethodArgumentResolver 自定义注解 Springboot Controller接口默认自动填充 业务实体参数值_springboot设置入参默认值-CSDN博客 现在这一篇也差不多&#xff0c;达到的目的就是重新去给post请求的参数…...

jmeter学习(7)命令行控制

jmeter -n -t E:\IOT\test2.jmx -l E:\IOT\output\output.jtl -j E:\IOT\output\jmeter.log -e -o E:\IOT\output\report IOT下创建output 文件夹&#xff0c;jmx文件名避免中文&#xff0c;再次执行output.jtl不能有数据要删除...

李春葆《数据结构》-查找-课后习题代码题

一&#xff1a;设计一个折半查找算法&#xff0c;求查找到关键字为 k 的记录所需关键字的比较次数。假设 k 与 R[i].key 的比较得到 3 种情况&#xff0c;即 kR[i].key&#xff0c;k<R[i].key 或者 k>R[i].key&#xff0c;计为 1 次比较&#xff08;在教材中讨论关键字比…...

Spring Boot教程之十: 使用 Spring Boot 实现从数据库动态下拉列表

使用 Spring Boot 实现从数据库动态下拉列表 动态下拉列表&#xff08;或依赖下拉列表&#xff09;的概念令人兴奋&#xff0c;但编写起来却颇具挑战性。动态下拉列表意味着一个下拉列表中的值依赖于前一个下拉列表中选择的值。一个简单的例子是三个下拉框&#xff0c;分别显示…...

Facebook的开源项目解析:推动开发者社区的技术进步

Facebook&#xff0c;作为全球领先的社交平台之一&#xff0c;其在技术领域的创新不仅体现在产品功能的实现上&#xff0c;也积极推动开源社区的发展。开源项目已经成为Facebook技术战略的重要组成部分&#xff0c;通过开源&#xff0c;Facebook不仅加速了技术进步&#xff0c;…...

以 SpringBoot 为基石的夕阳红公寓信息化管理系统设计理念

2 开发环境与技术 本章节对开发夕阳红公寓管理系统需要搭建的开发环境&#xff0c;还有夕阳红公寓管理系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff0c;不仅仅是创造者感觉C…...

身份证OCR 识别 API 接口的发展前景

随着信息时代的到来&#xff0c;大量的身份证数据需要进行整理、存储和管理&#xff0c;OCR 识别技术可以将身份证信息转化为结构化的电子文本&#xff0c;方便后续的数据管理和分析&#xff0c;提高工作效率。 未来&#xff0c;随着人工智能和深度学习等技术的不断发展&#…...

使用vue3实现element-plus的主题切换特效

先看实现效果 实现过程 前提需要引入好 element-plus&#xff0c;并导入element的黑色主题CSS 示例&#xff0c;再 main.js 中引入 import ElementPlus from element-plus import element-plus/dist/index.css import element-plus/theme-chalk/dark/css-vars.css // 黑色主…...

深入了解决策树---机器学习中的经典算法

引言 决策树&#xff08;Decision Tree&#xff09;是一种重要的机器学习模型&#xff0c;以直观的分层决策方式和简单高效的特点成为分类和回归任务中广泛应用的工具。作为解释性和透明性强的算法&#xff0c;决策树不仅适用于小规模数据&#xff0c;也可作为复杂模型的基石&…...

深度优先算法(DFS)和广度优先算法(BFS)

一、深度优先算法 深度优先搜索属于图算法的一种&#xff0c;是一个针对图和树的遍历算法&#xff0c;英文缩写为DFS即Depth First Search。深度优先搜索是图论中的经典算法&#xff0c;利用深度优先搜索算法可以产生目标图的相应拓扑排序表&#xff0c;利用拓扑排序表可以方便…...

Linux进程信号

信号量 本质是一个计数器&#xff0c;用来表示系统资源中&#xff0c;资源数量多少的问题。 公共资源:能被多个进程同时访问的资源。 访问没有被保护的资源&#xff0c;可能会出现数据不一致问题。 让不同进程看到同一个资源的目的是想通信。 为了解决进程具有独立性无法 …...

东风破捉妖师横空出世

一.异动拉升实时监测 东风破就像是一个大盘监测平台&#xff0c;是现实版的捉妖师&#xff0c;一旦妖股横空出世&#xff0c;就会在东风破面前原形毕露。东风破AI算法逻辑是监测存在异动拉升的股票&#xff0c;实时分析上证&#xff0c;深证&#xff0c;创业和科创板的股票数据…...