目录
[4.1、Elasticsearch(ES)部署配置(Version: 8.17.0)](#4.1、Elasticsearch(ES)部署配置(Version: 8.17.0))
elk:日志搜集平台
Elastic Stack ( ELK ) 由 ElasticSearch 、 Logstash 和 Kibana 三个开源工具组成
ELK工作原理展示图
Logstash收集Appserver产生的log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图标再返回给Browser
一、 ElasticSearch介绍 (数据搜索和分析)
ElasticSearch是一个基于Lucene的开源分布式搜索服务。用于处理大规模数据的快速检索和分析,并具有高可扩展性、高性能和强大的全文搜索能力。
1.1、特点
分布式,零配置,自动发现,索引自动分片,索引副本机制等。它提供了一个分布式多用户能力的全文搜索引擎。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。 在elasticsearch中,所有节点的数据是均等的。
1.2、 数据组织方式
索引(库)-->类型(表)-->文档(记录)
1.3、特点和优势
综合来说就是搜索很快,支持多类型数据可以监控可视化,并且有丰富插件,还有就是能够数据冗余高可用
1.3.1、 分布式架构
- 可扩展性:Elasticsearch采用分布式架构,数据存储在多个节点上。可以通过添加新节点轻松扩展集群,处理PB级别的数据。
- 数据冗余与高可用性:支持数据分片和副本机制。当某个节点出现故障时,副本分片可以立即接管工作,确保数据的可用性和搜索服务的正常运行。
1.3.2、 强大的搜索功能
- 全文搜索:基于Lucene构建,提供了非常强大的全文搜索能力。能够理解文本的语义,对文档中的文本内容进行深度分析。
- 实时搜索:能够实时索引新数据并立即用于搜索。
- 复杂查询支持:支持多种复杂的查询类型,如布尔查询、范围查询、模糊查询等。
1.3.3、 数据处理与分析
- 聚合功能:提供强大的聚合功能,可以对数据进行分组、统计和分析。
- 数据关联与嵌套查询:支持处理具有复杂结构的数据,包括数据的嵌套和关联关系。
1.3.4、 多数据类型支持
- 通用数据类型支持:可以处理各种类型的数据,包括文本、数字、日期、地理位置等。
- 非结构化数据处理:尤其擅长处理非结构化数据,如日志文件、文档内容等。
1.3.5、 易用性与生态系统
- 简单的API与RESTful接口:提供了简单易用的API,通过RESTful接口与外部应用进行交互。
- 丰富的插件与集成:拥有丰富的插件生态系统,可以与其他工具和技术进行集成。
1.3.6、 高性能
- 快速搜索:Elasticsearch 优化了搜索速度,能够快速返回搜索结果,即使是在大规模数据集上。
- 高效索引:Elasticsearch 优化了数据索引过程,可以高效地处理大量数据的索引。
1.3.7、 灵活的数据模型
- 无模式(Schema-less):Elasticsearch 是无模式的,这意味着你可以存储结构化、半结构化或非结构化的数据,无需预先定义数据结构。
- 动态映射:Elasticsearch 可以自动检测并映射新的字段,使得数据索引和搜索更加灵活。
1.3.8、 可视化和监控
- Kibana:Elasticsearch 的可视化工具 Kibana 可以轻松创建图表和仪表板,帮助用户直观地理解数据。
- Elasticsearch 监控:提供了监控工具,可以监控集群状态、性能指标等。
1.4、 Elasticsearch核心概念
- Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置来决定的,对于中小型企业刚开始集群就一个节点很正常
- Node:节点,集群中的一个节点,节点也要一个名称(默认是随机分配的),节点的名称很重要(在执行运维管理的时候方便故障排查),默认的节点会加入一个名称为"elasticsearch"的集群,如果直接启动一堆节点,那么它们会自动组成一个"elasticsearch"的集群,当然一个节点也可以组成一个集群。
- Document:文档,ES中最小的数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中都可以存储多个document
- Index:索引,包含一堆相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。
- Type:类型,每个索引里面都可以有一个或多个type,type是index的一个逻辑数据分类,一个type下的document有相同的filed。比如博客系统,有一个索引,一个用户数据type,博客数据type,评论数据type。
- shard:单机服务器无法存储大量数据,ES可以将一个索引中的数据分割为多个shard,分布在多台机器上存储,有了shard就可以横向扩展,存储更多的数据,让搜索和分析操作分布到多台机器上执行,提高吞吐量和性能。
- replica:任何一个服务器都会出现故障,此时shard可能会丢失,因此为每个shard建立多个replica副本,replica可以在shard故障时候提供备用服务
二、 Logstash介绍 (数据处理和日志收集)
Logstash的设计目的是为了简化从各种来源收集、转换和发送数据的过程,使其易于存储、分析和可视化。
2.1、Logstash介绍
Logstash是一个完全开源工具,可以对你的日志进行收集、过滤、分析,并将其存储供以后使用 (如,搜索),logstash带有一个web界面,搜索和展示所有日志。 只收集和过滤日志,和改格式。(就是系统各个服务的日志,可以过滤并分析,还可以搜索指定服务的日志)
简单来说logstash就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景。
Logstash的事件(logstash将数据流中等每一条数据称之为一个event)处理流水线有三个主要角色完成:inputs --> filters --> outputs:
ogstash整个工作流分为三个阶段:输入、过滤、输出。每个阶段都有强大的插件提供支持:
Input (必须),设置数据来源
Filter(可选),负责数据处理与转换
output(必须),负责数据输出
2.2、Logstash的stdin标注输入
input {
stdin {
可选配置,例如添加字段或标签
add_field => { "source" => "standard_input" }
tags => [ "user_input" ]
}
}
Logstash将从标准输入读取数据,并通过add_field添加一个额外的字段source,值为standard_input。tags配置用于添加标签user_input到事件中
filter {
这里可以添加过滤器来处理输入数据
例如,使用grok插件解析日志数据
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
output {
输出处理后的数据到标准输出
stdout { codec => rubydebug }
或者输出到Elasticsearch
elasticsearch {
hosts => ["localhost:9200"]
index => "myindex"
}
}
2.3、Logstash的file输入文件
input {
file {
path => ["/var/log/messages", "/var/log/syslog"]
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb"
stat_interval => 2
}
}
Logstash会监控/var/log/messages和/var/log/syslog文件,从头开始读取文件内容,并将读取位置存储在/var/lib/logstash/sincedb中
参数:
path
指定要监控的文件或文件模式的路径。可以使用通配符来匹配多个文件。
示例:path => "/var/log/*.log"
start_position
指定Logstash开始读取文件的位置。可以是beginning(从头开始读取)或end(从文件末尾开始读取,类似于tail -F)。
示例:start_position => "beginning"
stat_interval
指定Logstash检查文件状态(如文件大小变化)的频率,以秒为单位。
示例:stat_interval => 2
sincedb_path
指定用于存储文件读取位置的数据库路径。Logstash会记录每个文件最后读取的位置,以便在重启后可以从上次中断的地方继续读取。
示例:sincedb_path => "/var/lib/logstash/sincedb"
discover_interval
指定Logstash发现新文件的频率,以秒为单位。
示例:discover_interval => 15
exclude
指定要排除的文件名模式。
示例:exclude => [ "*.gz", "*.zip" ]
ignore_older
指定忽略比指定时间更早的文件。
示例:ignore_older => 86400 (忽略一天前的文件)
2.4、Logstash过滤器值grok正则匹配
%{PATTERN_NAME:FIELD_NAME}
PATTERN_NAME 是预定义的正则表达式模式名称或自定义模式名称。
FIELD_NAME 是捕获的字段名,用于在Logstash事件中存储匹配的数据。
Logstash自带了许多预定义的Grok模式(需要时百度)
使用Grok过滤器解析Nginx访问日志的示例
filter {
grok {
match => { "message" => "%{NGINXACCESS} %{DATA:response_time} %{DATA:upstream_response_time}" }
}
}
%{NGINXACCESS} 是一个预定义的Grok模式,用于匹配Nginx访问日志的常见格式。response_time 和 upstream_response_time 是自定义的字段名,用于捕获响应时间和上游响应时间。
2.5、Logstash过滤器之mutate
Logstash 的 mutate 过滤器是用于对重命名、删除、替换、修改数据类型等进行各种修改操作
filter {
mutate {
convert => { "age" => "integer" } # 将 age 字段转换为整数类型
gsub => [ "message", "\s+", "_" ] # 将 message 字段中的多个空格替换为下划线
split => [ "tags", "," ] # 将 tags 字段根据逗号分隔为数组
rename => { "old_name" => "new_name" } # 将 old_name 字段重命名为 new_name
remove_field => [ "temp_field" ] # 删除 temp_field 字段
add_field => { "new_field" => "new_value" } # 添加一个新字段 new_field,值为 new_value
}
}
2. 6 、Logstash过滤器之GeoIP地址查询
GeoIP库可以根据IP地址提供对应的地域信息,包括国别,省市,经纬度等,对于可视化地图和区域统计非常有用。
单独安装命令
bin/logstash-plugin install logstash-filter-geoip
用例:
filter {
geoip {
source => "src_ip" # 指定包含 IP 地址的字段名
target => "geoip_data" # 指定存储地理位置信息的字段名
database => "/path/to/GeoLite2-City.mmdb" # 指定 GeoIP 数据库的路径
可选的配置参数
add_field => { "[geoip][coordinates]" => "%{[geoip][latitude]},%{[geoip][longitude]}" }
remove_field => ["[geoip][database]" ] # 移除不必要的信息
}
}
geolite库下载地址:https://dev.maxmind.com/geoip/geolite2-free-geolocation-data/
日志数据中有一个字段 src_ip 包含 IP 地址,通过上述配置,Logstash 将会使用 GeoIP 数据库来查询该 IP 地址的地理位置,并将结果存储在 geoip_data 字段中。结果可能包括国家名称 ([geoip][country_name])、城市名称 ([geoip][city_name])、经纬度 ([geoip][latitude] 和 [geoip][longitude]) 等信息。
2. 7 、Logstash过滤器之useragent匹配归类
解析用户代理(User-Agent)字符串,并从中提取有关用户设备的详细信息(操作系统、浏览器类型、版本号等)
安装命令
bin/logstash-plugin install logstash-filter-useragent
用例:
filter {
useragent {
source => "user_agent_string" # 指定包含 User-Agent 字符串的字段名
target => "user_agent_info" # 指定存储解析后信息的字段名
remove_field => ["user_agent_string"] # 可选:移除原始的 User-Agent 字段
}
}
Logstash 将会解析User-Agent字符串,并将结果存储在 user_agent_info 字段中。
2. 8 、Logstash的output配置
Logstash 支持多种输出插件,使得数据可以流向各种不同的系统和服务,如 Elasticsearch、Kafka、文件系统、数据库等。
output {
输出处理后的数据到标准输出
stdout { codec => rubydebug }
或者输出到Elasticsearch
elasticsearch {
hosts => ["localhost:9200"]
index => "myindex"
}
}
2. 9 、Logstash的配置文件
input {
定义输入插件和配置选项
}
filter {
定义过滤器插件和配置选项
}
output {
定义输出插件和配置选项
}
三 、Kibana介绍
Kibana 是一个基于浏览器页面的Elasticsearch前端展示工具,也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮你汇总、分析和搜索重要数据日志
四、ELK部署实战
这里用单节点部署
4.1、Elasticsearch(ES)部署配置(Version: 8.17.0)
4.1.1、Elasticsearch(ES)下载安装
新增repo配置yum源以下载
bash
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
bash
[root@ES ~]# yum install --enablerepo=elasticsearch elasticsearch
jdk下载对应芯片及服务器版本的。(Version: 8.17.0的ES需要17以上)
bash
[root@ES ~]# yum install java-17-openjdk-devel
#设置环境变量
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
[root@ES ~]# java -version
openjdk version "17.0.13" 2024-10-15 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.13.0.11-1) (build 17.0.13+11-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.13.0.11-1) (build 17.0.13+11-LTS, mixed mode, sharing)
4.1.2、Elasticsearch(ES)配置
bash
#创建运行ES的普通用户
[root@ES ~]# useradd users
[root@ES ~]# echo "123456" | passwd --stdin "users"
Changing password for user elasticsearch.
passwd: all authentication tokens updated successfully.
#配置ES
#vim /etc/elasticsearch/elasticsearch.yml
#sed -ri '/^#/d' /etc/elasticsearch/elasticsearch.yml
#没配置集群发现,默认多播(multicast)发现其他集群节点
# 集群名称
cluster.name: elk
# 节点名称
node.name: elk01
# 配置集群的初始主节点
cluster.initial_master_nodes: ["elk01"]
# 角色配置
node.roles: ["master", "data"]
# 数据路径
path.data: /var/lib/elasticsearch
# 日志路径
path.logs: /var/log/elasticsearch
# 是否内存锁定
bootstrap.memory_lock: false
# 网络主机设置
network.host: 0.0.0.0
# HTTP 端口
http.port: 9200
# 启用 CORS
http.cors.enabled: true
# 允许的 CORS 来源
http.cors.allow-origin: "*"
#关闭安全功能
xpack.security.enabled: false
# 禁用 SSL 传输层安全性
xpack.security.transport.ssl.enabled: false
xpack.security.http.ssl.enabled: false
4.1.3、Elasticsearch配置参数解释
|-------------------------------------------|-------------------------------------------|-------------------------------------------------------------------------------|
| 集群设置 | 例cluster.name:my_cluster | |
| | | 集群名称,同一集群节点名称需相同 |
| node.name | node-1 | 节点名称,唯一标识 |
| node.master | true | 节点是否为主节点(8.x已废弃)使用node.roles代替 |
| node.data | true | 节点是否存储索引数据 |
| node.roles | ["master", "data"] | 8.x以上使用。 "master" 角色(参与主节点选举和管理集群状态),"data" 角色(存储和索引数据),"ingest" 角色(处理数据摄入管道) |
| discovery.seed_hosts | ["host1", "host2", "10.211.55.10:9300"] | 集群中用于节点发现 |
| cluster.initial_master_nodes | ["host1", "host2"] | 集群初始化时参与主节点选举节点 |
| discovery.zen.minimum_master_nodes | 2 | 设置选举主节点时需要参与的最少候选节点数。官方推荐(n/2)+1 |
| discovery.zen.ping.timeout | 1s | 节点发现过程中的 ping 超时时间 |
| 网络设置 | | |
| network.host | 0.0.0.0 | 监听网络请求的接口地址 |
| http.port | 9200 | 服务端口号,默认9200 |
| transport.tcp.port | 9300 | TCP 端口号,默认9300 |
| 存储设置 | | |
| path.data | /path/to/data | 索引数据存储路径 |
| path.logs | /path/to/logs | 日志文件存储路径 |
| path.plugins | /path/to/plugins | 插件存放路径(默认是es根目录下的plugins文件夹) |
| 内存设置 | | |
| bootstrap.memory_lock | true | 是否在启动时锁定内存,防止内存交换到磁盘flase为否 |
| ES_JAVA_OPTS | -Xms2g -Xmx2g | Java虚拟机(JVM)的堆内存大小 |
| 索引设置 | | |
| index.number_of_shards | 5 | 新索引默认分片数量 |
| index.number_of_replicas | 1 | 新索引默认的副本数量 |
| 安全设置 | | |
| xpack.security.enabled | true | 是否启用 X-Pack 安全特性 |
| xpack.security.transport.ssl.enabled | true | 是否启用传输层的 SSL 加密 |
| xpack.security.http.ssl.enabled | true | 是否启用 HTTP 层的 SSL 加密 |
| 日志设置 | | |
| logger.org.elasticsearch | INFO | 日志级别,例INFO、DEBUG、TRACE 等 |
| 其他设置 | | |
| bootstrap.system_call_filter | true | 是否允许执行潜在危险的系统调用(已被移除) |
| http.cors.enabled | true | 是否启用跨域资源共享(CORS) |
| http.cors.allow-origin | "*" | 允许跨域请求的来源 |
| cluster.routing.allocation | "all" | 控制分片的分配策略 |
| cluster.routing.allocation.disk.watermark | 85% | 磁盘空间使用阈值 |
| cluster.routing.allocation.balance | "0.45f" | 分片在不同节点之间的平衡策略 |
4.1.4、jvm堆大小配置
内存最小值(Xms)与最大值(Xmx)的大小相同,防止程序在运行时改变堆内存的大小。
堆内存大小不要超过系统内存的50%
bash
[root@ES ~]# vim /etc/elasticsearch/jvm.options
## -Xms4g
## -Xmx4g
4.1.5、系统优化
(重新登录/重启才生效)
[root@ES ~]# vim /etc/security/limits.conf
bash
#每个用户打开的最大文件描述符数量为 65536,超出则警告
* soft nofile 65536
#每个用户打开的最大文件描述符数量为 131072,超出则操作失败
* hard nofile 131072
#每个用户创建的最大进程数量为 2048,超出则警告
* soft nproc 2048
#每个用户创建的最大进程数量为 4096,超出则操作失败
* hard nproc 4096
4.1.6、启动ES
bash
设置文件权限
chown -R elasticsearch:elasticsearch /etc/elasticsearch
chown -R elasticsearch:elasticsearch /var/lib/elasticsearch
chown -R elasticsearch:elasticsearch /var/log/elasticsearch
为前面创建的普通用户添加访问权限
[root@ES ~]# usermod -aG elasticsearch useres
[root@ES ~]# id useres
uid=1001(useres) gid=1001(useres) groups=1001(useres),979(elasticsearch)
切换为普通用户
[root@ES ~]# su - useres
[useres@ES ~]$ systemctl start elasticsearch.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ====
Authentication is required to start 'elasticsearch.service'.
Authenticating as: admin
Password:
==== AUTHENTICATION COMPLETE ====