RabbitMQ实现网络分区

news2024/12/18 10:53:23

RabbitMQ实现网络分区

  • 网络分区的判断
    • 应答时间范围
    • 判定方式
      • 日志方式
      • 命令查看
      • 监控页面提示
      • API查看
  • 模拟网络分区
    • 封禁端口
    • 封禁IP
    • 封禁网卡
    • 挂起恢复操作系统
  • 网络分区的影响
    • 未配置镜像队列情况下
    • 已配置镜像队列情况下
  • 处理网络分区
    • 手动处理
      • 恢复步骤
      • 挑选信任分区
      • 重启方式(2种方式)
      • 重启顺序(2种方式)
      • 注意事项
      • 镜像队列漂移现象
        • 漂移现象
        • 缓解方法
        • 处理方法
        • 处理流程总结
    • 自动处理网络分区
      • pause_minority 模式
        • CAP 原理
          • 注意事项
      • pause_if_all_down 模式
      • autoheal 模式
        • 获胜分区
      • 总结
    • 各模式优缺点

网络分区的意义:

  • rabbitmq集群的网络分区的容错性不是很高,一般情况可以使用Federation或者Shovel插件就可以解决广域网中的使用问题。不过即使是在局域网环境下,网络分区也不可能完全避免,网络设备(比如中继设备、网卡) 出现故障也会导致网络分区。极端情况下还会造成数据丢失,影响服务的可用性。
  • 当一个集群发生网络分区时,这个集群会分成两个部分或者更多,它们各自为政,互相都认为对方分区内的节点已经挂了,包括队列、交换器及绑定等元数据的创建和销毁都处于自身分区内,与其他分区无关。如果原集群中配置了镜像队列,而这个镜像队列又牵涉两个或者更多个网络分区中的节点时,每一个网络分区中都会出现一个master节点,对于各个网络分区,此队列都是相互独立的。当然也会有一些其他未知的、怪异的事情发生。
  • 在一致性数据模型下,若出现网络波动或者网络故障等异常情况,会导致整个数据链的性能就会大大降低。例如有A、B、C、D四节点为一个数据链,倘若其中的C节点网络异常,那么整个A——> B——> C——>D——> A的数据链就会被阻塞,继而相关服条也会被阻塞,这种情况下就需要将异常节点C剥离整个分区,以确保rabbitmq服务的可用性及可靠性。等待网络恢复之后,可以进行相应的处理来将此前的异常节点加入集群中。

网络分区的影响:

  • 数据丢失;
  • 服务阻塞不可用;
  • 网络恢复后,网络分区状态仍然存在。

网络分区的判断

判断机制:

  • abbitmq集群节点内部通信端口默认为25672,两两节点之间都会有信息交互。如果某节点出现网络故障,或者是端口不通,则会致使与此节点的交互出现中断,这里就会有个超时判定机制,继而判定网络分区。
  • 超时判定机制net_ticktime参数有关,该参数默认值为60秒。若超时,则会有net_tick_timeout的信息报出。这个参数与heartbeat_time有些区别,heartbeat_time是指客户端与RabbitMQ服务之间通信的心跳时间,针对5672端口而言。

节点之间的应答机制(判断流程):
rabbitmq集群内部的每个节点之间会每隔四分之一的net_ticktime计一次应答 (tick)。若有任何数据被写入节点中,则此节点被认为已经被应答 (ticked) 了。如果连续 4 次,某节点都没有被 ticked,则可以判定此节点已处于down状态,其余节点可以将此节点剥离出当前分区。

应答时间范围

如下图,将连续4次的tick时间记为T,那么T的取值范围为:0.75 * net_ticktime < T<1.25 * net_ticktime

图中每个节点代表一次tick判定的时间戳,在2个临界值0.75 * net_ticktime和1.25 * net_ticktime之间可以连续执行4次的tick判定。默认情况下,在45s < T< 75s之间会判定出net_tick_timeout

在这里插入图片描述

