1.1 elasticsearch分布式集群基本搭建(centos7.x + elaticsearch7.11.1)

news2024/11/15 13:38:49

【1】分布式分片集群基础概念

【1.1】ES的分布式集群有什么用?

高可用

  高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。

负载均衡

  将流量均衡的分布在不同的节点上,每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现平衡。

高性能

  将流量分发到不同机器,充分利用多机器多CPU,从串行计算到并行计算提供系统性能。

【1.2】ES的分布式集群是怎么一个概念和形式?

集群(cluster): 由一个或多个节点组成, 并通过集群名称与其他集群进行区分

节点(node): 单个 ElasticSearch 实例. 通常一个节点运行在一个隔离的容器或虚拟机中

索引(index): 在 ES 中, 索引是一组文档的集合

分片(shard): 因为 ES 是个分布式的搜索引擎, 所以索引通常都会分解成不同部分, 而这些分布在不同节点的数据就是分片. ES自动管理和组织分片, 并在必要的时候对分片数据进行再平衡分配, 所以用户基本上不用担心分片的处理细节.

副本(replica): ES 默认为一个索引创建 5 个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由 5 个主分片成本, 而每个主分片都相应的有一个 copy。对于分布式搜索引擎来说, 分片及副本的分配将是高可用及快速搜索响应的设计核心.主分片与副本都能处理查询请求,它们的唯一区别在于只有主分片才能处理索引请求.副本对搜索性能非常重要,同时用户也可在任何时候添加或删除副本。额外的副本能给带来更大的容量, 更高的呑吐能力及更强的故障恢复能力。

  

【2】节点角色的概念

Master Node

主要负责集群中索引的创建、删除以及数据的Rebalance等操作。Master不负责数据的索引和检索,所以负载较轻。当Master节点失联或者挂掉的时候,ES集群会自动从其他Master节点选举出一个Leader。为了防止脑裂,常常设置参数为discovery.zen.minimum_master_nodes=N/2+1,其中N为集群中Master节点的个数。建议集群中Master节点的个数为奇数个,如3个或者5个。

设置一个几点为Master节点的方式如下:

node.master: true
node.data: false 
node.ingest: false 
search.remote.connect: false

Data Node

主要负责集群中数据的索引和检索,一般压力比较大。建议和Master节点分开,避免因为Data Node节点出问题影响到Master节点。
设置一个几点为Data Node节点的方式如下:

node.master: false
node.data: true
node.ingest: false
search.remote.connect: false

Coordinating Node

负责接收Client 的请求,将请求分发到合适的节点,最终把结果汇集到一起
每个节点默认都起到了Coordinating Node的职责

Ingest Node

Ingest node专门对索引的文档做预处理,实际中不常用,除非文档在索引之前有大量的预处理工作需要做。Ingest node设置如下:

node.master: false node.master: false node.master: false
node.data: false
node.ingest: true
search.remote.connect: false

Tribe Node

Tribe Node主要用于跨级群透明访问。但是官方已经不建议使用了,在5.4.0版本以后已经废弃掉了,在7.0的版本中将移除该功能。在5.5版本以后建议使用Cross-cluster search替代Tribe Node。

【3】Node节点组合

  

主节点+数据节点(master+data)

    节点即有称为主节点的资格,又存储数据

node.master: true
node.data: true

数据节点(data)

  节点没有成为主节点的资格,不参与选举,只会存储数据

node.master: false
node.data: true

客户端节点(client)

  不会成为主节点,也不会存储数据,主要是针对海量请求的时候,可以进行负载均衡

node.master: false
node.data: false

【4】ES集群搭建规划与准备工作

【4.1】集群规划表

OS  ES versionIpnode.nameRolecluster.name
CentOS Linux release 7.8.2003 (Core)elasticsearch-7.11.1192.168.175.129:9201node_1node.master=truemy_es
CentOS Linux release 7.8.2003 (Core)elasticsearch-7.11.1192.168.175.129:9202node_2node.data=truemy_es
CentOS Linux release 7.8.2003 (Core)elasticsearch-7.11.1192.168.175.129:9203node_3node.data=truemy_es

