ELK安装

ELK安装

1.环境准备

OS: CentOS Linux release 7.9.2009 (Core)

机器:10.28.19.110

ES、Kibana安装版本:7.17.7

Elasticsearch:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
Kibana: https://www.elastic.co/cn/downloads/past-releases#kibana

logstash: https://www.elastic.co/cn/downloads/past-releases#logstash

提前下载好elasticsearch-7.17.7-linux-x86_64.tar.gzkibana-7.17.7-linux-x86_64.tar.gzlogstash-7.17.7-linux-x86_64.tar.gz上传至/opt目录下。

插件:如果ES除了业务日志之外,还有其它业务模块会涉及,需要安装插件的,可参照下面的介绍

注意,下载插件时,请与安装的ES版本保持一至 ,当前ES安装版本为7.17.7,那么下载的插件版本也要为7.17.7。

ik中文分词器:https://github.com/medcl/elasticsearch-analysis-ik/releases

拼英分词器:https://github.com/medcl/elasticsearch-analysis-pinyin/releases

同样,将elasticsearch-analysis-ik-7.17.7.zipelasticsearch-analysis-pinyin-7.17.7.zip安装包上传至/opt目录下。

Java环境:

ES依赖于java环境,请确保机器上已有安装java环境,ES7.x版本对应的是JDK1.8,版本不要弄错。

未安装可自行下载java安装包,进行安装。

java国内下载镜像站:http://www.codebaoku.com/jdk/jdk-oracle-jdk1-8.html

rpm -ivh jdk-8u351-linux-x64.rpm

安装必要组件:

yum install lrzsz lsof unzip -y

上面组件必须要安装,为后面的es安装做准备。

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: 系统中可以同时打开的文件数目

开启端口

这里提前开启端口,为了方便后续的测试验证使用

5601为kibana端口, 9100为head端口, 9200为服务端口,9300为内部节点之间沟通端口,5041为logstash的监听端口
执行下面命令:

firewall-cmd --zone=public --add-port=5601/tcp --permanent
firewall-cmd --zone=public --add-port=9100/tcp --permanent
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --zone=public --add-port=9300/tcp --permanent
firewall-cmd --zone=public --add-port=5041/tcp --permanent
firewall-cmd --reload

3.安装ES

3.1安装ES

规划安装目录是/opt

elasticsearch-7.17.7-linux-x86_64.tar.gz安装包提前放置在/opt目录下

cd /opt
tar -xf elasticsearch-7.17.7-linux-x86_64.tar.gz
mv elasticsearch-7.17.7 elasticsearch
mkdir -p /opt/elasticsearch/data

修改es配置文件

vim /opt/elasticsearch/config/elasticsearch.yml

添加以下内容,配置文件是yaml语法,注意key与value之间要有空格

# es集群名称,默认elasticsearch,es会自动发现在同一网段下es,如果在同一网段下有多个集群,可用这个属性来区分不同的集群
cluster.name: elasticsearch
# 节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中
node.name: es-node0
# 索引数据存储路径,默认es根目录下data文件夹,可设置多个存储路径,用逗号隔开,例:/path/to/data1,/path/to/data2
path.data: /opt/elasticsearch/data
# 设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.logs: /opt/elasticsearch/logs
# 设置对外服务的http端口,默认为9200
http.port: 9200
# 可访问网络地址
network.host: 0.0.0.0
# es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["es-node0"]
# 7.13以上版本,禁用安全选项
xpack.security.enabled: false
# 内部node之间的传输层地址
transport.host: localhost
# 指定elasticsearch集群内数据通讯使用的端口,默认情况下为9300
transport.tcp.port: 9300

从5.0开始 elasticsearch 安全级别提高了,不允许采用root帐号启动, 所以需要添加一个用户用来启动 elasticsearch,创建es用户并给elasticsearch安装目录赋予权限。

创建es用户,并授权安装目录

useradd es
chown -R es:es /opt/elasticsearch

3.2安装插件

若不需要安装插件,略过此步骤。

这里安装下ik中文分词器插件、拼英分词器插件

elasticsearch-analysis-ik-7.17.7.zipelasticsearch-analysis-pinyin-7.17.7.zip解压放入ES插件目录下:

unzip -d /opt/elasticsearch/plugins/ik elasticsearch-analysis-ik-7.17.7.zip
unzip -d /opt/elasticsearch/plugins/pinyin elasticsearch-analysis-pinyin-7.17.7.zip

再次授权安装目录:

chown -R es:es /opt/elasticsearch

3.3创建ES服务脚本文件

创建ES服务脚本文件:

tee /usr/lib/systemd/system/elasticsearch.service << \EOF
# 主要用于配置整个服务的详情信息以及服务依赖,用于快速识别该服务的相关情况以及依赖项目
[Unit]
# 描述这个 Unit 文件的信息
Description=elasticsearch7.15.2
# 文档地址
Documentation=https://www.elastic.co
# 描述服务类别,表示本服务需要在network服务启动后在启动
After=network.target