判定方式

日志方式

rabbitmq不仅会将队列、交换器及绑定等信息存储在Mnesia数据库中,而且许多围绕网络分区的一些细节也都和这个Mnesia的行为相关。

如果一个节点不能在下时间连上另一个节点,那么Mnesia通常认为这个节点已经挂了,就算之后两个节点又重新恢复了内部通信,但是这两个节点都会认为对方已经挂了,Mnesia此时认定了发生网络分区的情况。这些会被记录到RabbitMQ的服务日志之中。
在这里插入图片描述

命令查看

通过命令rabbitmqctl cluster_status可以看到集群相关信息。

  • 当没有发生网络分区时,在Network Partitions这一块显示无。
  • 当发生网络分区时,Network Partitions这一块会显示相关信息。

在这里插入图片描述
在这里插入图片描述

监控页面提示

也可以通过 Web 管理界面来查看。如果出现了下图这种告警,即发生了网络分区。
在这里插入图片描述

API查看

第三种,通过HTTP API的方式调取节点信息来检测是否发生网络分区。

其中会有partitions的相关项,如果在其中发现partitions项中有内容则为发生了网络分区。举例,将node2分离出nodel和node3的主分区之后,调用/api/nodes这个接口的部分信息。

node1节点上查看,partitions一栏显示有node2节点,说明node1和node2节点发生了网络分区。

[root@node1 ~]# curl  -XGET http://192.168.130.129:15672/api/nodes?pretty -i -u qingjun:citms -H "content-type:application/json"

在这里插入图片描述

模拟网络分区

模拟网络分区的方式有多种,主要分为以下3大类:

  • iptables封禁/解封IP地址或者端口号。
  • 关闭/开启网卡。
  • 挂起/恢复操作系统

封禁端口

若是通过防火墙屏蔽端口只能模拟出net_tick_timeout,不能触发网络分区。
在这里插入图片描述

由于rabbitmq集群内部节点通信端口默认为 25672,可以封禁25672端口方式来模拟出net_tick_timeout。开启防火墙只能模拟触发节点的net_tick_timeout,但是模拟不了节点的网络分区现象。

比如我这里集群有3个节点,node1、node2、node3。此时我们要模拟 node2 节点被剥离出当前分区的情形,即模拟[nodel,node3]和[node2]两个分区。就在 node2节点执行封禁端口命令。

  1. 封禁node2节点上的25672端口
[root@node2 ~]# iptables -A INPUT -p tcp --dport 25672 -j DROP
[root@node2 ~]# iptables -A OUTPUT -p tcp --dport 25672 -j DROP
  1. 此时可以查看node1和node3节点日志,显示node2已经触发了节点之间的应答机制。
    在这里插入图片描述
  2. 接触node2节点上的25672封禁,此时才会判定node2节点发生了网络分区。
[root@node2 ~]# iptables -D OUTPUT 1
[root@node2 ~]# iptables -D INPUT 1
  1. 此时再去查看node1和node3节点日志,显示node2节点出现了网络分区。而node2节点上的日志显示,node1和node3节点已经掉线。
    在这里插入图片描述
  2. 分别查看三个节点上集群状态
    在这里插入图片描述
    在这里插入图片描述
  3. 查看web监控页面。
    在这里插入图片描述

封禁IP

假设整个rabbitmq集群的节点名称与其IP地址对应如下

node1 192.168.130.129
node2 192.168.130.130
node3 192.168.130.131

若要模拟出[node1,node3]和[node2]两个分区的情形,可以在node2节点上执行封禁命令。

#封禁。
iptables -I INPUT -s 192.168.130.129 -j DROP
iptables -I INPUT -S 192.168.130.131 -j DROP
#解封。
iptables -D INPUT 1
iptables -D INPUT 1

也可以分别在node1和node3节点上执行封禁命令。

#封禁。
iptables -I INPUT -s 192.168.130.130 -j DROP
#解封。
iptables -D INPUT 1

