ELK日志系统的搭建

文章目录

  • 简介
  • 软件准备
  • 安装JDK
    • 下载Elasticsearch软件
    • 修改配置信息
    • 创建ElasticSearch运行用户、启动服务
    • 添加防火墙策略
    • ElasticSearch-Head插件安装
  • 安装Kibana
    • 下载软件包
    • 修改配置
    • 启动服务
  • 安装Logstash
    • 安装包下载
    • 安装服务
    • 配置修改
      • 配置pipeline流水线
      • 服务配置文件
    • 启动服务
  • 全流程验证
    • 准备测试用的项目
    • 查看es索引信息
    • 通过kibana来查询展示es中的数据
    • 在已有索引模式的情况,再创建新的索引模式
    • es创建索引的时间的问题
  • 再讲一下,我们测试用到的项目中的日志系统
    • 确保安装包的完整性和合法性
  • 日志采集流程图

简介

ELK是Elasticsearch、Logstash、Kibana的简称,这三者都是开源软件,通常配合使用
Elasticsearch -->存储数据
是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用Java语言编写,能对大容量的数据进行接近实时的存储、搜索和分析操作。
Logstash --> 收集数据
数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置。
Kibana --> 展示数据
数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示。

日志从生成到展示的流程
后端项目(生成日志)–>Logstash(负责收集日志)–> Elasticsearch(将日志插入es储存)–> Kibana(通过界面展示日志)

软件准备

以下安装所需要的软件都在以下链接中:
链接:https://pan.baidu.com/s/1Ejfrx8dajNQ03Sz9OeNgMw 
提取码:x51n

在这里插入图片描述

安装JDK

这个不再多说,不清楚具体怎么安装的,网上有很多教程。
将下载的JDK安装包上传至服务器/data/software目录,然后rpm直接安装JDK:
rpm -ivh /data/software/jdk-8u371-linux-x64.rpm

安装完成后 java -version //查看JDK版本号
在这里插入图片描述
如果没有显示版本信息,去/etc/profile 文件中配置下java环境变量
如果,当前机器已经安装过jdk,也可以跳过。
除了,上面的rpm安装方式,还可以选择.tar.gz的解压缩方式即免安装版本。使用tar -zxvf 包名.tar.gz。然后配置下jdk环境变量。
通过source /etc/profile 使修改的配置立即生效。

下载Elasticsearch软件

链接:https://pan.baidu.com/s/1-L3uLLJs-leR7pv2t9fRjA
提取码:d7de
通过上面的百度地址下载后,上传到/data/software目录下。
或者在cd /data/software 到此目录下。
执行
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.10.tar.gz

解压安装包到/data目录下。
tar -zxvf elasticsearch-6.8.10.tar.gz -C /data
注意:默认是解压到当前目录,可选项 -C ,使用 -C 目录指定解压后的文件夹所在的位置

修改配置信息

解压完成后,ES的目录为/data/elasticsearch-6.8.10
创建数据目录、日志目录:
mkdir -p /data/elasticsearch-6.8.10/data
mkdir -p /data/elasticsearch-6.8.10/logs
注意: -p 选项 可以创建多级目录。路径中的目录没有的话就创建。有的话则忽略。

编辑elasticsearch.yml
vim /data/elasticsearch-6.8.10/config/elasticsearch.yml #配置文件最好编辑前先备份

文件中需要添加或修改的内容如下(配置文件中默认全都是备注掉的,需要添加)
path.data: /data/elasticsearch-6.8.10/data #ES集群数据目录
path.logs: /data/elasticsearch-6.8.10/logs #ES集群日志目录

network.host: 0.0.0.0    #配置0.0.0.0允许其他地址访问
http.port: 9200    		     #对外访问端口
transport.tcp.port: 9300
transport.tcp.compress: true
http.cors.enabled: true    #允许跨域访问
http.cors.allow-origin: "*"

