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

Elasticsearch内核探秘:从Shard分配到网络通信的深度实践指南

#作者:孙德新

文章目录

  • 一、底层模块深入解析之shard allocation
    • 1、shard allocation的介绍
    • 2、cluster level shard allocation介绍
    • 3、disk-based shard allocation介绍
    • 4、shard allocation awareness
    • 5、shard allocation filtering
    • 6、node下线时的shard延迟分配
    • 7、索引恢复的优先级
    • 8、每个节点的shard数量
  • 二、底层模块深入解析之gateway
  • 三、底层模块深入解析之http、network和transport
    • 1、http module
    • 2、network module
    • 3、transport module

一、底层模块深入解析之shard allocation

本文档主要涉及运维相关的elasticsearch底层知识,涉及到的很多参数,主要是给初学者、研发人员等提供一些运维、解决问题的思路。

1、shard allocation的介绍

两种node:master node,data node
master node的一个很重要的功能,比如创建了一个索引,索引有很多的shard,指定了几个primary shard,每个primary shard还有一些replica shard。master node,其实就是决定哪些shard分配给哪些node,以及什么时候在node之间移动shard,来让集群达到rebalance。对于shard allocation而言,有很多设置,都可以控制这个过程:

(1)cluster level shard allocation,可以在集群层面来控制shard allocation和rebalance的过程
(2)disk-based shard allocation,es会在shard分配的时候,考虑可用的磁盘空间
(3)shard allocation awareness,控制shard如何在不同的机架上进行分布
(4)shard allocation filter,可以控制有些node不参与allocation的过程,这样node就可以被安全的下线

2、cluster level shard allocation介绍

shard allocation,就是将shard分配给node的一个过程,这个过程可能会在集群启动初始化进行恢复的时候发生,也会发生在replica shard被分配的时候,集群进行rebalance的时候,或者是有新的node加入,有旧的node被下线的时候。

(1)shard allocation settings
cluster.routing.allocation.enable

all,默认,对所有类型的shard都允许分配
primaries,仅仅允许primary shard被分配
new_primaries,仅仅对新建索引的primary shard允许分配
none,不允许任何shard被分配

这个配置对node重启时本地primary shard的恢复没有影响,重启node的时候,如果本地有一个未被分配的primary shard,还是会立即恢复这个primary shard。

cluster.routing.allocation.node_concurrent_incoming_recoveries:在一个node上允许同时恢复多少个shard,这里的shard recovery过程,指的就是要将某个shard分配给这个node。这个设置的默认值是2.

cluster.routing.allocation.node_concurrent_outgoing_recoveries:一个node上允许同时进行多少个shard recovery outgoing,比如这个node上,有一个primary shard,现在要将replica shard分配给其他的node,那么就是outgoing shard recovery。默认值也是2。

cluster.routing.allocation.node_concurrent_recoveries:同时设置上面两个值。

cluster.routing.allocation.node_initial_primaries_recoveries:如果replica shard recovery通过网络传输来分配,那么一个未被分配的primary shard会在node重启之后使用本地磁盘上的数据,这个过程因为是使用本地的数据,因此会比较快,默认值是4。

*****:cluster.routing.allocation.same_shard.host:默认值是false,如果设置为true,那么就不允许将一个primary shard和replica shard分配到同一个物理机上,也许这个物理机上启动了多个es实例。

如果有一台超级服务器32核CPU+128G内存,例如启动两个es进程,默认情况下,有可能一个shard的primary shard被分配到了这台物理机上的node1,同时这个primary shard的replica shard被分配到了这台物理机上的node2,此时,primary shard和replica shard就在同一台物理机上了。可用性是比较低的,因为如果这台物理机挂掉了,这是不允许的,primary shard和replica shard全部丢失。

(2)shard rebalance settings
rebalance,例如es集群有5台机器,一共有100个shard,负载均衡的情况下,平均分配一下,每个机器上有20个shard。然后此时加入了一台新机器,6台机器了,此时就要触发rebalance操作,重新让整个集群负载均衡,100 / 6 = 16~17个shard每台机器。

cluster.routing.rebalance.enable

all,默认,允许对所有类型的shard进行rebalance过程,一般生产用
primaries,仅仅允许对primary shard进行rebalance过程
replicas,仅仅允许对replica shard进行rebalance
none,不允许对任何shard进行rebalance