【4.2】Centos7.x 系统参数调整(ulimit,vm,jdk,swapping)

参考1 elasticsearch安装-CSDN博客

以root 登录

(1)ulimit

vim /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
* soft stack 65535
* hard stack 65535

es hard memlock unlimited  #单独给es启动账户开 锁定内存页不限制
es soft memlock unlimited   
退出登录重登后生效;su root
(2)vm.max_map_count >= 262144 / Swapping
#vim /etc/sysctl.conf 
#然后在里面加上参数:

vm.max_map_count=2655350
vm.swappiness=1


#保存,然后重新加载参数:
sysctl -p
(3)JAVA1.8+
java --version  检查是否有安装 java,如  

如果没设置 $JAVA_HOME环境变量,就用压缩包中自带的jdk了,也挺好;

【4.3】下载、解压、复制、创建专属ES账户、授权

(1)下载,解压

  官网:Download Elasticsearch | Elastic

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.11.1-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.11.1-linux-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-7.11.1-linux-x86_64.tar.gz.sha512 
tar -xzf elasticsearch-7.11.1-linux-x86_64.tar.gz

(2)复制、创建专属账户、授权

mkdir -p /data/elasticsearch/
groupadd es
useradd es -g es
cp -rp elasticsearch-7.11.1 /data/elasticsearch/elasticsearch1
cp -rp elasticsearch-7.11.1 /data/elasticsearch/elasticsearch2
cp -rp elasticsearch-7.11.1 /data/elasticsearch/elasticsearch3
mkdir -p {/data/elasticsearch/storage/elasticsearch1,/data/elasticsearch/storage/elasticsearch2,/data/elasticsearch/storage/elasticsearch1}
chown -R es:es /data/elasticsearch

【5】配置、安装ES分布式集群

【5.1】配置文件参数释义

(1)基本释义

cluster.name    集群名称,相同名称为一个集群
node.name   节点名称,集群模式下每个节点名称唯一
node.master     当前节点是否可以被选举为master节点,是:true、否:false
node.data   当前节点是否用于存储数据,是:true、否:false
path.data   索引数据存放的位置
path.logs   日志文件存放的位置
bootstrap.memory_lock   需求锁住物理内存,是:true、否:false
bootstrap.system_call_filter    SecComp检测,是:true、否:false
network.host    监听地址,用于访问该es
network.publish_host    可设置成内网ip,用于集群内各机器间通信
http.port   es对外提供的http端口,默认 9200
discovery.seed_hosts    es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
cluster.initial_master_nodes    es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
http.cors.enabled   是否支持跨域,是:true,在使用head插件时需要此配置
http.cors.allow-origin  "*" 表示支持所有域名
discovery.zen.minimum_master_nodes: 2  #最少要有N个节点才能选举出主节点

我们要只需要在之前的基础上,打开配置文件elasticsearch.yml,添加如下三个配置:
cluster.name: my-es   #集群名称
node.name: node-master #主节点名称
node.master: true #当前节点是否可以被选举为master节点,是:true、否:false
discovery.seed_hosts: ["192.168.175.129:9201", "192.168.175.129:9202", "192.168.175.129:9203"]#写入候选主节点的设备地址,在开启服务后可以被选为主节点
cluster.initial_master_nodes: ["node-1"] #初始化一个新的集群时需要此配置来选举master

(2)核心参数

#集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: my-application
#节点名称
node.name: node-1 
#是不是有资格被选举为主节点
node.master: true
#是否存储数据
node.data: true
#最⼤集群节点数
node.max_local_storage_nodes: 3 
#网络地址,0.0.0.0为不限制,还可以为localhost,127.0.01,实际IP地址等
network.host: 0.0.0.0
#实例端⼝
http.port: 9200
#内部节点之间沟通端⼝,默认9300-9305
transport.tcp.port: 9300
#es7.x 之后新增的配置,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点,注意这个是 transport.tcp.port 端口,而不是 http.port
discovery.seed_hosts: ["localhost:9300","localhost:9400","localhost:9500"]
#es7.x 之后新增的配置,初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node-1", "node-2","node-3"] #数据和存储路径
discovery.zen.minimum_master_nodes: 2  #最少要有N个节点才能选举出主节点
path.data: /Users/louis.chen/Documents/study/search/storage/a/data 
path.logs: /Users/louis.chen/Documents/study/search/storage/a/logs  