# 主要用于配置整个服务生命周期的管理行为
[Service]
# 设置服务运行的用户
User=es
# 服务将以fork分叉的方式启动,此时父进程将会退出,子进程将成为主进程。
Type=simple
# 服务启动命令,命令需要绝对路径
ExecStart=/opt/elasticsearch/bin/elasticsearch
# 表示给服务分配独立的临时空间
PrivateTmp=true
# 设置内核可以同时打开的文件描述符的最大值.单位:n(相当于ulimit -n),infinity代表当前用户达到的上限
LimitNOFILE=65535
# 设置进程数目:用户最多可启动的进程数目(相当于ulimit -u),infinity代表当前用户达到的上限
LimitNPROC=4096
# 不自动重启
Restart=no

# 用于配置服务安装级别,当我们设置服务在Linux的那种级别下启动或开机自启动时会加载该部分(典型的当chkconfig nginx on或者systemctl enable|disable nginx.service时会读取该部分的配置)
[Install]
# 多用户,表示多用户命令行状态,这个设置很重要
WantedBy=multi-user.target
EOF

重新加载服务、设置开机启动、启动服务:

systemctl daemon-reload
systemctl enable elasticsearch
systemctl start elasticsearch

ES停止、重启命令:

systemctl stop elasticsearch
systemctl restart elasticsearch

测试访问ES:

http://10.28.19.110:9200

或者

curl http://127.0.0.1:9200

4.安装Kibana

4.1安装Kibana

规划安装目录是/opt

kibana-7.17.7-linux-x86_64.tar.gz安装包提前放置在/opt目录下

cd /opt
tar -xf kibana-7.17.7-linux-x86_64.tar.gz
mv kibana-7.17.7 elasticsearch-kibana

修改kibana配置文件

vim /opt/elasticsearch-kibana/config/kibana.yml

最下面添加以下内容,配置文件是yaml语法,注意key与value之间要有空格

# 服务名称,默认值:“your-hostname”用于标识此Kibana实例的可读显示名称
server.name: "kibana"
# 默认值:“localhost”此设置指定后端服务器的主机
server.host: "0.0.0.0"
# kibana中文界面显示
i18n.locale: "zh-CN"
# Elasticsearch实例
elasticsearch.hosts: [ "http://10.28.19.110:9200" ]
# 指定Kibana进程ID文件的路径
pid.file: /opt/elasticsearch-kibana/pid

同样,这里kibana也授权给es来启动

授权给es用户组

chown es:es -R /opt/elasticsearch-kibana

4.2创建Kibana服务脚本

创建Kibana服务脚本文件:

tee /usr/lib/systemd/system/kibana.service << \EOF
# 主要用于配置整个服务的详情信息以及服务依赖,用于快速识别该服务的相关情况以及依赖项目
[Unit]
Description=kibana7.17.7
# 描述服务类别,表示本服务需要在network服务启动后在启动
After=network.target

# 主要用于配置整个服务生命周期的管理行为
[Service]
# 设置服务运行的用户
User=es
# 服务将以fork分叉的方式启动,此时父进程将会退出,子进程将成为主进程。
Type=simple
# 安装目录
WorkingDirectory=/opt/elasticsearch-kibana
# 服务启动命令,命令需要绝对路径
ExecStart=/opt/elasticsearch-kibana/bin/kibana
ExecStop=/usr/bin/kill -15 $MAINPID
ExecReload=/usr/bin/kill -HUP $MAINPID
# 表示给服务分配独立的临时空间
PrivateTmp=true
# 限制进程使用的文件描述符数量,等同ulimit -n
LimitNOFILE=65536
# 限制进程的数量,等同于ulimit -u
LimitNPROC=2048

# 等待服务停止的时间(以秒为单位)
TimeoutStopSec=0
# 设置杀死进程的第一步使用什么信号,所有可用的信号详见 signal(7) 手册。默认值为SIGTERM信号。
# 注意,systemd会无条件的紧跟此信号之后再发送一个SIGCONT信号,以确保干净的杀死已挂起(suspended)的进程。
KillSignal=SIGTERM
# 设置在单元停止时,杀死进程的方法。
# 取值范围如:control-group, process, mixed, none 默认值是 control-group 表示杀死该单元的 cgroup 内的所有进程(对于 service 单元,还要先执行 ExecStop= 动作)
KillMode=process
# 是否在超过 TimeoutStopSec= 时间后,使用 SIGKILL 或 FinalKillSignal= 信号杀死依然残存的进程。默认值为"yes"
SendSIGKILL=no
# 配置项 SuccessExitStatus=143 是为了抑制stop时报错 Main process exited, code=exited, status=143/n/a
# 这是因为 java 程序在响应 SIGTERM 时不会并不会发回预期的退出状态
# 所以需要将退出代码 SuccessExitStatus=143 添加到 systemd 服务文件作为成功退出状态来抑制这种报错
SuccessExitStatus=143