cluster.routing.allocation.allow_rebalance

always,任何时候都允许rebalance
indices_primaries_active,仅仅只有在所有的primary shard都被分配之后才允许rebalance
indices_all_active,默认,仅仅允许所有的primary shard和replica shard都被分配之后,才能rebalance

cluster.routing.allocation.cluster_concurrent_rebalance
允许控制多少个shard rebalance的操作同时运行,默认是2

(3)shard balance heuristics
cluster.routing.allocation.balance.shard:设置每个node的shard分配的权重因子,默认是0.45f,提高权重因子,就会尽可能让均匀的shard分配给集群中的所有node。

cluster.routing.allocation.balance.index:定义每个index在一个node上的shard数量因子,默认是0.55f,提高这个参数,就会尽可能让每个index的shard均匀分配到所有的node上。

cluster.routing.allocation.balance.threshold:默认是1.0f,提高这个权重因子会导致集群对shard balance有更小的侵略性。

3、disk-based shard allocation介绍

es在进行shard allocation的时候,会充分考虑每一个node的可用磁盘空间。

cluster.routing.allocation.disk.threshold_enabled:默认是true,如果是false会禁用基于disk的考虑。

cluster.routing.allocation.disk.watermark.low:控制磁盘使用率的低水位,默认是85%,如果一个节点的磁盘空间使用率已经超过了85%,那么就不会分配shard给这个node了。

cluster.routing.allocation.disk.watermark.high:控制磁盘使用率的高水位,默认是90%,如果一个节点的磁盘空间使用率已经超过90%了,那么就会将这个node上的部分shard移动走。

cluster.info.update.interval:es检查集群中每个node的磁盘使用率的时间间隔,默认是30s。

cluster.routing.allocation.disk.include_relocations:默认是true,意味着es在计算一个node的磁盘使用率的时候,会考虑正在分配给这个node的shard。

4、shard allocation awareness

(1)机架感知特性
如果在一个物理机上运行多个虚拟机,并且在多个虚拟机中运行了多个es节点,或者在多个机架上,多个机房,都有可能有多个es节点在相同的物理机上,或者在相同的机架上,或者在相同的机房里,那么这些节点就可能会因为物理机,机架,机房的问题,一起崩溃。如果es可以感知到硬件的物理布局,就可以确保说,priamry shard和replica shard一定是分配到不同的物理机,或者物理机架,或者不同的机房,这样可以最小化物理机,机架,机房崩溃的风险。

shard allocation awareness可以定义es的硬件架构

例如有多个机架,启动一个node就要告诉这个node它在哪个机架上,可以给它一个rack_id,比如下面的命令:./bin/elasticsearch -Enode.attr.rack_id=rack_one,也可以在elasticsearch.yml中设置这个机架id。

cluster.routing.allocation.awareness.attributes: rack_id
node.attr.rack_id=rack_one

上面两行设置里,第一行是设置机架id的属性名称,第二行是用那个机架id属性名称设置具体的机架id。如果启动两个node,都在一个机架上,此时创建一个有5个primary shard和5个replica shard的索引,此时shards会被分配到两个节点上。如果再启动两个node,设置为另外一个机架,此时es会将shard移动到新的node上,去确保说,不会让primary shard和其replica shard在同一个机架上。但是如果机架2故障了,为了恢复集群,那么还是会在恢复的时候,将shards全部在机架1上分配的。

prefer local shard机制:
在执行search或者get请求的时候,如果启用了shard awareness特性,那么es会尽量使用local shard来执行请求,也就是在同一个awareness group中的shard来执行请求,也就是说尽量用一个机架或者一个机房中的shard来执行请求,而不要跨机架或者跨机房来执行请求。可以指定多个awareness属性,比如机架id和机房名称,类似下面:cluster.routing.allocation.awareness.attributes: rack_id,zone

(2)强制性的感知
如果现在我们有两个机房,并且有足够的硬件资源来容纳所有的shard,但是可能每个机房的硬件只能容纳一半shard,不能容纳所有的shard。如果仅仅使用原始的感知特性,如果一个机房故障了,那么es会将需要恢复的shard全部分配给剩下的一个机房,但是剩下的那个机房的硬件资源并不足以容纳所有的shard。强制感知特性会解决这个问题,因为这个特性会绝对不允许在一个机房内分配所有的shard。