【5.2】修改配置文件

vim /data/elasticsearch/elasticsearch1/config/elasticsearch.yml
vim /data/elasticsearch/elasticsearch2/config/elasticsearch.yml
vim /data/elasticsearch/elasticsearch3/config/elasticsearch.yml

(1)9201 - node1

#-----cluster-----
cluster.name: my_es #集群名称
  #gateway.recover_after_nodes: 3 #至少恢复3个节点及以上,集群节点才可以被访问

#-----node-----
node.name: node_1  #节点名称
node.master: true  #该是否可被选举为主节点
node.data: true    #该节点是否可成为数据节点
node.max_local_storage_nodes: 5  #集群最大逻辑存储节点数
transport.port: 9301 #集群内部通信端口

#-----data and log------
path.data: /data/elasticsearch/storage/elasticsearch1/data  #生产环境建议把这2个和解压文件夹分离,避免升级丢失数据
path.logs: /data/elasticsearch/storage/elasticsearch1/logs

#-----memory-----
bootstrap.memory_lock: true  #启动锁定内存页,这样就可以避免内存压力从而导致es的内存页被释放掉或被存到交换内存

#-----network-----
network.host: 192.168.175.129  # 网关地址,0.0.0.0为不限制
http.port: 9201

discovery.seed_hosts: ["192.168.175.129:9301", "192.168.175.129:9302", "192.168.175.129:9303"]
cluster.initial_master_nodes: ["node_1", "node_2", "node_3"]

#-----http requests-----
bootstrap.system_call_filter: false
http.cors.allow-origin: "*"
http.cors.enabled: true
http.cors.allow-headers : X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization
http.cors.allow-credentials: true

#-----es operation-----
  #action.destructive_requires_name: true  #删除索引时是否必须要实际索引名

(2)9202 - node_2

#-----cluster-----
cluster.name: my_es #集群名称
  #gateway.recover_after_nodes: 3 #至少恢复3个节点及以上,集群节点才可以被访问

#-----node-----
node.name: node_2  #节点名称
node.master: true  #该是否可被选举为主节点
node.data: true    #该节点是否可成为数据节点
node.max_local_storage_nodes: 5  #集群最大逻辑存储节点数
transport.port: 9302

#-----data and log------
path.data: /data/elasticsearch/storage/elasticsearch2/data  #生产环境建议把这2个和解压文件夹分离,避免升级丢失数据
path.logs: /data/elasticsearch/storage/elasticsearch2/logs

#-----memory-----
bootstrap.memory_lock: true  #启动锁定内存页,这样就可以避免内存压力从而导致es的内存页被释放掉或被存到交换内存

#-----network-----
network.host: 192.168.175.129  # 网关地址,0.0.0.0为不限制
http.port: 9202

discovery.seed_hosts: ["192.168.175.129:9301", "192.168.175.129:9302", "192.168.175.129:9303"]
cluster.initial_master_nodes: ["node_1", "node_2", "node_3"] #初始化主节点参与选举的节点,也可以用ip地址的

#-----http requests-----
bootstrap.system_call_filter: false
http.cors.allow-origin: "*"
http.cors.enabled: true
http.cors.allow-headers : X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization
http.cors.allow-credentials: true


#-----es operation-----
  #action.destructive_requires_name: true  #删除索引时是否必须要实际索引名

(3)9203 - node_3

#-----cluster-----
cluster.name: my_es #集群名称
  #gateway.recover_after_nodes: 3 #至少恢复3个节点及以上,集群节点才可以被访问

#-----node-----
node.name: node_3  #节点名称
node.master: true  #该是否可被选举为主节点
node.data: true    #该节点是否可成为数据节点
node.max_local_storage_nodes: 5  #集群最大逻辑存储节点数
transport.port: 9303