# 用于配置服务安装级别,当我们设置服务在Linux的那种级别下启动或开机自启动时会加载该部分(典型的当chkconfig nginx on或者systemctl enable|disable nginx.service时会读取该部分的配置)
[Install]
# 多用户,表示多用户命令行状态,这个设置很重要
WantedBy=multi-user.target
EOF

重新加载服务、设置开机启动、启动服务:

systemctl daemon-reload
systemctl enable kibana
systemctl start kibana

Kibana停止、重启命令:

systemctl stop kibana
systemctl restart kibana

测试访问Kibana:

http://10.28.19.110:5601

5.安装logstash

5.1安装logstash

规划安装目录是/opt

logstash-7.17.7-linux-x86_64.tar.gz安装包提前放置在/opt目录下

cd /opt
tar -xf logstash-7.17.7-linux-x86_64.tar.gz
mv logstash-7.17.7 logstash

创建logstash配置文件

tee /opt/logstash/config/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 => ["10.28.19.110:9200"]
   index => "amaxlog-%{+YYYY.MM.dd}"
   codec => json
   action => "index"
  }
}
EOF

上面hosts是配置的es节点地址,index是指定ES索引名称,索引名称这里按天创建,是为了将日志按天切割及清理。

另外修改/opt/logstash/config/logstash.yml配置文件,配置文件是yaml语法,注意key与value之间要有空格

vim /opt/logstash/config/logstash.yml

添加如下内容:

xpack.monitoring.enabled: true 
xpack.monitoring.elasticsearch.hosts: ["http://10.28.19.110:9200"]
http.host: "0.0.0.0"

同样,这里kibana也授权给es来启动

5.2创建logstash服务脚本

tee /lib/systemd/system/logstash.service << \EOF
[Unit]
Description=logstash
Wants=network-online.target
After=network-online.target

[Service]
User=root
ExecStart=/opt/logstash/bin/logstash -f /opt/logstash/config/logstash.conf
# 设置为掉线自动重启
Restart=always

[Install]
WantedBy=multi-user.target
EOF

设置logstash开机启动:

systemctl enable logstash

启动服务:

systemctl start logstash

6.项目中logback集成logstash

添加jar引用:


<dependency>
    <groupId>net.logstash.logbackgroupId>
    <artifactId>logstash-logback-encoderartifactId>
    <version>5.3version>
dependency>

logback.xml完整示例:






<configuration scan="true" scanPeriod="60 seconds" debug="false">
    
    <property name="logStashIP" value="10.28.19.110"/>
    <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-8charset>
        encoder>
    appender>

    
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        
        <destination>${logStashIP:- }:${logStashPort:- }destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            
            <customFields>{"appname":"${appName}"}customFields>
        encoder>
        
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFOlevel>
        filter>
    appender>

    <logger name="com.centaline" level="DEBUG"/>

    
    <appender name="ASYNC_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="STDOUT"/>
        
        <neverBlock>trueneverBlock>
        
        <includeCallerData>trueincludeCallerData>
    appender>
    <appender name="ASYNC_LOGSTASH" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="LOGSTASH"/>
        <neverBlock>trueneverBlock>
        <includeCallerData>trueincludeCallerData>
    appender>

    <root level="INFO">
        <appender-ref ref="ASYNC_STDOUT"/>
        <appender-ref ref="ASYNC_LOGSTASH"/>
    root>
configuration>

7.定时清理日志数据

注意:日志索引一定要以日期后缀方式才能按时间去清理,示例格式:amaxlog-2023.07.07

编写清理日志索引shell脚本:

tee /opt/elasticsearch/clean_elk.sh << \EOF
#!/bin/bash
# @Author: 胡桃夹子
# @Date:   2023-07-10
 
# ELK日志数据保留近 N 天
KEEP_DAYS=30

# ES地址
ES_SERVER=10.28.19.110: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 /opt/elasticsearch/clean_elk.sh

配置定时任务:

编辑任务列表

crontab -e

添加定时任务,每天凌晨1点钟执行

0 1 * * * /opt/elasticsearch/clean_elk.sh >/dev/null 2>&1

至此,ELK已经完成安装、应用集成、定时清理。

8.引用 Reference

Kubernetes 1.25.4版本安装
kubeasz安装kubernetes1.25.5
CentOS8搭建nfs服务
k8s一键安装redis单机版
k8s一键安装mysql8单机版
Docker制作springboot运行应用镜像
k8s部署springboot应用
zookeeper集群安装
Nginx日志切割
Elasticsearch单机版本安装
Elasticsearch集群安装
springboot集成prometheus+grafana
安装Docker及学习
RabbitMQ集群安装
Docker安装Mysql5.7.31
ELK安装
Docker安装ELK

你可能感兴趣的:(运维,ES,Elasticsearch,elk)