比如有一个感知属性叫做zone,有两个机房,zone1和zone2,看看下面的配置:
cluster.routing.allocation.awareness.attributes: zone
cluster.routing.allocation.awareness.force.zone.values: zone1,zone2

那么此时如果将2个node分配给zone1机房,然后创建一个索引,5个primary shard和5个replica shard,但是此时只会在zone1机房分配5个primary shard,只有我们启动一批node在zone2机房,才会分配replica shard

5、shard allocation filtering

shard allocation filtering可以让我们允许或者不允许某些index的shard分配给一些特殊的节点,典型的用途,就是如果要下线一些node,就可以用这个feature禁止shard分配给这些即将下线的node,而且还可以将这些即将下线的节点的shard移动到其他节点。

用下面的命令可以下线一个节点,因为就不允许将shard分配给这个节点了

PUT _cluster/settings
{"transient" : {"cluster.routing.allocation.exclude._ip" : "10.0.0.1"}
}

6、node下线时的shard延迟分配

如果从集群中下线一个节点,master会做下面这些事情:
(1)如果那个节点上有primary shard,那么master会将那些primary shard在其他节点上的replica shard提升为primary shard
(2)分配新的replica shard来保证replica数量充足
(3)在剩下的各个node上进行shard rebalance,确保负载均衡

这些操作可以保护集群不会丢失数据,因为会对每个shard都复制充足的replica shard。但是这个过程,可能会导致集群中出现很重的负载,包括网络负载和磁盘IO负载,如果那个下线的节点只是因为故障被下线,马上就会有新的节点来顶替它,那么这种立即执行的shard recovery过程是不需要的,考虑下面的场景:
(1)某个node跟集群丢失了网络连接
(2)master node将那个node上的primary shard对应的其他节点上的replica shard提升为primary shard
(3)master node分配新的replica shard到其他节点上
(4)每个新的replica shard都会通过网络传输一份primary shard的完整的副本数据
(5)很多shard都被移动到其他的node来让集群rebalance
(6)但是几分钟以后,那个丢失了网络连接的node又重新连接到了集群中
(7)master节点又要再次进行rebalance操作,因为需要将一些shard分配给那个node

其实如果master node也许只要等待几分钟,那么丢失的那个node自己会回来,丢失的shard也会自动恢复过来,因为数据都在节点的本地,不需要重新拷贝数据以及网络传输,过程十分快速。

index.unassigned.node_left.delayed_timeout,这个参数可以设置某个节点下线之后,对应的replica shard被重新复制和分配的时间等待期,默认是1m,可以通过下面的命令来修改:

PUT _all/_settings
{"settings": {"index.unassigned.node_left.delayed_timeout": "5m"}
}

如果启用了delayed allocation之后,那么就会看到下面的场景:
(1)某个node丢失了网络连接
(2)master将那个node上的一些primary shard对应的其他node上的replica shard提升为primary shard
(3)master记录下来一条消息日志,这个primary shard的replica shard还没有重新分配和开始,被delayed了,会等待1m
(4)cluster会保持yellow状态,因为没有足够的replica shard
(5)那个丢失了的node在几分钟之后,如果回到了集群中
(6)缺失的那些replica shard会直接分配给那个node,使用其本地的数据即可

如果某个node确定了肯定不会再回到集群中,那么可以通过下面的命令,手动设置一下,直接不等待那个节点回来了

PUT _all/_settings
{"settings": {"index.unassigned.node_left.delayed_timeout": "0"}
}

7、索引恢复的优先级

没有被分配的shard都是按照优先级来分配的,有下面几个优先级,index.priority,索引的创建日期,索引名称
PUT index_3
{
“settings”: {
“index.priority”: 10
}
}

8、每个节点的shard数量

cluster.routing.allocation.total_shards_per_node,设置每个节点最多承载的shard数量,默认是无限制的

二、底层模块深入解析之gateway