其他配置修改,主要是修改jvm的运行内存大小,可以根据实际情况按需修改
vim /data/elasticsearch-6.8.10/config/jvm.options
修改其中的以下两条,根据实际情况按需修改:
-Xms1g
-Xmx1g

系统参数修改:
vim /etc/security/limits.conf
在末尾增加以下内容:

*                soft    nofile          65536
*                hard    nofile          65536
*                soft    nproc           4096
*                hard    nproc           4096

在这里插入图片描述
修改/etc/sysctl.conf配置:
vim /etc/sysctl.conf
添加如下内容:

vm.max_map_count=655360

修改完成保存生效:
sysctl -p

创建ElasticSearch运行用户、启动服务

由于ES集群不允许root用户运行,需要创建ES运行用户:

# 创建用户组
groupadd es
# 创建用户并添加至用户组
useradd es -g es 
# 更改用户密码(输入 es)
passwd es
密码:es123#

修改目录权限:

sudo chown -R es:es  /data/elasticsearch-6.8.10

-R 选项:表示递归,让其下的所有文件包括目录,及子子文件及子子目录的属主:属组都改为es:es
像上面这样如果是一个目录层级,则从最后的那个目录层开始修改属组和属主
在这里插入图片描述
在这里插入图片描述
像上面这样/data目录只需要x(执行权限就行,也就是可以cd /data/)
切换到es用户

su  es

启动服务:

cd /data/elasticsearch-6.8.10/bin
./elasticsearch -d    #-d是后台启动,第一次启动时可以不加-d,查看启动的日志情况

启动后输入jps可以查看到服务状态
通过jps命令可以看到Elasticsearch的服务进程,其确实是一个java项目。

[root@localhost bin]# jps
40052 Jps
39461 Elasticsearch

通过以下两种方式判断是否服务是否正常

curl http://172.16.57.103:9200/_cat/health?v  #查看状态

或curl http://172.16.57.103:9200 #查看服务情况
在这里插入图片描述
要通过浏览器测试以上两个url 连接,需要关闭虚拟机的防火墙,或者添加访问策略。

添加防火墙策略

直接关闭防火墙太暴力,也不安全
添加防火墙策略

[root@localhost bin]# firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.16.57.17" port protocol="tcp" port="9200" accept" 

解释一下:上面的策略的,接受 ip为172.16.57.17的地址,访问本机9200端口的服务
在这里插入图片描述
注意:–add-rich-rule= “策略内容”
这里的 source address=的值。这里源地址,不是服务端的目的ip地址,而是你打算访问服务端的物理机的地址。我的物理本机地址是:172.16.57.17。
然后让策略立即生效:

[root@localhost bin]# firewall-cmd –reload

在这里插入图片描述
然后在浏览器上执行:http://172.16.57.103:9200 就不会再打转了。会立即返回数据。

然后在浏览器上执行:http://172.16.57.103:9200 就不会再打转了。会立即返回数据。

注意:上面–add是添加策略的意思。改成–remove 就是移除策略意思。

[root@localhost bin]# firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="172.16.57.17" port protocol="tcp" port="9200" accept"

然后让移除的策略立即生效,也是执行下面的命令:

[root@localhost bin]# firewall-cmd --reload

查询防火墙某一策略是否已配置:通过 --query 指令

[root@localhost bin]# firewall-cmd --permanent --query-rich-rule="rule family="ipv4" source address="172.16.57.17" port protocol="tcp" port="9200" accept"

返回:yes,表明已配置。返回no,表明未配置

ElasticSearch-Head插件安装

安装这个插件的目的是可以通过插件提供的web界面功能,可视化的管理(查看/修改)es中的索引信息。
首先安装node.js
注意运行完ES后要切换回root用户
安装依赖:(没安的话就安装)
yum -y install gcc gcc-c++ openssl-devel
下载安装包、解压至/data目录

wget http://nodejs.org/dist/v13.9.0/node-v13.9.0-linux-x64.tar.gz
tar -zxvf node-v13.9.0-linux-x64.tar.gz -C /data