如果集群的节点部署跨网段,可以采取禁用整个网络段的方式模拟网络分区。
假设rabbitmq集群中 3 个节点和其对应的 IP 关系如下:

node1 192.168.0.2
node2 192.168.1.3
node3 192.168.0.4

模拟出[node1,node3]和[node2]两个分区的情形,可以在 node2 节点上封禁命令。

#封禁。
iptables -I INPUT -s 192.168.0.0/24 -j DROP
#解封.
iptables -D INPUT 1

封禁网卡

先使用ifconfig命令来查询出当前的网卡编号,如下所示,一般情况下单台机器只有一个网卡。

[root@node1 ~]# ifconfig

在这里插入图片描述
同样假设 node1、node2和node3这三个节点组成 RabbitMQ 集群node2 的网卡编号为ens33,此时要模拟网络分区[nodel,node3]和[node2]的情形,需要在node2上执行封禁网卡命令。

#封禁。
ifdown ens33 或者 systemctl stop  network
#解封。
ifup ens33  或者 systemctl start  network

挂起恢复操作系统

操作系统的挂起和恢复操作也会导致集群内节点的网络分区。因为发生挂起的节点不会认为自身已经失败或者停止工作,但是集群内的其他节点会这么认为。

如果集群中的一个节点运行在一台笔记本电脑上,然后你合上了笔记本电脑,那么这个节点就挂起了。或者一个更常见的现象,集群中的一个节点运行在某台虚拟机上,然后虚拟机的管理程序挂起了这个虚拟机节点,这样节点就被挂起了。在等待节点应答时间后,判定出net_tick_timeout,再恢复挂起的节点即可以复现网络分区。

网络分区的影响

未配置镜像队列情况下

  • 对于未配置镜像的集群,网络分区发生之后,队列也会伴随着宿主节点而分散在各自的分区之中。
  • 对于消息发送方而言,可以成功发送消息,但是会有路由失败的现象,要需要配合 mandatory 等机制保障消息的可靠性。
  • 对于消息消费方来说,有可能会有诡异不可预知的现象发生,比如对于已消费消息的 ack 会失效。如果网络分区发生之后,客户端与某分区重新建立通信链路,其分区中如果没有相应的队列进程,则会有异常报出。如果从网络分区中恢复之后,数据不会丢失,但是客户端会重复消费。

已配置镜像队列情况下

  • 当镜像配置都是ha-sync-mode=automatic时,
  • 若有新的slave出现时,此slave会自动同步master中的数据。同步过程中,集群的整个服务都不可用,客户端连接会被阻塞。
  • 若master 中有大量的消息堆积,必然会造成slave的同步时间增长,进步影响了集群服务的可用性。
  • 当镜像配置都是ha-sync-mode=manual时,
  • 若有新的slave创建时,此slave不会去同步master上旧的数据,如果此时master节点又发生了异常,那么此部分数据将会丢失同样ha-promote-on-shutdown这个参数的影响也需要考虑进来。

处理网络分区

手动处理

恢复步骤

  • 第一步,挑选一个信任分区。
  • 第二步,重启非信任分区中的节点,若重启后还有网络分区的告警,再紧接着重启信任分区中的节点。

挑选信任分区

挑选信任分区有几个指标,优先级从前到后为:

  • 分区中要有 disc 节点;
  • 分区中的节点数最多分区中的队列数最多;
  • 分区中的客户端连接数最多。

重启方式(2种方式)

  • 第一种:先rabbitmqctl stop命令关闭,再用 rabbitmq-server -detached 命令启动。
  • 第二种,先rabbitmqctl stop_app命令关闭,再用 rabbitmqctl start_app 命令启动。(推荐)

重启顺序(2种方式)

  • 第一种,先停止其他非信任分区中的所有节点,然后再启动这些节点。如果此时还有网络分区的告警,则再重启信任分区中的节点以去除告警。比如我上面这种网络分区情况,先关闭node2上的服务,在启动node2服务,若还存在网络分区告警,则在重启node1和node3节点。
  • 第二种,先关闭整个集群中的节点,然后再启动每一个节点,这里需要确保启动的第一个节点在信任的分区之中。