gateway,elasticsearch底层的一个module,是es代码中的一个模块。比如搞java,j2ee,java web,可能有用户管理模块,订单管理模块。。。用户管理模块,就是类似一个module,是用来管理用户信息的。
elasticsearch底层模块,英文,module,类似用户管理模块,订单管理模块,gateway module,是用来进行es自身的一些元数据,比如说cluster state,里面包含了一些集群中有哪些node,每个node的信息,负载,资源,索引,每个索引的shard在各个node上分配的一些信息等等。

gateway module,是负责用来存储每个es节点的cluster state的,node重启的时候,gateway也会负责将本地磁盘上的cluster state给它读取出来,放入内存中

local gateway module,用来存储cluster state,并且在集群重启的时候共享数据

以下的设置,必须在每个master候选节点上都进行设置:
gateway.expected_nodes:要求必须有多少个节点在集群中,当加入集群中的节点数量达到这个期望数值之后,每个node的local shard的恢复就会理解开始,默认的值是0,也就是不会做任何的等待

gateway.expected_master_nodes:要求必须有多少个master node在集群中,只要有这个数量的master node加入了集群,每个node的local shard recovery就会立即开始,默认的值是0

gateway.expected_data_nodes:要求必须有多少个data node在集群中,只要有这个数量的master node加入了集群,每个node的local shard recovery就会立即开始,默认的值是0

gateway.recover_after_time:如果期望的节点数量没有达标,那么会等待一定的时间,然后就开始进行shard recovery,默认是等待5m

如果gateway.recover_after_time时间范围内,指定数量的节点还没有加入集群,但是只要满足下面的条件之一就会立即开始恢复

gateway.recover_after_nodes:只要指定数量的节点加入集群,就开始进行恢复

gateway.recover_after_master_nodes:只要指定数量的master节点加入集群,就开始进行恢复

gateway.recover_after_data_nodes:只要指定数量的data node加入集群,就开始恢复

比如说,集群中一共有10个node
gateway.recover_after_nodes: 8
gateway.expected_nodess: 10
gateway.recover_after_time: 10m

要求集群中达到8个节点,接下来,如果等待超过10分钟那么,就会开始shard recovery,或者是到了8个节点之后,在10分钟之内,立即到了10个节点,那么也会立即开始shard recovery。

三、底层模块深入解析之http、network和transport

elasticsearch的这些底层Module,可以以实际使用和运维等等角度去理解这个es。很多功能和特性,参数,实际上都是围绕着es的一些module展开的。下面系统地梳理一下es的一些底层module。

shard allocation module
gateway module
http module
network module
transport module
其中http,network,transport三个module是最常用的知识和参数

1、http module

HTTP module就是es的http api模块。http机制是完全异步的,线程不会因为等待响应而陷入阻塞,http异步通信机制的优点就是解决了C10k问题。如果可能的话,尽量使用http keep alive,可以提升性能,而且可以避免客户端发生http chunking现象。

下面是一些常用的http设置:
http module,主要是用来对外提供请求接口服务的,向es发送一个rest请求,就是走es的http module的,用来处理外部的请求。

http.port,es对外暴露的http api接口的端口号,默认在9200~9300之间选择一个,优先选择9200,如果被绑定,则选择9201,以此类推。

用curl工具发送http请求,那么其实就是走es的http module,还是http.port设置的http module监听的端口号。默认是http.port就是9200,如果9200被占用,那么就会用9201,以此类推,一直到9300等等。

2、network module

es默认是绑定到localhost的,这只能让es运行在开发模式下,如果要运行在生产模式下,下面的一些network设置是必须设置的。

network.host:节点绑定的hostname或者ip地址,设置之后,才能进入生产模式下。

主要是对一些网络上的基础性的东西进行一个配置
network.host,绑定的是本地的回环地址,127.0.0.1,进入的是development mode,开发模式。如果将network.host,设置为比如192.168.31.187之类的这种hostname或者ip地址之后,进入production mode,生产模式。

3、transport module

transport是用来进行节点间的互相通信的模块。

transport.tcp.port:用于配置节点间互相通信的端口号,默认是9300,范围在9300~9400之间,优先绑定9300,如果被占用,则用9301,以此类推。

transport module,es各个node之间,其实也会进行频繁的通信,比如交换cluster state,reqeust transfer,比如插入一条document,路由之后,应该是到node3的shard2上去处理,但是请求可能发送到的是node1的shard0上,node1就要将这个document index的请求转发给node3,让node3上的shard2去处理这个请求