配置Node全局环境变量并生效
vim /etc/profile
#在末尾加入以下内容
export PATH=$PATH:/data/node-v13.9.0-linux-x64/bin
#wq保存退出后,输入命令生效
source /etc/profile
验证,能看到输出版本号信息则成功
在这里插入图片描述
再安装ElasticSearch-Head插件
将网盘上下载的:elasticsearch-head 上传到服务器的 /data目录下
配置修改,vim编辑Gruntfile.js文件

#进入文件夹,编辑文件
cd /data/elasticsearch-head
vim Gruntfile.js
在此处添加内容:
hostname: '0.0.0.0',

在这里插入图片描述
还是 cd /data/elasticsearch-head
编辑_site/app.js文件,搜索9200,修改localhost为ES的访问地址
在这里插入图片描述
安装所需的npm依赖库

npm install phantomjs-prebuilt@2.1.16 --ignore-scripts

然后执行npm install命令进行安装
运行服务

nohup ./node_modules/grunt/bin/grunt server > es-head-start.log 2>&1 &

服务运行后,会启动在9100端口,然后就可以在浏览器中访问查看。
在这里插入图片描述
如果上面这个界面打不开。请在cd /data/elasticsearch-head目录下查看es-head-start.log日志文件。
在这里插入图片描述

安装Kibana

下载软件包

请看开头的百度链接中的软件包kibana-6.8.10-x86_64.rpm。
将软件包上传到服务器的/data/software目录下
或者通过

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.10-x86_64.rpm  

注意: Kibana的版本需要与ElasticSearch版本一致

安装服务

rpm -ivh kibana-6.8.10-x86_64.rpm

修改配置

修改配置文件,rpm方式安装的kibana配置文件路径是/etc/kibana/kibana.yml
vim /etc/kibana/kibana.yml
文件里面的配置默认是全部注释掉的,我们需要添加如下内容:

# 服务端口
server.port: 5601
# 服务器ip  本机
server.host: "0.0.0.0"
# Elasticsearch 服务地址
elasticsearch.hosts: ["http://localhost:9200"] #如果kibana和es在同一台机器可以,这里可以使用localhost。
# 设置语言为中文
i18n.locale: "zh-CN"

:配置文件中默认注释掉的内容里有很多配置,例如ES的登录用户密码配置等,如有需要可以按需配置。

启动服务

systemctl start kibana  	#启动
systemctl status kibana		#查看状态
systemctl enable kibana    #设置开机自启

服务启动后,稍等一两分钟,然后就可以在浏览器中访问5601端口就可以看到界面了。
在这里插入图片描述

安装Logstash

安装包下载

百度网盘上找logstash-6.8.10.rpm 软件包。
或者
cd /data/software
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.10.rpm

安装服务

rpm -ivh logstash-6.8.10.rpm

配置修改

进入cd /etc/logstash/
在这里插入图片描述

配置pipeline流水线

修改pipelines.yml配置文件
在这里插入图片描述
发现它里面引用的是/etc/logstash/conf.d目录下.conf文件。
这是rpm方式安装的造成的。
但是进入此目录却发现是空的。需要从上层目录下拷贝一份配置文件。
#复制配置文件模板到/etc/logstash/conf.d目录下

cp /etc/logstash/logstash-sample.conf /etc/logstash/conf.d/logstash.conf
vim /etc/logstash/conf.d/logstash.conf

配置内容因人而异,可以按项目进行相关的配置,模板及部分配置项如下:

input {#beats {#  port => 5044#}tcp {mode => "server"host => "0.0.0.0"port => 9600codec => json_lines}
}output {stdout{codec => rubydebug}elasticsearch {hosts => ["http://localhost:9200"]#index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"#user => "elastic"#password => "changeme"}
}

上面的流水线配置先按这样来,后面再具体说里面的参数
在这里插入图片描述

服务配置文件

Logstash服务自身的配置文件路径为/etc/logstash/logstash.yml,包含了端口、进程大小限制、日志文件路径等配置内容,可以按需进行配置。默认端口为9600。
vim /etc/logstash/logstash.yml
#这里采用默认的方式,不修改。

启动服务

systemctl start logstash     #启动
systemctl enable logstash    #设置开机自启
systemctl status logstash    #查看状态

查看端口监听状态
netstat -nlp | grep :9600
在这里插入图片描述
还可以通过 jps命令 查看 logstash 和 es 一样都是java项目
在这里插入图片描述

全流程验证

ELK平台的部署已经全部结束了,接下来可以做一次全流程的验证测试。

准备测试用的项目

目的用来生产日志数据
从百度网盘链接里找到:StarterApi.rar
下载下来解压后导入IDEA中
在这里插入图片描述
在这里插入图片描述
这里为了简单起见,我们不采用docker容器进行部署了。
启动类是:
在这里插入图片描述
和Logstash相关的日志配置文件:
logback.xml
在这里插入图片描述
在这里插入图片描述
把配置文件中的mysql,redis服务地址都配上。
在数据库上首先手动创建一个数据库为starter。然后运行项目时,通过flyway,自动把数据库脚本初始化到starter里了。
这里说下如果通过ideal 进行编译打包。
在这里插入图片描述
没有报错的话,会在target目录下看到下面红框里的jar包,然后把这个jar包上传到服务器上。
在这里插入图片描述
将这个jar包 上传到 /data/ project 目录下:
进入/data目录里,执行以下命令:

java -Dfile.encoding=utf-8 -jar ./project/api-0.0.1-SNAPSHOT.jar > /dev/null & 

通过jps命令查看服务是否已启动
在这里插入图片描述
数据库里的表和数据也都随着项目的启动通过flyway创建好了。
在这里插入图片描述
在这里插入图片描述

查看es索引信息

curl '172.16.57.103:9200/_cat/indices?v'

在这里插入图片描述
或者通过可视化的插件界面来查看:Chrome浏览器:http://172.16.57.103:9100
在这里插入图片描述
确认es中有日志数据后。

通过kibana来查询展示es中的数据

在kibana中,必须拥有默认索引模式,才能从es中检索数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在已有索引模式的情况,再创建新的索引模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在默认的索引模式就切换过来了:如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

es创建索引的时间的问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将时间戳转为具体的时间后,可以发现
索引logstash-2023.07.11 的创建时间为2023-07-11 12:07:08
因为它是我们首次启动logstash后,第一次logstash和es建立联系时es创建的。
索引logstash-2023.07.12 的创建时间为北京时间2023-07-12 08:00:00。

可以看出从第二天开始es创建索引的时间是北京时间早上08:00。
原因分析如下:
在这里插入图片描述
解决方案:
1、索引的创建时间或日志写入es的时间是根据默认的"@timestamp"字段来创建写入的,所以直接给"@timestamp"加上8小时即可;这样,索引生成的时间就是00:00了。
修改vim /etc/logstash/conf.d/logstash.conf
添加以下内容:

filter {date {match => ["log_time", "yyyy-MM-dd HH:mm:ss.SSS"]target => "@timestamp"}ruby { code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"}ruby { code => "event.set('@timestamp',event.get('timestamp'))"}mutate {remove_field => ["timestamp"]}}
}

在这里插入图片描述
修改后观察第二天索引的创建时间戳已正常改为凌晨00:00。
2、 还有一点是需要将kibana的显示时间改为UTC,默认kibana是自动根据@timestamp字段按照浏览器"Browser"的时间所在时区来的,这样会导致我们现在的时间+8小时;当改为UTC后+8h正好符合我们现在的时间。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果上面不指定UTC,而是默认的Browser的话,如果当前时区为东八区,那么kibana根据索引从es中查到的时间数据都+8小时。那么会出现比我们时间的北京时间超了8小时。所以这里选择UTC。相当于这里直接展示在插入ES时提前增加8小时后的那个时间了,也就是我们的北京时间了。

再讲一下,我们测试用到的项目中的日志系统

测试所用的springboot项目里的,application.yml文件
里面的注释是自己添加的。
在这里插入图片描述
max-size值可以设置大些,这里为了演示效果设置成了7KB,一般设置成10MB。
在这里插入图片描述
这里的.gz文件,超过7天的。只有在项目启动时,项目日志系统会定时去logs目录下扫描哪些符合被删除的归档文件。

我们这个项目的。日志 即在控制台打印,也保存到本地文件里,还把要日志传输到Logstash里。保存到本地文件里一份的这个也是必须的。因为把日志传输到Logstash端可能会失败,防止日志丢失。所以本地也要保存一份日志。

Logstash是怎么收集日志的,是和里面的logback.xml文件有关。
在这里插入图片描述
在application.xml中添加此配置路径,使配置生效

logging:config: classpath:logback.xml

我们的logback.xml里没有指定logbash收集到的日志的日志格式。那么就采用默认的日志格式。
Logstash不仅可以获取实时日志。还可以从指定的日志文件里读取离线日志。
在这里插入图片描述
在input里添加上红框里的内容。然后重启Logstash。
但是有一点是。它会把读取的一条日志全部赋值给,message字段。
这里就要用到filter过滤器,对input进来的日志进行切割处理。
Logstash 里的 主要的三个组件就是:

input{.....
}filter{.....
}output{.....
}

日志的流程处理顺序 input –-> filter – > output.
在这里插入图片描述
在这里插入图片描述

确保安装包的完整性和合法性

针对于RedHot下的CnetOS7:
下面分别说下常见的软件以下几种安装方式的校验合法性:
1.rpm -ivh 包全名/网络路径地址,
2.yum -y install 包名
3.还有一种是.tar.gz格式的。先wget 下载到本地再解压。(有可能是源码,也有可能是编译后的免安装的压缩版)
先说第一种:
在这里插入图片描述
我们先通过wget 命令把kibana-6.8.10-x86_64.rpm下载到服务器。
然后执行 rpm -ivh 进行安装
在这里插入图片描述
上面在安装时提示:
warning: kibana-6.8.10-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
或rpm -ivh 包的网络路径 #下载并安装
在这里插入图片描述
报 警告:/var/tmp/rpm-tmp.0SYa24: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
都是因为:我们的服务器端没有导入对应的公钥。
解决办法:
下载并安装签名公钥:

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

也可以 先 通过 wget https://artifacts.elastic.co/GPG-KEY-elasticsearch 把公钥文件GPG-KEY-elasticsearch下载到服务器。
然后在此公钥文件所在目录执行 rpm --import GPG-KEY-elasticsearch。
说明一下:这个公钥是elastic所有部署包,这里就是说的rpm包,所共享的。
如果验证公钥已经导入成功了。

rpm -V 验证安装软件的修改 –这个我们先不用

rpm -K 验证软件包的数字签名 先导入机器的秘钥,再验证
在这里插入图片描述
在没有导入对应的rpm包的公钥时,使用rpm -K校验时就报上面这个问题。
或者在安装时警告提示上面的NOKEY。
使用上面的说的命令导入公钥后:
在这里插入图片描述
或者选择直接安装试试:
在这里插入图片描述

[root@localhost /]# wget https://artifacts.elastic.co/GPG-KEY-elasticsearch #下载下来

在这里插入图片描述
第二种通过 yum -y install kibana ,这种方式从yum源里获取资源。如果yum源里没有kibana软件包。
在这里插入图片描述
还有一个问题,如何保证这种安装时安装包的合法性。
官方给出的解决方法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装中会验证,没问题就没有提示。若有问题,会给出提示。
和手机上安装app一样。都要验证签名是否有效。

第三种 使用.tar.gz方式安装

在这里插入图片描述
还有一种是通过docker 容器安装的方式。这种方式docker pull 下来镜像到本地后,要对镜像进行验证签名。这个后面遇到再补充。

日志采集流程图

方式一:
在这里插入图片描述
方式二:
在这里插入图片描述
当然也有方式三:
即 Filebeat采集的日志 直接发送到es。中间不使用Logstash。

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

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

相关文章

腾讯云轻量应用服务器和CVM S5服务器有什么区别?

腾讯云轻量应用服务器和CVM云服务器S5有什么不同?性能哪个更好一些?CVM S5云服务器CPU采用2.5GHz主频的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,轻量不支持指定CPU,从功能、内网连通性、集群及公网带宽等方面对…

邂逅JavaScript逆向爬虫-------基础语法篇之面向对象

目录 一、概念二、对象的创建和操作2.1 JavaScript创建对象的方式2.2 对象属性操作的控制2.3 理解JavaScript创建对象2.3.1 工厂模式2.3.2 构造函数2.3.3 原型构造函数 三、继承3.1 通过原型链实现继承3.2 借用构造函数实现继承3.3 寄生组合式继承3.3.1 对象的原型式继承3.3.2 …

并发编程之线程通信及Condition的原理分析

1. synchronized中的线程通信 调用wait方法会使线程处于等待状态&#xff0c;直到另一个线程调用notify线程才会唤醒等待中的某个线程&#xff0c;生产者和消费者模型可以很好的使用到该例子。 生产者代码: public class Producer implements Runnable {private Queue<Str…

虚拟现实(VR)的应用场景

虚拟现实&#xff08;VR&#xff09;技术创建和体验三维虚拟世界的计算机仿真技术。用户通过佩戴VR头显等设备&#xff0c;可以完全沉浸在虚拟世界中&#xff0c;并与虚拟世界中的物体进行交互。VR技术具有广泛的应用前景&#xff0c;可以应用于各行各业。以下是一些VR的应用场…

STM32标准库编程与51单片机直接写寄存器的区别和联系

简介&#xff1a; 在学完51单片机之后&#xff0c;我们去学习32的时候&#xff0c;会发现编程的方法有很大的区别&#xff0c;让人非常的不适应&#xff0c;但是通过不断的调用相应外设的库函数之后&#xff0c;你也可以去编程STM32&#xff0c;来实现功能&#xff0c;但是你真…

SQL的基础语句

1、select语句 select colums from table_name 2、条件语句 #查询出查询出用户id为1和3的用户记录 IN 操作符允许我们在 WHERE 子句中规定多个值。 select * from student where id in (1,3) #查询出所有姓王的同学 模糊查询 like 通配符(% 任意多个字符 _单个字符) #下例…

如何使用渐变块创建自定义聊天机器人

如何使用渐变块创建自定义聊天机器人 文章目录 如何使用渐变块创建自定义聊天机器人一、介绍二、参考示例1、一个简单的聊天机器人演示2、将流式传输添加到您的聊天机器人3、喜欢/不喜欢聊天消息4、添加 Markdown、图像、音频或视频 一、介绍 **重要提示&#xff1a;**如果您刚…

软考高级架构师:AI 通俗讲解负载测试、压力测试、强度测试、容量测试和可靠性测试

在软件工程领域&#xff0c;测试是一个确保软件质量和性能的关键步骤。负载测试、压力测试、强度测试、容量测试和可靠性测试都是性能测试的不同类型&#xff0c;它们的目的和方法有所不同。 下面我将通过简单的比喻和解释&#xff0c;帮助您理解这些测试之间的区别。 负载测试…

跳跃游戏 II (贪心, 动态规划)

题目描述(力扣45题) : 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到…

使用Unity扫描场景内的二维码,使用插件ZXing

使用Unity扫描场景内的二维码&#xff0c;使用插件ZXing 使用Unity扫描场景内的二维码&#xff0c;ZXing可能没有提供场景内扫描的方法&#xff0c;只有调用真实摄像机扫描二维码的方法。 实现的原理是&#xff1a;在摄像机上添加脚本&#xff0c;发射射线&#xff0c;当射线打…

【面试八股总结】Linux系统下的I/O多路复用

参考资料 &#xff1a;小林Coding、阿秀、代码随想录 I/O多路复用是⼀种在单个线程或进程中处理多个输入和输出操作的机制。它允许单个进程同时监视多个文件描述符(通常是套接字)&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者写就绪&#xff09;&#xff0c;能够…

分享三个转换速度快、准确率高的视频转文字工具

想要直接将视频转换成文字&#xff0c;转换工具很重要&#xff01;给大家分享三个转换速度快、准确率高的视频转文字工具&#xff0c;轻松完成转换。 1.网易见外 https://sight.youdao.com/ 网易家的智能转写翻译服务工作站&#xff0c;网页端就可以直接使用&#xff0c;支持视…

Spring Bean依赖注入-Spring入门(二)

1、SpringBean概述 在Spring中&#xff0c;一切Java对象都被视为Bean&#xff0c;用于实现某个具体功能。 Bean的依赖关系注入的过程&#xff0c;也称为Bean的装配过程。 Bean的装配方式有3种&#xff1a; XML配置文件注解Java类 Spring中常用的两种装配方式分别是基于XML的…

Codeforces Round 821 (Div. 2) D2. Zero-One

题目 #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e5 5, inf 1e18, maxm 4e4 5; const int N 1e6;c…

【MySQL】InnoDB与MyISAM存储引擎的区别与选择

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。 存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可被称为表类型。我们可以在创建表的时候&#xff0c;来指定选择的存储引擎&#xff0c;如果没有指定将自动选择默认的存储引擎。…

【工具-PyCharm】

工具-PyCharm ■ PyCharm-简介■ PyCharm-安装■ PyCharm-使用■ 修改主题■ 设置字体■ 代码模板■ 解释器配置■ 文件默认编码■ 快捷键■ 折叠■ 移动■ 注释■ 编辑■ 删除■ 查看■ 缩进■ 替换 ■ PyCharm-简介 官方下载地址 Professional&#xff1a;专业版&#xff0…

python--使用pika库操作rabbitmq实现需求

Author: wencoo Blog&#xff1a;https://wencoo.blog.csdn.net/ Date: 22/04/2024 Email: jianwen056aliyun.com Wechat&#xff1a;wencoo824 QQ&#xff1a;1419440391 Details:文章目录 目录正文 或 背景pika链接mqpika指定消费数量pika自动消费实现pika获取队列任务数量pi…

JavaScript(二)

JavaScript的语法 1.JavaScript的大小写 在JavaScript中&#xff0c;大小写是敏感的&#xff0c;这意味着大小写不同的标识符被视为不同的变量或函数。例如&#xff0c;myVariable 和 myvariable 被视为两个不同的变量。因此&#xff0c;在编写JavaScript代码时&#xff0c;必…

如何在PostgreSQL中创建并使用窗口函数来进行复杂的分析查询?

文章目录 解决方案1. 了解窗口函数的基本概念2. 常用的窗口函数3. 使用示例示例 1&#xff1a;计算每行销售数据的累计销售额示例 2&#xff1a;计算每行销售数据相对于前一行销售额的增长率 结论 PostgreSQL 提供了一套强大的窗口函数&#xff08;Window Functions&#xff09…

MQTT Broker 白皮书:全面实用的 MQTT Broker 选型指南

在智能数字化时代&#xff0c;家居设备、工厂传感器、智能汽车、能源电力计量表等各类设备都已变身为新型的智能终端。为了满足这些海量且持续增长的智能设备之间对于实时、可靠的消息传递的需求&#xff0c;MQTT Broker 消息代理或消息中间件扮演了至关重要的角色。作为新一代…