注意事项

  • 在选择哪种重启顺序之前,首先考虑一下队列漂移的现象。所谓的队列漂移是在配置镜像队列的情况下才会发生的。
  • 一定要按照这里提及的重启方式重启。若选择挨个节点重启的方式,虽也可以处理网络分区,但是会出现Mnesia 内容权限的归属问题,而且还可能会引起二次网络分区的发生。比如有两个分区[node1,node2]和node3,node4],其中[node1,node2]为信任分区。此时若按照挨个重启的方式进行重启,比如先重启 node3,在node3节点启动之时无法判断其节点的 Mnesia 内容是向[node1,node2]分区靠齐还是向 node4 节点靠齐。至此,如果挨个一轮重启之后,最终集群中的Mnesia 数据是[node3,node4]这个非信任分区,就会造成无法估量的损失。挨个节点重启。

镜像队列漂移现象

漂移现象
  • 若存在镜像队列,从发生网络分区到恢复的过程中队列可能会出现“漂移”的现象。所谓漂移就是队列的master节点都 漂移 到一个节点上,除了发布消息之外,其他操作都在master节点上完成,从而造成负载不均衡。
缓解方法
  • 可以重启之前先删除镜像队列的配置,这样能够在一定程度上阻止队列的 过分漂移,即阻止可能所有队列都 漂移 到一个节点上的情况。
处理方法
  • 第一种,最常见的就是直接在监控页面上删除。
    在这里插入图片描述
    在这里插入图片描述
  • 第二种,若事先没有开启RabbitMQ Management插件,就只能使用rabbitmqctl工具的方式。但是需要在每个分区上都执行删除镜像队列配置的操作,以确保每个分区中的镜像都被删除。比如我这里就要在node1和node2节点上都要执行删除命令,或者在node3和node2节点上执行。
    • 查看命令:rabbitmqctl list_policies
    • 删除命令:rabbitmqctl clear_policy [-p vhost] {mirror_queue_name}
[root@node1 ~]# rabbitmqctl list_policies
[root@node1 ~]# rabbitmqctl clear_policy baimu_policy

在这里插入图片描述

处理流程总结

网终分区处理步骤总结如下:

  • 步骤 1: 先挂起生产者和消费者进程。这样可以减少消息不必要的丢失,若进程数过多情形又比较紧急,也可跳过此步骤。
  • 步骤 2:删除镜像队列的配置。
  • 步骤 3:挑选信任分区。
  • 步骤4:关闭非信任分区中的节点。采用rabbitmqctl stop_app命令关闭。
  • 步骤 5:启动非信任分区中的节点。采用与步骤4对应的rabbitmqctl start_app命令启动。
  • 步骤 6:检查网络分区是否恢复。若已经恢复,则转步骤8;若还有网络分区的报警,则转步骤7。
  • 步骤 7:重启信任分区中的节点。
  • 步骤 8:添加镜像队列的配置。
  • 步骤 9:恢复生产者和消费者的进程。

自动处理网络分区

rabbitmg.config配置文件中配置cluster_partition_handling参数即可实现相应的功能。有三种方法自动地处理网络分区:pause_minority模式pause_if_all_down模式autoheal模式。 默认是ignore模式,即不自动处理网络分区,所以在这种模式下,当网络分区的时候需要人工介入。
在这里插入图片描述

pause_minority 模式

cluster_partition_handling = pause_minority,当发生网络分区时,集群中的节点在观察到某些节点 down 掉的时候,会自动检测其自身是否处于“少数派”(分区中的节点小于或者等于集群中一半的节点数),rabbitmq会自动关闭少数派节点的rabbitmq应用,Erlang虚拟机不关闭。