默认transport.tcp.port端口号是9300,如果被占用,那么就会用9301,一直到9400,以此类推。

相关文章:

Elasticsearch内核探秘:从Shard分配到网络通信的深度实践指南

#作者:孙德新 文章目录 一、底层模块深入解析之shard allocation1、shard allocation的介绍2、cluster level shard allocation介绍3、disk-based shard allocation介绍4、shard allocation awareness5、shard allocation filtering6、node下线时的shard延迟分配7、…...

Vue3 模板语法

目录 一、插值语法 {{ }} 二、核心指令 三、动态属性绑定 四、事件修饰符 五、条件渲染 vs 列表渲染总结 六、最佳实践 示例 1:插值语法 & 基础绑定 示例 2:条件渲染 示例 3:列表渲染 示例 4:事件处理 示例 5&…...

第1节:Backtrader到底是个啥?能干嘛?

——“框架在手,天下我有;不是吹,Backtrader真香警告!” 🐣 一句话简介 Backtrader 是一个 专门为量化交易打造的 Python 回测框架,说白了,它就是一个量化策略“模拟器控制台评审团”&#xff…...

Java基础第21天-正则表达式

正则表达式是对字符串执行模式匹配的技术 如果想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为: 限定符选择匹配符分组组合和反向引用符特殊字符字符匹配符定位符 转义号\\:在我们使用正则表达式去检索某些特…...

【Pandas】pandas DataFrame mod

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

【哈希表】1399. 统计最大组的数目

1399. 统计最大组的数目 - 力扣(LeetCode) 给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。 请你统计每个组中的数字数目&…...

57、Spring Boot 最佳实践

Spring Boot 最佳实践 一. 开发规范与代码风格 编写高质量的代码不仅需要功能的实现,还需要遵循一定的规范和代码风格,以提高代码的可读性、可维护性和协作效率。以下是 Spring Boot 开发中的一些关键规范和代码风格建议。 1. 代码命名规范 在编写代码时,命名是非常重要的…...

Java高级:数据库访问优化

系列文章目录 Java高级部分 JDBC编程 文章目录 系列文章目录前言一、编写属性文件:二、编写DBUtil工具类:三、使用DBUtil工具类:总结 前言 通过我之前发的数据库连接,数据库连接https://blog.csdn.net/2301_81776550/article/det…...

升级xcode16之后react-native-zip-archive不兼容,unsupported option ‘-G‘

问题 升级xcode到16之后,xcode build报错:unsupported option -G for target x86_64-apple-ios13.4-simulator (in target RNZipArchive from project Pods) 出现原因 在 React Native 项目中,当你将 Xcode 升级到 16 后,可能会遇到 RNZipArchive 相关的编译错误,特别是…...

基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告

基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告 目录 基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习&#xff0…...

逻辑漏洞安全

逻辑漏洞是指由于程序逻辑不严导致一些逻辑分支处理错误造成的漏洞。 在实际开发中,因为开发者水平不一没有安全意识,而且业务发展迅速内部测试没有及时到位,所以常常会出现类似的漏洞。 由于开发者/设计者在开发过程中,由于代码…...

基于PaddleOCR对图片中的excel进行识别并转换成word优化(二)