#-----data and log------
path.data: /data/elasticsearch/storage/elasticsearch3/data  #生产环境建议把这2个和解压文件夹分离,避免升级丢失数据
path.logs: /data/elasticsearch/storage/elasticsearch3/logs

#-----memory-----
bootstrap.memory_lock: true  #启动锁定内存页,这样就可以避免内存压力从而导致es的内存页被释放掉或被存到交换内存

#-----network-----
network.host: 192.168.175.129  # 网关地址,0.0.0.0为不限制
http.port: 9203


discovery.seed_hosts: ["192.168.175.129:9301", "192.168.175.129:9302", "192.168.175.129:9303"]
cluster.initial_master_nodes: ["node_1", "node_2", "node_3"] #初始化主节点参与选举的节点,也可以用ip地址的

#-----http requests-----
bootstrap.system_call_filter: false
http.cors.allow-origin: "*"
http.cors.enabled: true
http.cors.allow-headers : X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization
http.cors.allow-credentials: true


#-----es operation-----
  #action.destructive_requires_name: true  #删除索引时是否必须要实际索引名

【5.3】启动这3个实例

su -l es -c"/data/elasticsearch/elasticsearch1/bin/elasticsearch -d -p /tmp/elasticsearch1.pid"
su -l es -c"/data/elasticsearch/elasticsearch2/bin/elasticsearch -d -p /tmp/elasticsearch2.pid"
su -l es -c"/data/elasticsearch/elasticsearch3/bin/elasticsearch -d -p /tmp/elasticsearch3.pid"

有几条告警:(可以无需理会)

Future versions of Elasticsearch will require Java 11; your Java version from [/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.el7_9.x86_64/jre] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N

第一行告警是:未来 ES将会使用JAVA11,你当前的JAVA版本是JAVA8;不匹配这个版本,考虑一下使用ES集成的JDK;如果要用集成的JDK,则不要设置 $JAVA_HOME变量;

第二行告警是:OpenJDK 64位服务器VM警告:如果处理器的数量预期从一个增加,那么您应该使用-XX:ParallelGCThreads=N适当地配置并行GC线程的数量

【5.4】核验实例启动情况

curl 192.168.175.129:9201
curl 192.168.175.129:9202
curl 192.168.175.129:9203

 

  

【5.5】查看集群状态 

  • status:集群的状态,red红表示集群不可用,有故障。yellow黄表示集群不可靠但可用,一般单节点时就是此状态。green正常状态,表示集群一切正常。
  • node.total:节点数,这里是3,表示该集群有3个节点
  • node.data:数据节点数,存储数据的节点数,这里是3
  • shards:表示我们把数据分成多少块存储
  • pri:主分片数,primary shards
  • active_shards_percent:激活的分片百分比,这里可以理解为加载的数据分片数,只有加载所有的分片数,集群才算正常启动,在启动的过程中,如果我们不断刷新这个页面,我们会发现这个百分比不断加大

【5.6】查看日志

(可略过,限参考,如果启动不起来之后可以查阅)

less /data/elasticsearch/storage/elasticsearch1/logs/my_es.log 
less /data/elasticsearch/storage/elasticsearch2/logs/my_es.log 
less /data/elasticsearch/storage/elasticsearch3/logs/my_es.log 

【6】配置 kibana

【6.1】修改配置文件kibana.yml

把我们的实例URL 都写入进去;

vim /usr/local/kibana/config/kibana.yml 
elasticsearch.hosts: ["http://192.168.175.129:9201" ,"http://192.168.175.129:9202" ,"http://192.168.175.129:9203"]

结果如下图:  

【7】故障转移过程中的主分片、副本分片的变化(单主分片)

注意,这里是所有的索引都只有默认的1个主分片

【7.1】断开重连一个节点

(1)集群正常时候

最左边的五角星单表该节点是当前的主节点;

  

(2)关掉主节点 node_1后:

   

见后续文章的集群原理,过一段时间后(cluster.join.timeout:默认60秒超时 );

会因为超时,确认Node_1节点加入加入集群超时(或者说是失去连接60S)自动把该节点踢出集群;