根据CAP3原理,这里保障了P,即分区耐受性。这样确保了在发生网络分区的情况下,大多数节点(当然这些节点得在同一个分区中) 可以继续运行。少数派中的节点在分区开始时会关闭,当分区结束时又会启动。相当于执行了rabbitmgctl stop_app命令。处于关闭的节点会每秒检测一次是否可连通到剩余集群中,如果可以则启动自身的应用。相当于执行 rabbitmqctl start app 命令

CAP 原理
  • CPA原理,又称之为CAP定理,是指在一个分布式系统中,Consistency(一致性)、Availability(可用性)和Partition tolerance(分区耐受性) 三者不可兼得。
注意事项
  • 若集群中只有两个节点时,不适合采用pause_minority模式。因为其中任何一个节点失败而发生网络分区时两个节点都会关闭。当网络恢复时,有可能两个节点会自动启动恢复网络分区,也有可能仍保持关闭状态。
  • 若集群节点数远大于2个时,采用pause_minority模式比 ignore 模式更加可靠,特别是网络分区通常是由单节点网络故障而脱离原有分区引起的。
  • 若出现对等分区时,会关闭这些分区内的所有节点,只有等待网络恢复之后,才会自动启动所有的节点以求从网终分区中恢复。比如集群组成为[node1,node2,node3,node4]四个节点,由于某种原因分裂成类似[node1,node2]和[node3,node4]这两个网络分区的情形。这种情况在跨机架部署时就有可能发生,当node1和node2 部署在机架 A 上,而 node3 和 node4 部署在机架 B 上,那么有可能机架A与机架B之间网络的通断会造成对等分区的出现。对于[node1,node2]和[node3,node4]而言,这四个节点上的rabbitmq应用都会被关闭。

pause_if_all_down 模式

cluster_partition_handling = pause_if_all_downrabbitmq集群中的节点在和配置检查节点列表中的任何节点不能交互时才会关闭。
在这里插入图片描述
如上图配置表示:

  • 若一个节点与rabbitmq_1@node1或rabbitmq_2@node2节点无法通信时,则会关闭自身的rabbitmq应用。
  • 若是rabbitmq_1@node1或rabbitmq_2@node2本身发生了故障造成网络不可用,而其他节点都是正常的情况下,这种规则会让所有的节点中rabbitmq应用都关闭,待rabbitmq_1@node1rabbitmq_2@node2中的网络恢复之后,各个节点再启动自身应用以从网络分区中恢复。

注意事项:

  • pause_if_all_down模式下有 ignore 和 autoheal 两种配置。若出现对等分区时,node1和node2部署在机架A上,而node3和node4部署在机架B上。而配置里是node1和node3节点名称,那么当机架A 和机架B 的通信出现异常时,由于 nodel 和 node2 保持着通信,node3 和 node4 保持着通信,这 4 个节点都不会自行关闭,但是会形成两个分区,所以这样不能实现自动处理的功能。所以如果将配置中的 ignore替换成 autoheal 就可以处理此种情形。
  • autoheal模式下,如果集群中有节点处于非运行状态,那么当发生网络分区的时候,将不会有任何自动处理的动作。

autoheal 模式

autoheal 模式下,当认为发生网络分区时,rabbitmq会自动决定一个获胜 (winning)的分区,然后重启不在这个分区中的节点来从网络分区中恢复。

获胜分区

一个获胜的分区是指客户端连接最多的分区,若产生一个平局,即有两个或者多个分区的客户端连接数一样多,那么节点数最多的一个分区就是获胜分区。若此时节点数也一样多,将以节点名称的字典序来挑选获胜分区。

总结

对于 pause-minority 模式,关闭节点的状态是在网络故障时,也就是判定出 net_tick_timeout之时,会关闭“少数派”分区中的节点,等待网络恢复之后,即判定出网络分区之后,启动关闭的节点来从网络分区中恢复。 autoheal 模式在判定出 net_tick_timeout之时不做动作,要等到网络恢复之时,在判定出网络分区之后才会有相应的动作,即重启非获胜分区中的节点。

