ELK安装

4 篇文章 0 订阅
2 篇文章 0 订阅

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本身提供插件安装,常见插件:

如果安装的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是进程,一般情况下只限制文件描述符数和进程数就够了。

limits.conf详解

修改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:

http://10.39.9.11:5601

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应用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值