而集群其他节点会重新选举主节点,且会把原副本分片转换成主分片,并重新生成副本分片;

  

 (3)重新把节点1 实例加入集群(再次重新分布了副本分片、主分片的位置,我们可以发现 下图和(1)图中的分片位置不一样了)

  由于是新节点加入集群,那么最终它是1s发现一次,所以刚启动好,就秒加进来了;

  在过程中如果一直刷新,发现head插件提供的界面,node_1刚加进来的时候没有分片,然后其他节点会有分片变成紫色,然后紫色的分片就迁移到了新的node_1节点;

   

【7.2】断开两个节点

直接连都连不上了

  

但直接 curl  还证明,单节点是活着的

  

【7.3】添加一个node 节点

(1)新节点实例:修改配置文件

集群名称要一样,node.name 要不一样,discovery.seed_hosts 要包含现有要加入集群的主机信息(最好全加上)

cluster.name: my_es
discovery.seed_hosts: ["192.168.175.131:9301", "192.168.175.131:9302", "192.168.175.131:9303"]

(2)添加后 加入到集群后的数据分片信息(依然是自动分片了)

  

【7.4】为什么分片会自动平衡?

参考官方手册:有自动的平衡设置,但是默认的可能不是最佳实践

  Configuring Elasticsearch - Cluster-level shard allocation and routing settings - 《Elasticsearch v7.9 Reference》 - 书栈网 · BookStack

【错误处理】

(0)各类错误代码表达的含义(429/4xx/500)

  

(1)memory locking requested for elasticsearch process but memory is not locked

解决方法一(关闭bootstrap.memory_lock:,会影响性能):

# vim /etc/elasticsearch/elasticsearch.yml          // 设置成false就正常运行了。

bootstrap.memory_lock: false
 

解决方法二(开启bootstrap.memory_lock:):

1. 修改文件/etc/elasticsearch/elasticsearch.yml,上面那个报错就是开启后产生的,如果开启还要修改其它系统配置文件 

bootstrap.memory_lock: true

2. 修改文件/etc/security/limits.conf,最后添加以下内容。      

es hard memlock unlimited

es soft memlock unlimited

(2)集群节点无法互相发现

es集群配置文件 没有任何问题 但启动后无法互相发现集群节点,需要删除data目录里面的所有文件,然后重新启动所有节点,即可发现。

(3)巨坑,配置文件 discovery.seed_hosts 与 cluster.initial_master_nodes!!

  

(4)折磨了我两天的错误:master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster

curl ip:port/_cat/health?v显示:

  {"error":{"root_cause":[{"type":"master_not_discovered_exception","reason":null}],"type":"master_not_discovered_exception","reason":null},"status":503} 

查看错误日志显示:

[2021-03-11T16:41:13,660][WARN ][o.e.c.c.ClusterFormationFailureHelper] [node_1] master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, 
and this node must discover master-eligible nodes [node_1, node_2, node_3] to bootstrap a cluster: 
have discovered [{node_1}{3D2LMma-SWeX5HjT-C0W_Q}{gYZDUrSfTHW43fYN5gPfgA}{192.168.175.129}{192.168.175.129:9301}{cdhilmrstw}{ml.machine_memory=5967216640, xpack.installed=true, 
transform.node=true, ml.max_open_jobs=20, ml.max_jvm_size=1065025536}]; discovery will continue using [192.168.175.129:9302, 192.168.175.129:9303] from hosts providers 
and [{node_1}{3D2LMma-SWeX5HjT-C0W_Q}{gYZDUrSfTHW43fYN5gPfgA}{192.168.175.129}{192.168.175.129:9301}{cdhilmrstw}{ml.machine_memory=5967216640, xpack.installed=true, 
transform.node=true, ml.max_open_jobs=20, ml.max_jvm_size=1065025536}] from last-known cluster state; node term 0, last-accepted version 0 in term 0

解决:

【参数问题】

(1)主机发现问题

discovery.seed_hosts: ["192.168.175.129:9301", "192.168.175.129:9302", "192.168.175.129:9303"]

transport.port: 9303

=》上面 discovery.seed_hosts 里面的地址,一定是 transport.port 端口(如果该参数没设置,则默认是9300~9400端口,从9300开始使用)