各模式优缺点

  • ignore模式:发生网络分区时,不做任何动作,需要人工介入。
  • pause-minoriy模式:对于对等分区的处理不够优雅,可能会关闭所有的节点。一般情况下,可应用于非跨机架、奇数节点数的集群中。
  • pause-if-all-down模式:对于受信节点的选择尤为考究,尤其是在集群中所有节点硬件配置相同的情况下。此种模式可以处理对等分区的情形。
  • autoheal模式:可以处于各人情形下的网络分区。但是如果集群中有节点处于非运行状态,则此种模式会失效。

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

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

相关文章

一、LRU缓存

LRU缓存 1.LRU缓存介绍2.LRU缓存实现3.LRU缓存总结3.1 LRU 缓存的应用3.2 LRU 缓存的优缺点 1.LRU缓存介绍 LRU是Least Recently Used 的缩写&#xff0c;意为“最近最少使用”。它是一种常见的缓存淘汰策略&#xff0c;用于在缓存容量有限时&#xff0c;决定哪些数据需要被删…

【大前端vue:组件】鼠标上移 出现动画

【大前端vue&#xff1a;组件】鼠标上移 出现动画 <template><div class"view-introduction-culture"><div class"culture-wrapper"><h2 class"culture-title">鼠标上移&#xff1a;展示动画 显示出来</h2><di…

解决电脑网速慢问题:硬件检查与软件设置指南

电脑网速慢是许多用户在使用过程中常见的问题&#xff0c;它不仅会降低工作效率&#xff0c;还可能影响娱乐体验。导致电脑网速慢的原因多种多样&#xff0c;包括硬件问题、软件设置和网络环境等。本文将从不同角度分析这些原因&#xff0c;并提供提高电脑网速的方法。 一、检查…

快速本地化部署 OnlyOffice服务 ( Linux+Docker)

文章目录 一、OnlyOffice介绍&#x1f4d6;二、集成OnlyOffice&#x1f9e9;2.1 环境准备&#x1f5a5;️2.2 搜索镜像2.3 拉取镜像2.4 查看镜像2.5 创建容器2.6 进入容器配置2.7 重启服务2.8 添加字体字号2.9 测试OnlyOffice服务 三、在线预览office文档四、Cpolar内网穿透 一…