0、原图 一、优化地方 计算行的时候,采用概率分布去统计差值概率比较大的即为所要的值。 def find_common_difference(array):"""判断数组中每个元素的差值是否相等,并返回该差值:param array: 二维数组,其中每个元素是一个…...

5.2.3 WPF 中 XAML 文件 Converter 使用介绍

Converter(转换器)在 WPF 数据绑定中扮演着重要角色,用于在源数据和目标属性之间进行值转换 举例来说:我想用一个bool量来控制一个背景,为true时,显示红色;为false时背景用默认颜色。因此 Backg…...

基于STM32_HAL库的HC-08蓝牙插座项目

基于STM32_HAL库的HC-08蓝牙插座 文章目录 基于STM32_HAL库的HC-08蓝牙插座一、项目需求二、硬件连接三、项目实现3.1 CubeMX配置3.2 以阻塞的方式实现3.3 以中断的方式实现 一、项目需求 通过手机可以控制开发板上的LED或者继电器 二、硬件连接 首先将HC-08蓝牙模块连接到我们…...

SwiftUI 3.Button介绍和使用

SwiftUI 的 Button 是用于触发用户操作的核心交互组件。以下是 Button 的详细介绍和使用示例: 一、基础用法 1. 创建简单按钮 Button("点击我") {print("按钮被点击了") }2. 自定义按钮内容 Button {// 点击动作 } label: {Text("保存&…...

Linux 管道理解

一、什么是管道 1.1 unix中最古老的进程间通信 1.2 一个进程链接到另一个进程的数据流称为“管道”: 图解: 二、管道通信的原理 2.1当我们创建一个进程然后打开一个文件的时候 会经过以下步骤: ①首先要描述这个进程,为这个…...

从并发问题衍生出的Spring的七种事务传播行为

最近在处理一个BPM流程时,遇到了并发问题,原因是事务粒度太大了,导致等待lock超时。今天刚好借此机会分享下Spring框架中提供的7种事务传播行为。 在 Spring中,Transactional 注解支持配置事务的传播行为,用于指定当一…...

第十五届蓝桥杯 2024 C/C++组 艺术与篮球

目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: P10385 [蓝桥杯 2024 省 A] 艺术与篮球 - 洛谷 艺术…...

Python内置函数---bin()

用于将整数转换为二进制字符串 1. 基本语法与参数 bin(x) 参数: x 必须为整数( int 类型),或实现了 __index__() 方法的自定义对象(该方法需返回整数) 。 返回值:以 0b 开头的二进制字符串。…...

网络socks 代理

在系统/终端中设了这样的环境变量,而没有在代码中覆盖,HTTPX 就会启用该 socks 代理。 env | grep proxy https_proxyhttps://proxyhk.zte.com.cn:80 http_proxyhttp://proxyhk.zte.com.cn:80 no_proxylocalhost,127.0.0.0/8,::1,zte.com.cn,zte.intra,…...

【正则表达式】核心知识点全景解析

目录 一、基础语法架构二、核心元字符详解三、高级匹配技巧1. 字符集合2. 分组与引用3. 断言机制 四、Python re模块核心方法五、性能优化策略1. 编译重用2. 避免回溯陷阱3. 选择高效量词 六、典型应用场景1. 数据验证2. 数据提取3. 文本清洗 七、调试技巧宝典1. 可视化调试工具…...

深度学习--ResNet残差神经网络解析

文章目录 前言一、什么是ResNet网络二、传统卷积神经网络存在的问题1、梯度消失和梯度爆炸2、退化问题 三、如何解决问题四、残差结构五、18层残差网络1、解释2、隔层相加优点3、隔层相加数值增大问题 六、18层残差网络以外的表格示例七、BN层(Batch Normalization&…...

数据结构线性表的顺序存储结构

线性表是由零个或多个数据元素组成的有序序列。 特点: 数据元素间是有顺序的; 数据元素的个数是有限的; 一般来说,数据元素的类型是相同的(强类型语言)。c/c是强类型语言,必须指定数据类型。…...

深入解析C++ STL Queue:先进先出的数据结构

一、引言 在计算机科学中,队列(Queue)作为一种遵循先进先出(FIFO)​原则的数据结构,是算法设计和系统开发的基础组件。C STL中的queue容器适配器以简洁的接口封装了底层容器的操作,为开发者提供…...

永磁同步电机控制算法-反馈线性化控制

一、原理介绍 基于非线性系统的精确线性化控制方法,采用精确反馈线性化原理对永磁同步电机进行输入-输出线性化,该方法通过坐标变换和状态反馈将系统的数学模型转变为两个线性子系统,在实现线性化的同时也对系统中电流和转速存在的耦合现象进…...

开源 RAG 引擎:文档理解精准、检索高效、可视化干预灵活,一站式搞定

引言: RAGFlow 是一款基于深度文档理解的开源 RAG 引擎,与 LLM 结合后可实现精准引用问答。它支持 20 多种文档格式解析,配备智能分块策略及混合检索方案,还有可视化干预界面,且支持 Docker 快速部署,堪称…...

URP-UGUI相关知识

一、UGUI的基本组成部分 Canvas (画布)所有UI都需要放在Canvas画布下面,不然无法显示EventSystem 所有的事件响应系统都需要依赖于EventSystem,若删除该组件,交互效果就 不会显示 1.Canvas(画…...

COMSOL多孔结构传热模拟

多孔结构传热模拟涉及对多孔介质内部复杂的热量传递过程进行建模和分析,这类模拟对于优化材料设计、提高能源效率以及解决环境问题等方面具有重要意义。本案例介绍在COMSOL内建立全连通多孔结构几何模型,并将孔隙及基体划分两相材料,进行多孔…...

【CSS】层叠,优先级与继承(四):层叠,优先级与继承的关系

层叠,优先级与继承的关系 前文概括 【CSS】层叠,优先级与继承(一):超详细层叠知识点 【CSS】层叠、优先级与继承(二):超详细优先级知识点 【CSS】层叠,优先级与继承&am…...

CDN加速http请求

一、CDN加速定义 CDN(Content Delivery Network,内容分发网络)是通过全球分布式节点服务器缓存网站内容,使用户就近获取数据的技术。其核心目标是缩短用户与内容之间的物理距离,解决网络拥塞、带宽不足等问题&#xff…...

python实战项目63:获取腾讯招聘信息内容并进行统计分析

python实战项目63:获取腾讯招聘信息内容并进行统计分析 一、需求分析二、流程分析1、获取指定招聘工作类型的目标地址url。2、采集详情页信息。3、保存数据4、完整爬虫代码三、统计分析一、需求分析 本项目的需求是爬取腾讯社会招聘信息网中社会招聘的不同工作类别岗位数据,…...

FlinkUDF用户自定义函数深度剖析

Flink 作为一款强大的流批一体数据处理引擎,其灵活性和扩展性在很大程度上依赖于用户自定义函数(User-Defined Functions, UDF)。UDF 允许开发者根据业务需求扩展 Flink 的核心功能,实现复杂的数据转换、聚合或分析。本文将系统性…...

Python图形界面编程(一)

目录 一、相关的库 1、tkinter库 2、PyQt库 二、图形界面编程要点 三、tkinter控件 1、tkinter控件表 2、tkinter的常用控件 3、tkinter的扩展控件 四、tkinter布局 1、简单示例 2、默认情况下的grid规则 3、调整窗口和网格 (1)调整窗口 &…...

HarmonyOS Grid 网格列表可长按 item 拖动移动位置

方案一 @Component struct WorkCircleCreatePage {// 存储车控列表的数组@State VehicleDoorArr: IVehicleDoor[] = []// 当前移动的Item索引@State CurrentIndex: number = -1// 拖动时显示的数据@State MoveItem: IVehicleDoor = { title: , icon: }// 拖动时放大倍数@State…...

出现 ORA-00904: “TENANT_ID“: 标识符无效 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码的时候,出现如下所示: org.springframework.jdbc.BadSqlGrammarException:</...

榜单持久化

榜单持久化的基本流程是这样的&#xff1a; 创建表 持久化Redis数据到数据库 清理Redis数据 现在&#xff0c;创建表的动作已经完成&#xff0c;接下来就轮到Redis数据的持久化了。持久化的步骤如下&#xff1a; 读取Redis数据 判断数据是否存在 不存在&#xff0c;直接结束…...

璞华ChatBI闪耀2025数博会:对话式数据分析引领数智化转型新范式

4月17日至19日&#xff0c;2025中国&#xff08;武汉&#xff09;数字经济产业博览会在武汉盛大举办&#xff0c;璞华集团携自主研发的“ChatBI自然语言问答式数据分析平台”惊艳亮相。以 "通过对话让数据说话" 为主题&#xff0c;璞华集团在 A3-T8 展位构建了沉浸式…...

力扣DAY63-67 | 热100 | 二分:搜索插入位置、搜索二维矩阵、排序数组查找元素、搜索旋转排序数组、搜索最小值

前言 简单、中等 √ 二分法思路很简单&#xff0c;但是判断边界太麻烦了&#xff01;难道真的要去背模板吗 搜索插入位置 我的题解 循环条件左不超过右&#xff0c;目标大于中间值&#xff08;向下取整&#xff09;时&#xff0c;左中1&#xff0c;小于&#xff0c;右中-1&…...

leetcode-哈希表

哈希表 127. 单词接龙 题目 字典 wordList 中从单词 beginWord 到 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s(1) -> s(2) -> ... -> s(k)&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&#xff0c;每个 s(i) 都在…...

信息技术有限公司项目管理手册

这篇文档是信息技术有限公司的项目管理指导手册&#xff0c;对软件公司项目管理者具有重要价值&#xff0c;主要体现在以下几个方面&#xff1a; 管理全面规范 涵盖内容广&#xff1a;从项目的整体管理到各个具体领域&#xff0c;如范围管理、进度管理、成本管理等&…...

TFTP服务调试

在tftpboot目录下进行sudo minicom 启动内核时 问题&#xff1a;程序启动卡在Loading阶段 原因&#xff1a;tftp协议的问题 、或者网卡配置的问题 解决&#xff1a;1.检查网线是否插好 多试几次 2.检查tftp服务是否正常 在minicom中调试ping pc机的ip地址 2.进入boot调…...

date-picker组件的shortcuts为什么不能配置在vue的data的return中

在 Vue 中&#xff0c;shortcuts 是一个选项&#xff0c;通常用于配置像 date-picker 这样的组件的日期快捷方式。这里有一些原因解释为什么 shortcuts 不应该配置在 data 的 return 中&#xff0c;而是应该配置在 data 的外部&#xff08;例如&#xff0c;直接作为组件的一个属…...

迭代器模式:统一数据遍历方式的设计模式

迭代器模式&#xff1a;统一数据遍历方式的设计模式 一、模式核心&#xff1a;将数据遍历逻辑与数据结构解耦 在软件开发中&#xff0c;不同的数据结构&#xff08;如数组、链表、集合&#xff09;有不同的遍历方式。如果客户端直接依赖这些数据结构的内部实现来遍历元素&…...

RocketMQ 核心架构速览

欢迎光临小站&#xff1a;致橡树 文章现有讲述比较简单&#xff0c;后续逐渐丰富各部分内容。 Apache RocketMQ 作为阿里巴巴开源的一款分布式消息中间件&#xff0c;凭借其高吞吐、低延迟、高可用等特性&#xff0c;成为金融级稳定性场景的首选解决方案。本文将深入剖析 Roc…...

kafka安装、spark安装

kafka简介 Kafka就是一个分布式的用于消息存储的消息队列。 kafka角色 Kafka中存储的消息&#xff0c;被消费后不会被删除&#xff0c;可以被重复消费&#xff0c;消息会保留多长&#xff0c;由kafka自己去配置。默认7天删除。背后的管理工作由zookeeper来管理。 kafka安装 …...

迅为RK3562开发板ARM四核A53核心板多种系统适配全开源

迅为RK3562开发板ARM四核A53核心板多种系统适配全开源 RK3562开发板(2GB内存16GB存储)...

用交换机连接两台电脑,电脑A读取/写电脑B的数据

1、第一步&#xff0c;打开控制面板中的网络和共享中心&#xff0c;如下图配置&#xff0c;电脑A和电脑B均要配置&#xff1b; 注意&#xff1a;要保证电脑A和电脑B在同一子网掩码下&#xff0c;不同的IP地址&#xff1b; 2、在电脑上同时按‘CommandR’&#xff0c;在弹出的输…...

线程入门3

synchronized修饰方法 synchronized可以修饰代码块(在线程入门2中有例子)&#xff0c;也可以修饰普通方法和静态方法。 修饰普通方法 修饰普通方法简化写法&#xff1a; 修饰静态方法 修饰静态方法简化写法&#xff1a; 注意&#xff1a;利用synchronized上锁&#xff0c;锁的…...

【C++】AVL树

目录 一、AVL树的引入 二、AVL树 &#x1f354;AVL树的概念 &#x1f35f;AVL树节点的定义 &#x1f32e;AVL树的插入 &#x1f96a;AVL树的旋转 三、AVL树的验证 四、结语 一、AVL树的引入 &#x1f31f;我们知道 map/multimap/set/multiset 这几个容器的共同点是&#…...

Java大师成长计划之第1天:Java编程基础入门

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 欢迎来到“Java大师成长计划”系列文…...