(2)集群初始化主节点

cluster.initial_master_nodes: ["node_1", "node_2", "node_3"] #初始化主节点参与选举的节点,也可以用ip地址的

因为配置了这个,所以必须要半数服务器以上实例节点启动后,才会有主节点,错误信息页会停止报错(这里配置3个,那就需要3/2+1,2个节点启动后,才能开始初始化选举)

所以不要着急,如本案例,至少要有2个ES实例启动后,才会开始初始化选举主节点

(5)为什么我的进程僵死?内推太少,一个空的ES 至少需要1.3-1.5G内存

我之前就是弄了3G的虚拟机玩的,结果启动不起来,直接僵死;查看日志也发现没有动静,ps -ef 直接看不到进程;不过 pid 文件倒是还在

(6)无法发现主机 failure when sending a validation request to node

删除目录下的,data里的数据,里面有个Node目录,里面记录了集群信息

rm -rf /data/elasticsearch/storage/elasticsearch1/data/*
rm -rf /data/elasticsearch/storage/elasticsearch2/data/*
rm -rf /data/elasticsearch/storage/elasticsearch3/data/*

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

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

相关文章

半导体供应链系统在智能时代的主要作用

在智能科技日新月异的今天,半导体作为信息技术的基石,其供应链系统的稳定与高效直接关系到全球科技产业的脉动。智能时代的浪潮下,半导体供应链系统不仅是技术的输送带,更是推动产业创新、促进经济转型升级的关键力量。本文我们就…

将Uni.app打包好的apk放到IIS服务器上的详细流程

第一步:打开IIS服务器,点击MIME类型 第二步:点击添加 第三步:文件扩展名填写:.apk , MIME 类型填写:application/vnd.android.package-archive 第四步:添加成功后重启IIS服务器 第五…

【大模型实战篇】一种关于大模型高质量数据的处理方法-无标注数据类别快速识别及重复数据检测(加权向量-卷积神经网络-聚类算法结合)

1. 背景介绍 大模型的能力很大程度上依赖于高质量的数据,在之前的一篇文章《高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍》中,我们介绍了大模型的数据处理链路,本文继续关注在高质量数据的模块。 本文所要介绍的处理方法&…

C语言课程设计题目(24个选题)

C语言课程设计题目 题目一:职工信息管理系统设计题目二:图书信息管理系统设计题目三:图书管理系统设计题目四:实验设备管理系统设计题目五:西文下拉菜单的设计题目六:学生信息管理系统设计题目七&#xff1…

R包:gplots经典热图

加载R包 # install.packages("gplots")library("gplots")数据 mat <- matrix(rnorm(1200), ncol6)画图1 heatmap.2(xmat)画图2 heatmap.2(xmat, ColvFALSE, dendrogram"row",scale"row",col"bluered",trace"non…

用Python提取PDF表格到Excel文件

在对PDF中的表格进行再利用时&#xff0c;除了直接将PDF文档转换为Excel文件&#xff0c;我们还可以提取PDF文档中的表格数据并写入Excel工作表。这样做可以避免一些不必要的文本和格式带来的干扰&#xff0c;获得更易于分析和处理的表格数据&#xff0c;并方便进行更多的格式设…

uniapp监听滚动实现顶部透明度变化

效果如图&#xff1a; 实现思路&#xff1a; 1、使用onPageScroll监听页面滚动&#xff0c;改变导航条的透明度&#xff1b; 2、关于顶部图片的高度&#xff1a; 如果是小程序&#xff1a;使用getMenuButtonBoundingClientRect获取胶囊顶部距离和胶囊高度&#xff1b; 如果…

List几种遍历方法速度

准备数据 ArrayList<Integer> list new ArrayList<Integer>();for (int i 0; i < 100000000; i) {list.add(i); }1.for循环 for (int i 0; i < list.size(); i) {Integer str list.get(i); }2.for-each循环 for (Integer vo:list) {}3.Lambda list.forEa…

XXl-SSO分布式单点登录框架

概述 下载地址&#xff1a;https://gitee.com/xuxueli0323/xxl-sso 文档地址&#xff1a;https://www.xuxueli.com/xxl-sso/ 概述 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、CookieToken均支持…

工业数据采集系统

一、网页部分代码 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

中国蚁剑(antSword)安装使用

antSword下载 antSword-Loader下载 作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/12 19:35 中国蚁剑&#xff08;AntSword&#xff09;是一款跨平台的开源网站管理工具&#xff0c;旨在满足渗透测试人员的需求。它是一个功能强大的工具&#xff0c;可以帮助用户管理…

这样做PPT也太酷了吧,27.9kstar,适合开发者的ppt工具推荐

1 slidev简介 slidev 是一个基于 Vue 开发的网页演示文稿工具,主要功能是将 Markdown 文档转换为演示幻灯片。 为开发者打造的演示文稿工具 Slidev最大的优势在于整个演示文稿内容的编写采用简单的Markdown格式,这极大降低了创作门槛。我们可以使用VS Code等编辑器高效编写Mar…

Linux centerOS 服务器搭建NTP服务

1&#xff0c;安装 NTP软件 sudo yum -y install ntp2&#xff0c;编辑配置文件 sudo vim /etc/ntp.conf 3&#xff0c;修改配置 在ntp.conf文件中&#xff0c;可以配置服务器从哪些上游时间源同步时间。如果你想让你的服务器对外同步时间&#xff0c;可以去掉restrict d…

js中Fucntion的意义

在js中&#xff0c;我们常常如下方式写函数&#xff1a; function fn(){console.log("这是一个函数."); }; fn(); 在js中&#xff0c;函数本质就是一个对象。 那么&#xff0c;结合我的上一篇文章&#xff1a;通俗讲解javascript的实例对象、原型对象和构造函数以及…

C盘空间不足--WizTree(管理空间)

WizTree&#xff1a;高效的磁盘空间分析工具 在日常使用电脑的过程中&#xff0c;磁盘空间的管理常常成为一个棘手的问题。随着文件的不断增加&#xff0c;我们的硬盘空间逐渐被占满&#xff0c;而这些文件中有很多其实并不重要。为了帮助用户更好地管理磁盘空间&#xff0c;Wi…

CNS-WRFID-01地标卡读写器|写卡器DEMO软件读、写操作说明

CNS-WRFID-01地标卡读写器|写卡器是一款高频读写设备&#xff0c;支持ISO15693协议芯片卡&#xff0c;地标标签读写&#xff0c;支持兴颂系列抗金属|非抗金属RFID标签&#xff0c;如&#xff1a;CNS-CRFID-01、CNS-CRFID-02、CNS-CRFID-03、CNS-CRFID-04、CNS-CRFID-05、CNS-CR…

Vue3 中集成海康 H5 监控视频播放功能

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:Vue-集成海康 H5 监控视频播放功能 目录 一、引言 二、环境搭建 三、代码解析 子组件部分 1.…

Spring项目报错:Public Key Retrieval is not allowed

报错原因&#xff1a; 如图 在你项目的数据库下可以找到该文件 解决方案&#xff1a; 在service-oa模块的application-dev.yml文件中 在红框中改成下面代码&#xff0c;数据库与具体项目保持一致&#xff0c;不一定是我这个&#xff0c;改allowPublicKeyRetrievaltrue String…

支持K歌音箱方案应用的高性能 32 位蓝牙音频应用处理器-BP1048B2

DSP是一类嵌入式通用可编程微处理器&#xff0c;主要用于实现对信号的采集、识别、变换、增强、控制等算法处理&#xff0c;是各类嵌入式系统的“大脑”应用十分广泛。BP1048B2是一款高性能DSP音频数字信号处理器芯片&#xff0c;能实现多种音频功能如混响、均衡、滤波、反馈抑…

Python邮件发送附件:怎么配置SMTP服务器?

Python邮件发送附件如何实现&#xff1f;Python发送带附件邮件&#xff1f; 在自动化和脚本编写中&#xff0c;使用Python发送带有附件的邮件是一个非常实用的功能。AokSend将详细介绍如何配置SMTP服务器&#xff0c;以便在Python中实现邮件发送附件的功能。 Python邮件发送附…