ELK安装
1.环境准备
OS: CentOS Linux release 7.9.2009 (Core)
机器:10.39.9.11
ES、Kibana、logstash安装包官网下载地址:
logstash-8.8.2-x86_64.rpm
elasticsearch-8.8.2-x86_64.rpm
kibana-8.8.2-x86_64.rpm
提前将安装包放至/opt目录下。
ES插件:
ES本身提供插件安装,常见插件:
-
IK中文分词器插件
:https://github.com/medcl/elasticsearch-analysis-ik/releases -
拼英分词器插件
:https://github.com/medcl/elasticsearch-analysis-pinyin/releases
如果安装的ES除单纯记录日志外,还有上面插件使用需求,可以选择安装,下面安装ES过程中一并介绍如何安装插件。
注意,下载插件时,请与安装的ES版本保持一至 ,当前ES安装版本为8.8.2,那么下载的插件版本也要为8.8.2。
同样,将插件安装包提前放至/opt目录下。
安装包及插件包:
/opt
├── elasticsearch-8.8.2-x86_64.rpm
├── elasticsearch-analysis-ik-8.8.2.zip
├── elasticsearch-analysis-pinyin-8.8.2.zip
├── kibana-8.8.2-x86_64.rpm
├── logstash-7.17.7-linux-x86_64.tar.gz
├── logstash-8.8.2-x86_64.rpm
2.系统优化
优化inux资源限制配置文件limits.conf
vim /etc/security/limits.conf
添加以下内容:
# 进程可以最大打开的文件数
* soft nofile 655350
* hard nofile 655350
# 进程可以创建的线程数
* soft nproc 102400
* hard nproc 409600
# 允许进程锁定内存
* soft memlock unlimited
* hard memlock unlimited
- 第一列表示用户和组(@开头)。第二列表示软限制还是硬限制,第三列表示限制的资源类型,第四列表示限制的最大值;
- hard和soft的区别: soft是一个警告值,而hard则是一个真正意义的阀值,超过就会报错,一般情况下都是设为同一个值;
- core是内核文件,nofile是文件描述符,noproc是进程,一般情况下只限制文件描述符数和进程数就够了。
修改Linux系统配置文件sysctl.conf
vim /etc/sysctl.conf
添加以下内容:
vm.max_map_count = 262145
fs.file-max=655360
执行下面命令,立即生效:
sysctl -p
-
max_map_count: 文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量;
-
fs.file-max: 系统中可以同时打开的文件数目。
开启端口
这里提前开启端口,为了方便后续的测试验证及使用
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --zone=public --add-port=9300/tcp --permanent
firewall-cmd --zone=public --add-port=5601/tcp --permanent
firewall-cmd --zone=public --add-port=5041/tcp --permanent
firewall-cmd --reload
-
9200为服务端口;
-
9300为es内部节点之间沟通端口;
-
5601为kibana端口;
-
5041为logstash的监听端口。
或者直接禁用、关闭防火墙:
systemctl disable firewalld
systemctl stop firewalld
3.安装
3.1安装ES
安装命令:
rpm -ivh /opt/elasticsearch-8.8.2-x86_64.rpm
rpm方式安装,其配置目录在/etc/elasticsearch下。
关闭xpack:
sed -i 's/xpack.security.enabled: true/xpack.security.enabled: false/' /etc/elasticsearch/elasticsearch.yml
cat /etc/elasticsearch/elasticsearch.yml |grep xpack.security.enabled
授权所有IP可访问:
sed -i 's/.*network.host.*/network.host: 0.0.0.0/' /etc/elasticsearch/elasticsearch.yml
cat /etc/elasticsearch/elasticsearch.yml |grep network.host
关闭xpack后不需要通过ES账号、SSL认证等访问服务,图省事。
下面是对/etc/elasticsearch/elasticsearch.yml
的介绍:
cluster.name:集群名称。
node.name:节点名称,建议设置一个有意义的名称。
node.master:是否允许该节点被选为主节点,默认为true。
node.data:是否允许该节点存储数据,默认为true。
path.data:数据文件存储路径,可以是多个路径,以逗号分隔。
path.logs:日志文件存储路径。
bootstrap.memory_lock:设置为true时,ES将在启动时锁定JVM内存,防止交换,提高性能。
network.host:节点绑定的IP地址或主机名,默认为0.0.0.0,表示绑定所有可用的网络接口。
http.port:HTTP API监听的端口,默认为9200。
discovery.seed_hosts:可以被选为主节点的初始节点列表,建议至少有两个节点。
cluster.initial_master_nodes:用于在初始化期间指定可被选为主节点的节点列表,建议与discovery.seed_hosts一致。
action.destructive_requires_name:设置为true时,执行具有破坏性的操作(如删除索引)时需要显式指定名称。
indices.query.bool.max_clause_count:查询中允许的最大布尔子句数。
thread_pool.write.queue_size:写线程池中等待执行的任务队列大小。
index.number_of_shards:每个索引的分片数。
index.number_of_replicas:每个分片的副本数,默认为1。
index.refresh_interval:索引刷新间隔时间,默认为1s,可提高索引性能但会降低写入速度。
index.max_result_window:搜索结果的最大窗口大小,默认为10000,可设置更大的值以支持更大的分页结果。
index.max_inner_result_window:嵌套字段搜索结果的最大窗口大小,默认为100,可设置更大的值以支持更大的嵌套分页结果。
index.mapping.total_fields.limit:索引映射中允许的最大字段数,默认为1000。
index.mapping.depth.limit:索引映射中允许的最大嵌套深度,默认为20。
search.max_buckets:聚合搜索中允许的最大桶数,默认为10000。
http.max_content_length:HTTP请求正文的最大长度,默认为100MB。
xpack.security.enabled:启用xpack安全功能,默认为true。
安装ES插件:
若没有插件安装的需求,略过此步骤。
这里介绍安装ik中文分词器
插件、拼英分词器
插件。
将插件包解压至es插件目录下:
unzip /opt/elasticsearch-analysis-ik-8.8.2.zip -d /usr/share/elasticsearch/plugins/analysis-ik
unzip /opt/elasticsearch-analysis-pinyin-8.8.2.zip -d /usr/share/elasticsearch/plugins/analysis-pinyin
3.2安装Kibana
安装命令:
rpm -ivh /opt/kibana-8.8.2-x86_64.rpm
rpm方式安装,其配置目录在/etc/kibana下。
修改kibana.yml配置:
vim /etc/kibana/kibana.yml
添加如下内容:
# 服务名称,默认值:“your-hostname”用于标识此Kibana实例的可读显示名称
server.name: "kibana"
# 默认值:“localhost”此设置指定后端服务器的主机
server.host: "0.0.0.0"
# kibana中文界面显示
i18n.locale: "zh-CN"
# Elasticsearch实例,若es与kibana不是同一台机器,需要指定具体IP
elasticsearch.hosts: [ "http://127.0.0.1:9200" ]
# CSP安全策略,防止浏览器受到攻击,这里关闭
csp.strict: false
# 指定Kibana对终端用户可用的公共URL
server.publicBaseUrl: "http://0.0.0.0:5601"
下面是对/etc/kibana/kibana.yml
的介绍:
server.port: 默认值: 5601 Kibana 由后端服务器提供服务,该配置指定使用的端口号。
server.host: 默认值: “localhost” 指定后端服务器的主机地址。
server.basePath: 如果启用了代理,指定 Kibana 的路径,该配置项只影响 Kibana 生成的 URLs,转发请求到 Kibana 时代理会移除基础路径值,该配置项不能以斜杠 (/)结尾。
server.maxPayloadBytes: 默认值: 1048576 服务器请求的最大负载,单位字节。
server.name: 默认值: “您的主机名” Kibana 实例对外展示的名称。
server.defaultRoute: 默认值: “/app/kibana” Kibana 的默认路径,该配置项可改变 Kibana 的登录页面。
elasticsearch.url: 默认值: “http://localhost:9200” 用来处理所有查询的 Elasticsearch 实例的 URL 。
elasticsearch.preserveHost: 默认值: true 该设置项的值为 true 时,Kibana 使用 server.host 设定的主机名,该设置项的值为 false 时,Kibana 使用主机的主机名来连接 Kibana 实例。
kibana.index: 默认值: “.kibana” Kibana 使用 Elasticsearch 中的索引来存储保存的检索,可视化控件以及仪表板。如果没有索引,Kibana 会创建一个新的索引。
kibana.defaultAppId: 默认值: “discover” 默认加载的应用。
tilemap.url: Kibana 用来在 tile 地图可视化组件中展示地图服务的 URL。默认时,Kibana 从外部的元数据服务读取 url,用户也可以覆盖该参数,使用自己的 tile 地图服务。例如:“https://tiles.elastic.co/v2/default/{z}/{x}/{y}.png?elastic_tile_service_tos=agree&my_app_name=kibana”
tilemap.options.minZoom: 默认值: 1 最小缩放级别。
tilemap.options.maxZoom: 默认值: 10 最大缩放级别。
tilemap.options.attribution: 默认值: “© Elastic Tile Service” 地图属性字符串。
tilemap.options.subdomains: 服务使用的二级域名列表,用 {s} 指定二级域名的 URL 地址。
elasticsearch.username: 和 elasticsearch.password: Elasticsearch 设置了基本的权限认证,该配置项提供了用户名和密码,用于 Kibana 启动时维护索引。Kibana 用户仍需要 Elasticsearch 由 Kibana 服务端代理的认证。
server.ssl.enabled: 默认值: “false” 对到浏览器端的请求启用 SSL,设为 true 时, server.ssl.certificate 和 server.ssl.key 也要设置。
server.ssl.certificate: 和 server.ssl.key: PEM 格式 SSL 证书和 SSL 密钥文件的路径。
server.ssl.keyPassphrase: 解密私钥的口令,该设置项可选,因为密钥可能没有加密。
server.ssl.certificateAuthorities: 可信任 PEM 编码的证书文件路径列表。
server.ssl.supportedProtocols: 默认值: TLSv1、TLSv1.1、TLSv1.2 版本支持的协议,有效的协议类型: TLSv1 、 TLSv1.1 、 TLSv1.2 。
server.ssl.cipherSuites: 默认值: ECDHE-RSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-ECDSA-AES256-GCM-SHA384, DHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES128-SHA256, DHE-RSA-AES128-SHA256, ECDHE-RSA-AES256-SHA384, DHE-RSA-AES256-SHA384, ECDHE-RSA-AES256-SHA256, DHE-RSA-AES256-SHA256, HIGH,!aNULL, !eNULL, !EXPORT, !DES, !RC4, !MD5, !PSK, !SRP, !CAMELLIA. 具体格式和有效参数可通过OpenSSL cipher list format documentation 获得。
elasticsearch.ssl.certificate: 和 elasticsearch.ssl.key: 可选配置项,提供 PEM格式 SSL 证书和密钥文件的路径。这些文件确保 Elasticsearch 后端使用同样的密钥文件。
elasticsearch.ssl.keyPassphrase: 解密私钥的口令,该设置项可选,因为密钥可能没有加密。
elasticsearch.ssl.certificateAuthorities: 指定用于 Elasticsearch 实例的 PEM 证书文件路径。
elasticsearch.ssl.verificationMode: 默认值: full 控制证书的认证,可用的值有 none 、 certificate 、 full 。 full 执行主机名验证,certificate 不执行主机名验证。
elasticsearch.pingTimeout: 默认值: elasticsearch.requestTimeout setting 的值,等待 Elasticsearch 的响应时间。
elasticsearch.requestTimeout: 默认值: 30000 等待后端或 Elasticsearch 的响应时间,单位微秒,该值必须为正整数。
elasticsearch.requestHeadersWhitelist: 默认值: [ ‘authorization’ ] Kibana 客户端发送到 Elasticsearch 头体,发送 no 头体,设置该值为[]。
elasticsearch.customHeaders: 默认值: {} 发往 Elasticsearch的头体和值, 不管 elasticsearch.requestHeadersWhitelist 如何配置,任何自定义的头体不会被客户端头体覆盖。
elasticsearch.shardTimeout: 默认值: 0 Elasticsearch 等待分片响应时间,单位微秒,0即禁用。
elasticsearch.startupTimeout: 默认值: 5000 Kibana 启动时等待 Elasticsearch 的时间,单位微秒。
pid.file: 指定 Kibana 的进程 ID 文件的路径。
logging.dest: 默认值: stdout 指定 Kibana 日志输出的文件。
logging.silent: 默认值: false 该值设为 true 时,禁止所有日志输出。
logging.quiet: 默认值: false 该值设为 true 时,禁止除错误信息除外的所有日志输出。
logging.verbose: 默认值: false 该值设为 true 时,记下所有事件包括系统使用信息和所有请求的日志。
ops.interval: 默认值: 5000 设置系统和进程取样间隔,单位微妙,最小值100。
status.allowAnonymous: 默认值: false 如果启用了权限,该项设置为 true 即允许所有非授权用户访问 Kibana 服务端 API 和状态页面。
cpu.cgroup.path.override: 如果挂载点跟 /proc/self/cgroup 不一致,覆盖 cgroup cpu 路径。
cpuacct.cgroup.path.override: 如果挂载点跟 /proc/self/cgroup 不一致,覆盖 cgroup cpuacct 路径。
console.enabled: 默认值: true 设为 false 来禁用控制台,切换该值后服务端下次启动时会重新生成资源文件,因此会导致页面服务有点延迟。
elasticsearch.tribe.url: Elasticsearch tribe 实例的 URL,用于所有查询。
elasticsearch.tribe.username: 和 elasticsearch.tribe.password: Elasticsearch 设置了基本的权限认证,该配置项提供了用户名和密码,用于 Kibana 启动时维护索引。Kibana 用户仍需要 Elasticsearch 由 Kibana 服务端代理的认证。
elasticsearch.tribe.ssl.certificate: 和 elasticsearch.tribe.ssl.key: 可选配置项,提供 PEM 格式 SSL 证书和密钥文件的路径。这些文件确保 Elasticsearch 后端使用同样的密钥文件。
elasticsearch.tribe.ssl.keyPassphrase: 解密私钥的口令,该设置项可选,因为密钥可能没有加密。
elasticsearch.tribe.ssl.certificateAuthorities: 指定用于 Elasticsearch tribe 实例的 PEM 证书文件路径。
elasticsearch.tribe.ssl.verificationMode: 默认值: full 控制证书的认证,可用的值有 none 、 certificate 、 full 。 full 执行主机名验证, certificate 不执行主机名验证。
elasticsearch.tribe.pingTimeout: 默认值: elasticsearch.tribe.requestTimeout setting 的值,等待 Elasticsearch 的响应时间。
elasticsearch.tribe.requestTimeout: Default: 30000 等待后端或 Elasticsearch 的响应时间,单位微秒,该值必须为正整数。
elasticsearch.tribe.requestHeadersWhitelist: 默认值: [ ‘authorization’ ] Kibana 发往 Elasticsearch 的客户端头体,发送 no 头体,设置该值为[]。
elasticsearch.tribe.customHeaders: 默认值: {} 发往 Elasticsearch的头体和值,不管 elasticsearch.tribe.requestHeadersWhitelist 如何配置,任何自定义的头体不会被客户端头体覆盖。
3.3安装logstash
安装命令:
rpm -ivh /opt/logstash-8.8.2-x86_64.rpm
rpm方式安装,其配置目录在/etc/logstash下。
创建logstash配置文件:
tee /etc/logstash/conf.d/logstash.conf << \EOF
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 5041
type => "amaxlog"
codec => json_lines
}
}
filter {
date {
match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ]
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "amaxlog-%{+YYYY.MM.dd}"
codec => json
action => "index"
}
}
EOF
上面hosts是配置的es节点地址,index是指定ES索引名称,索引名称这里按天创建,是为了将日志按天切割及清理。
另外修改/etc/logstash/logstash.yml
配置文件,配置文件是yaml语法,注意key与value之间要有空格
vim /etc/logstash/logstash.yml
添加如下内容:
# 启用logstash的x-pack监控,默认为禁用
xpack.monitoring.enabled: true
# #将logstash的监控数据发送到所指定的elasticsearch集群中,也可以是单个es主机
xpack.monitoring.elasticsearch.hosts: ["http://127.0.0.1:9200"]
# 度量标准REST端点的绑定地址,默认为127.0.0.1
http.host: "0.0.0.0"
若es与logstash安装在不同机器,xpack.monitoring.elasticsearch.hosts
需要指定具体IP。
3.4服务配置与启动
依次对elasticsearch\kibana\logstash设置开机启动:
systemctl enable elasticsearch
systemctl enable kibana
systemctl enable logstash
依次对elasticsearch\kibana\logstash启动服务:
systemctl start elasticsearch
systemctl start kibana
systemctl start logstash
测试访问elasticsearch:
http://10.39.9.11:9200 或者 curl http://127.0.0.1:9200
测试访问kibana:
4.项目工程集成logstash
添加jar引用:
<!--(ELK)logstash-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
logback.xml完整示例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="logStashIP" value="10.39.9.11"/>
<property name="logStashPort" value="5041"/>
<property name="appName" value="profile-dev}"/>
<property name="pattern_script"
value="${appName} %date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] [%c{50}.%M\\(\\) : %line] - %msg%n"/>
<!-- 控制台输出日志 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${pattern_script}</pattern>
</layout>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
</appender>
<!--LOGSTASH-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>${logStashIP:- }:${logStashPort:- }</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<!--自定义字段,区分应用名称-->
<customFields>{"appname":"${appName}"}</customFields>
</encoder>
<!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<logger name="com.centaline" level="DEBUG"/>
<!-- 异步输出日志 -->
<appender name="ASYNC_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="STDOUT"/>
<!-- 设置队列入队时非阻塞,当队列满时会直接丢弃日志,但是对性能提升极大 -->
<neverBlock>true</neverBlock>
<!-- 新增这行为了打印栈堆信息 -->
<includeCallerData>true</includeCallerData>
</appender>
<appender name="ASYNC_LOGSTASH" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="LOGSTASH"/>
<neverBlock>true</neverBlock>
<includeCallerData>true</includeCallerData>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC_STDOUT"/>
<appender-ref ref="ASYNC_LOGSTASH"/>
</root>
</configuration>
5.定时清理日志数据
注意:日志索引一定要以日期后缀方式才能按时间去清理,示例格式:amaxlog-2023.07.07
编写清理日志索引shell脚本:
tee /etc/elasticsearch/clean_elk.sh << \EOF
#!/bin/bash
# @Author: 胡桃夹子
# @Date: 2023-07-10
# ELK日志数据保留近 N 天
KEEP_DAYS=30
# ES地址
ES_SERVER=10.39.9.11:9200
# 日志索引名称前缀,示例:amaxlog-2023.07.07
LOG_INDEX_PREFIX=amaxlog
# 删除前 N的所有天到 前N+10天==>每天执行
function get_to_days()
{
# declare -A DAY_ARR
# DAY_ARR=""
for i in $(seq 1 10);
do
THIS_DAY=$(date -d "$(($KEEP_DAYS+$i)) day ago" +%Y.%m.%d)
DAY_ARR=( "${DAY_ARR[@]}" $THIS_DAY)
done
echo ${DAY_ARR[*]}
}
# 返回数组的写法
TO_DELETE_DAYS=(`get_to_days`)
for DAY in "${TO_DELETE_DAYS[@]}"
do
echo "${LOG_INDEX_PREFIX}-${DAY} index will be delete"
URL=http://${ES_SERVER}/${LOG_INDEX_PREFIX}-${DAY}
# echo ${URL}
curl -XDELETE ${URL}
done
EOF
上面shell中变量解释:
KEEP_DAYS
代表日志保留天数;
ES_SERVER
代表ES的服务地址;
LOG_INDEX_PREFIX
日志索引名称前缀,示例:amaxlog-2023.07.07;
for i in $(seq 1 10)
数字10
代表 删除7天以前的10天,如果你之前还有1年的数据 可以改成365;
授权shell脚本可执行权限:
chmod +x /etc/elasticsearch/clean_elk.sh
配置定时任务:
编辑任务列表
crontab -e
添加定时任务,每天凌晨1点钟执行
0 1 * * * /etc/elasticsearch/clean_elk.sh >/dev/null 2>&1
至此,ELK已经完成安装、应用集成、定时清理。
6.引用Reference
CentOS8搭建nfs服务
Kubernetes 1.25.4版本安装
kubeasz安装kubernetes1.25.5
k8s一键安装redis单机版
k8s一键安装mysql8单机版
k8s部署springboot应用
Docker安装及学习
Docker制作springboot运行应用镜像
Docker制作Java8环境镜像
Docker安装Mysql5.7.31
Docker安装Mysql8.1.0
Elasticsearch单机版本安装
Elasticsearch集群安装
ELK安装
Docker安装ELK
zookeeper集群安装
Nginx日志切割
RabbitMQ集群安装
springboot集成prometheus+grafana
windows11安装android应用