Leecode刷题C++之形成目标字符串需要的最少字符串数①

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; class Solution { public:int minValidStrings(vector<string>& words, string target) {auto prefix_function [](const string& word, const string& target) -> vector<…

51c嵌入式~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11529950 一、不同的电平信号的MCU怎么通信 “电平转换”电路 ​ 先说一说这个电路的用途&#xff1a;当两个MCU在不同的工作电压下工作&#xff08;如MCU1 工作电压5V&#xff1b;MCU2 工作电压3.3V&#xff09;&#xf…

2024年第十五届蓝桥杯青少组C++国赛—割点

割点 题目描述 一张棋盘由n行 m 列的网格矩阵组成&#xff0c;每个网格中最多放一颗棋子。当前棋盘上已有若干棋子。所有水平方向或竖直方向上相邻的棋子属于同一连通块。 现给定棋盘上所有棋子的位置&#xff0c;如果要使棋盘上出现两个及以上的棋子连通块&#xff0c;请问…

Java线程池解读

Java 线程池是一个提供多线程管理和调度的工具&#xff0c;通常用来处理多个并发任务。线程池能够帮助有效管理线程的创建、调度、执行和销毁&#xff0c;避免频繁的线程创建和销毁&#xff0c;提高系统性能。 前言 Java 线程池是面试中的常客&#xff0c;面试官经常会问线程…

如何为IntelliJ IDEA配置JVM参数

在使用IntelliJ IDEA进行Java开发时&#xff0c;合理配置JVM参数对于优化项目性能和资源管理至关重要。IntelliJ IDEA提供了两种方便的方式来设置JVM参数&#xff0c;以确保你的应用程序能够在最佳状态下运行。本文将详细介绍这两种方法&#xff1a;通过工具栏编辑配置和通过服…

【CC2530开发基础篇】继电器模块使用

一、前言 1.1 开发背景 本实验通过使用CC2530单片机控制继电器的吸合与断开&#xff0c;深入了解单片机GPIO的配置与应用。继电器作为一种常见的电气控制元件&#xff0c;广泛用于自动化系统中&#xff0c;用于控制大功率负载的开关操作。在本实验中&#xff0c;将通过GPIO口…

通过解调使用正则化相位跟踪技术进行相位解包裹

1. 绪论 光学计量学通常使用光学干涉仪来测量各种物理量。1,2 根据应用的不同&#xff0c;可以使用多种类型的干涉仪&#xff0c;但它们的共同目标是产生一个由被测物理量调制的条纹图案。使用这种光束编码程序可以检测到的物理量范围非常广&#xff1a;深度测量、应变分析、温…

数字图像处理技术期末复习

1. 已知图像的分辨率和深度&#xff0c;怎么求图像的存储空间&#xff08;位&#xff0c;字节&#xff0c;KB&#xff09;&#xff1f; 题目&#xff1a; 已知图像的分辨率和深度&#xff0c;怎么求图像的存储空间&#xff08;位&#xff0c;字节&#xff0c;KB&#xff09;&a…

Elasticsearch 架构及 Lucene 索引结构原理入门

文章目录 Elasticsearch 整体架构Lucene 索引结构Lucene 倒排索引核心原理倒排索引倒排表&#xff08;Posting List&#xff09; Elasticsearch 整体架构 一个 ES Index 在集群模式下&#xff0c;有多个Node&#xff08;节点&#xff09;组成&#xff0c;每个节点就是ES的 inst…

人脸检测的若干思考!!!

1.目前主要有人脸检测方法分类&#xff1f; 主要包含两类&#xff1a;传统人脸检测算法和基于深度学习的人脸检测算法。 传统人脸检测算法主要可以分为4类&#xff1a; 基于知识、模型、特征和外观的人脸检测方法&#xff1b; 基于深度学习的方法&#xff1a;基于级联CNN的人脸…

突破时间与空间限制的富媒体百宝箱——智能工具箱:让云上内容生产更easy

“这是你的同款日常吗&#xff1f;老是在赶deadline&#xff0c;苦练PS还未出师&#xff0c;premiere、达芬奇真的好难&#xff0c;学python脑容量确实不够~打工人太难了~~” 来试试智能工具箱吧&#xff01;即来即用&#xff0c;一键实现办公自由。图片工具、视频工具、音频工…

el-table打印PDF预览,表头错位的解决方案

文章目录 背景与需求需求分析解决方案方案一&#xff1a;vue-print-nb插件安装引入使用 方案二安装使用 方案三 总结 背景与需求 本例以vue2项目为例&#xff0c;vue3与react等同理。 有个项目需要打印的功能&#xff0c;网页使用vue2写的&#xff0c;主体内容为表格el-table&a…

【算法day16】二叉树:搜索二叉树的修剪与构建

题目引用 修剪二叉搜索树将有序数组转换为二叉搜索树把二叉搜索树转换为累加树 1. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在…

java中File类

1、介绍 File类定义了一些与平台无关的方法来操作文件&#xff0c;可以通过调用File类中的方法&#xff0c;实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息&#xff0c;如文件所在的目录、文件长度、文件读写权限等。数据流可以将数据写入到文…

金碟中间件-AAS-V10.0安装

金蝶中间件AAS-V10.0 AAS-V10.0安装 1.解压AAS-v10.0安装包 unzip AAS-V10.zip2.更新license.xml cd /root/ApusicAS/aas# 这里要将license复制到该路径 [rootvdb1 aas]# ls bin docs jmods lib modules templates config domains …

易语言OCR证件照文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…