ELK搭建实战

  • 准备工作
  • 下载并安装公共签名密钥
  • 设置repo内容
  • 在repo中添加如下内容
  • Java环境安装
  • 安装java 环境`yum install java -y`版本低直接安装9.0
  • 去镜像网站下载jdk
  • 配置JAVA_HOME
  • 验证是否安装好
  • Elasticsearch 安装和配置
  • 核心参数
  • 命令介绍
  • 验证
  • 修改elasticsearch占用内存
  • Logstash 安装
  • 安装
  • 自启动
  • 启动完之后内存占用达到 200%--300% 解决:
  • Kibana 安装和配置
  • 安装
  • 设置自动启
  • 安装redis
  • FileBeat 安装和配置
  • 建议rpm安装 这样后台运行方便
  • wget安装
  • 设置后台运行
  • Logstash 配置


准备工作

下载并安装公共签名密钥

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

设置repo内容

vim    /etc/yum.repos.d/elasticsearch.repo

在repo中添加如下内容

[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

Java环境安装

elasticsearch 需要java环境支持,执行如下命令

安装java 环境yum install java -y版本低直接安装9.0

去镜像网站下载jdk

cd /usr/local
wget https://repo.huaweicloud.com/java/jdk/9.0.1+11/jdk-9.0.1_linux-x64_bin.tar.gz
tar -zxvf jdk-9.0.1_linux-x64_bin.tar.gz

配置JAVA_HOME

vi /etc/profile

内容如下:

export JAVA_HOME=/usr/local/jdk-9.0.1
export JRE_HOME=/usr/local/jdk-9.0.1/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

使修改生效

source /etc/profile

查看是否安装成功

java -version

elk数据分析 elk实战_elastic

验证是否安装好

java -version

Elasticsearch 安装和配置

安装

yum -y install elasticsearch

报错

elk数据分析 elk实战_elk_02


解决

elk数据分析 elk实战_elastic_03

##设置为自启动

systemctl enable elasticsearch

配置
配置文件路径:/etc/elasticsearch/elasticsearch.yml

核心参数

# 配置文件都在 /etc/elasticsearch/ 目录下
vim /etc/elasticsearch/elasticsearch.yml

# 集群名称
: jhxxb
# 节点名称
: node-1
# 数据文件与日志文件存放目录
path.data: /home/esData/es
path.logs: /home/esData/log
# 网络设置
network.host: 0.0.0.0
http.port: 9200
# 集群设置
cluster.initial_master_nodes: ["node-1"]


# 修改配置中目录的用户与用户组,不然无法启动
chown -R elasticsearch:elasticsearch /var/lib/elasticsearch
chown -R elasticsearch:elasticsearch /var/log/elasticsearch

命令介绍

  1. 启动
    systemctl start elasticsearch.service
  2. 停止
    systemctl stop elasticsearch.service

验证

curl -X GET http://localhost:9200

输出结果如下

{
  "name" : "node-1",
  "cluster_name" : "app-log",
  "cluster_uuid" : "oVk4kUzKTCOsc2zaViOMXA",
  "version" : {
    "number" : "6.8.13",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "be13c69",
    "build_date" : "2020-10-16T09:09:46.555371Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.3",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

修改elasticsearch占用内存

vim /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g

注意:不能留空格否则会报格式不正确

Logstash 安装

第一步已经设置repo所以可直接安装,如果没有需自行按照第一步设置

安装

yum -y install logstash

手动添加systemd服务

/usr/share/logstash/bin/system-install

完成后会创建脚本/etc/systemd/system/logstash.service
启动:

systemctl start logstash

elk数据分析 elk实战_big data_04


出现这个错误则需要生成lgstash.service文件

sudo /usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd

elk数据分析 elk实战_big data_05


原因:这是由于jdk版本太低造成的,jdk版本需要在9.0以上,因此需要重新安装jdk。

查看状态

elk数据分析 elk实战_elastic_06


tail -f /var/log/messages查看系统日志

elk数据分析 elk实战_elk数据分析_07

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000083e80000, 1366294528, 0) failed;

原因就是内存无法分配的问题 (这要看遇到的具体是什么了)

现执行命令 free -m 查看内存是不是还有 最主要的是 看有没有交换空间 swap (这很重要)如果没有交换空间 或者交换空间比较小 要先安装交换空间 或者增大空间

(1)、创建swapfile:

root权限下,创建swapfile # dd if=/dev/zero of=swapfile bs=1024 count=500000 (有时会遇到dd命令不识别 可能是你安装过一次了 没事 先把swapfile删除就ok了)

(2)、将swapfile设置为swap空间

mkswap swapfile

(3)、启用交换空间,这个操作有点类似于mount操作(个人理解):

swapon  swapfile (删除交换空间 swapoff swapfile)

至此增加交换空间的操作结束了,可以使用free命令查看swap空间大小是否发生变化;

OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release

解决办法是修改jvm.options文件配置vim /etc/logstash/jvm.options,将

-XX:+UseConcMarkSweepGC 改为 -XX:+UseG1GC

自启动

systemctl enable logstash

启动完之后内存占用达到 200%–300% 解决:

  1. 查看logstash的log tail -f /var/log/logstash/logstash-plain.log # tail -f 可以让log这样需要实时刷新的文件自动刷新 发现有如下报错

配置放在后面讲,和FileBeat一起讲更容易理解

Kibana 安装和配置

安装

第一步 有的话这部省略直接安装

# 下载并安装公共签名密钥
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

# 添加源
vim /etc/yum.repos.d/kibana.repo

[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

# 安装
yum install -y kibana

# 配置
vim /etc/kibana/kibana.yml

server.host: "0.0.0.0"
# 不要用 127.0.0.1,可能会提示 Kibana server is not ready yet
elasticsearch.hosts: ["http://192.168.8.41:9200"]
i18n.locale: "zh-CN"


# 刷新服务配置
systemctl daemon-reload
# 开机自启
systemctl enable kibana.service
# 启动
systemctl start kibana.service
# 查看状态
systemctl status kibana.service

默认端口为 5601 浏览器ip:5601

设置自动启

systemctl enable kibana

安装redis

FileBeat 安装和配置

建议rpm安装 这样后台运行方便

yum install https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.16.2-x86_64.rpm

配置
配置路径:vi /etc/filebeat/filebeat.yml

启动 systemctl start filebeat

wget安装

直接到ELK官网下载安装filebeat:https:///cn/products(deb for Debian/Ubuntu, rpm for Redhat/Centos/Fedora, mac for OS X, and win for Windows).

cd /usr/local
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.16.2-linux-x86_64.tar.gz
tar -zxvf filebeat-7.16.2-linux-x86_64.tar.gz 
mv filebeat-7.16.2-linux-x86_64 filebeat

设置后台运行

./filebeat -e -c filebeat.yml >/dev/null 2>&1 &

配置
配置路径:vi /usr/local/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /xxxx/dispatch.log
  fields:
    log_source: jobs


output.redis:
  hosts:["xxxxxyyyyyzzzz.redis.rds.aliyuncs.com"]
  port:6379
  password:
  db:2
  timeout:5
  key:"logstash_list"


processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]

注解:FileBeat 是转发日志内容到指定的管道对象(这里使用的是阿里云的redis),其中需要注意的是 log_source 这个是我自定义的日志来源,方便后面Logstash进行日志处理。上面的配置就是讲 日志 放到 redis队列中,队列叫做:logstash_list
启动

./filebeat -e -c filebeat.yml
#重启:
使用ps -ef| grep logstash 查到之后,直接kill -9   pid

elk数据分析 elk实战_elasticsearch_08


根据错误提示,猜测/etc/filebeat/filebeat.yml配置存在错误

错误很明显,缩进格式错误或者多余的空格啥的,导致配置报错,修改缩进即可解决 ,filebeat.yml对缩进要求很严格

Logstash 配置

配置
前面说过,关于Logstash的配置放到FileBeat安装之后,这个没有先后顺序,只是方便大家理解 才专门单独放到后面讲解。FileBeat 将 日志放到了redis中。那么Logstash就要从redis中取出数据。

配置路径:/etc/logstash/conf.d/log.conf

input {
  redis {
    data_type => "list"
    key => "logstash_list"
    host => "xxxxxxxx"
    port => 6379
    password => ""
    db => 15
  }
}

filter{
    grok{
        match => {"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) \"(?:-|%{DATA:referrer})\" \"%{DATA:user_agent}\" (?:%{IP:proxy}|-) %{DATA:upstream_addr} %{NUMBER:upstream_request_time:float} %{NUMBER:upstream_response_time:float}"}
        match => {"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) \"%{DATA:referrer}\" \"%{DATA:user_agent}\" \"%{DATA:proxy}\""}
    }
    geoip{
        source => "clientip"
    }
    date {
        match => ["timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
        locale => "en"
    }
    mutate{
       # remove_field => ["message","timestamp","request","url_arg"]
    }
}
output{
    elasticsearch {      
        hosts => "localhost:9200"
        index => "nginx-access-log-%{+YYYY.MM.dd}"   
    }
}

注解:

  1. 上面的input配置的和FileBeat同一个Redis配置,说明从Redis获取数据。
  2. filter 区域表示过滤处理,上面是根据我自己的业务进行日志丢弃(因为有些日志记录是没有意义的)。根据来源进行 数据匹配 然后单独存储更改值( 如下图,将message字段中的job_id 单独提取作为一个字段 )
  3. filter 中的 mutate 配置了删除一些字段,有些字段都一样,存在没意义,减少存储日志量

    output 配置中 判断来源,然后设置存储在Elasticsearch 中并且索引规则按照定义好的生成(如下图)

elk数据分析 elk实战_elasticsearch_09


启动 systemctl start logstash