一.ELK应用场景

  在复杂的企业应用服务群中,记录日志方式多种多样,并且不易归档以及提供日志监控的机制。无论是开发人员还是运维人员都无法准确的定位服务、服务器上面出现的种种问题,也没有高效搜索日志内容从而快速定位问题的方式。因此需要一个集中式、独立的、搜集管理各个服务和服务器上的日志信息,集中管理,并提供良好的UI界面进行数据展示,处理分析。
  得此:ELK提供一套开源的解决方案,能高效、简便的满足以上场景。

二.ELK日志系统介绍

1.ELK分别是Elasticsearch、Logstash、Kibana三个开源框架缩写。

框架简介作用
Elasticsearch开源分布式搜索引擎,提供存储、分析、搜索功能。特点:分布式、基于reasful风格、支持海量高并发的准实时搜索场景、稳定、可靠、快速、使用方便等。接收搜集的海量结构化日志数据,并提供给kibana查询分析
Logstash开源日志搜集、分析、过滤框架,支持多种数据输入输出方式。用于收集日志,对日志进行过滤形成结构化数据,并转发到elasticsearch中
Kibana开源日志报表系统,对elasticsearch以及logstash有良好的web页面支持。对elasticsearch提供的数据进行分析展示

2.ELK经典应用如下:

ELK经典架构.png

  • 如图:
    Logstash部署至服务主机,对各个服务的日志进行采集、过滤、推送。
    Elasticsearch存储Logstash传送的结构化数据,提供给Kibana。
    Kibana提供用户UIweb页面进行,数据展示和分析形成图表等。

  • 备注:logs 泛指,各种日志文件以及日志信息:windows,negix,tomcat,webserver等等。

3.ELK改进

  由于Logstash消耗资源大,而服务器资源相当宝贵,所以引进另一个轻量级日志采集框架Beats,其中包含以下6种
ELK改进.png

改良ELK.png

4.进一步思考

  传统web项目中,经常使用log4j以及logback(性能更高)等成熟日志插件进行日志的记录,是否提供更好的解决方案。
ELK升级1.0.png

  • 如图
    日志采集新增Logback直接发送日志到Logstash的形式。如果采用此方式,web服务可减少部分生成log文件配置,提高实时性和日志推送效率

5.高并发场景

  logstash消耗性能,所以高并发场景容易遇到流量上的瓶颈,及时使用logstash集群也是如此,所以可以添加中间件进行日志缓存处理。由于logstash数据源具有多种方式,所有中间件也可以很多选择,常见的有kafka,redis。
ELK升级2.0.png

  • 如图
    host1、中间件、host2 均为高可用服务集群 为简单显示未画出
    logback出现的业务数据可以通过写入redis或者kafka等中间件进行缓存,再通过合理限制流量阀值输送至logstash进行过滤
    beats 如果是filebeat其日志若无实时性要求,可以通过控制log文件更新速度限制Beats传输日志流量

二.ELK搭建(非集群)

  本文采用ELK经典架构搭建。

1.下载ELK(保持版本一致)!

ElasticsearchElasticsearch 7.13.4
LogstashLogstash 7.13.4
KibanaKibana 7.13.4

2.上传到服务器并解压

3.安装elasticsearch

  • 打开elasticsearch的配置文件
    vi elasticsearch目录/config/elasticsearch.yml
#集群中的名称
cluster.name: node-1

#该节点名称
node.name: node-1

#意思为该节点为主节点
node.master: true

#表示这不是数据节点
node.data: false

#监听全部ip,在实际环境中应设置为一个安全的ip
network.host: 服务器ip

#Elasticsearch服务的端口号
http.port: 9200

#配置自动发现
discovery.zen.ping.unicast.hosts: ["服务器ip地址"]

  • 为Elasticsearch创建专属用户(Elasticsearch要求不能以root账户来运行)
#这里创建的用户名为haoxy
useradd jinghang
#为新创建的用户设置密码
passwd jinghangpassword
#将安装权限归新用户所有
chown -R jinghang:jinghang elasticsearch目录
  • 适当调整指定jvm内存
    vi elasticsearch目录/config/jvm.options
-Xms512m
-Xmx512m
  • 修改安全限制配置文件
    vi /etc/security/limits.conf
    备注:使用最高权限 修改安全配置 在文件末尾加入
# End of file
jinghang       hard        nofile        65536 
jinghang       soft        nofile        65536
*               soft       nproc         4096
*               hard       nproc         4096 

备注: jinghang为用户名 可以是使用*进行通配
nofile 最大打开文件数目
nproc 最大打开线程数目

  • 修改系统配置文件
    vi /etc/sysctl.conf

备注:行末加上vm.max_map_count = 655360 ,esc +:wq保存退出。262144也可。

# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
vm.max_map_count = 655360
  • 配置命令启动
    cd /etc/init.d
    touch elasticsearch
    chmod +x elasticsearch
    vi elasticsearch

输入以下配置内容:

#!bin/bash

# chkconfig: 2345 21 89
# description: elasticsearch

# JAVA_HOME=/usr/local/dev/java/jdk1.8.0_141
ES_HOME=elasticsearch安装目录
case $1 in
start) sudo -iu elsearch $ES_HOME/bin/elasticsearch &;;
*) echo "require start" ;;
esac

备注一下:sudo -iu elsearch 这里是指定一下elsearch用户权限
然后就可以用service elasticsearch start 启动es服务了

  • 设置开机自启
    root身份下执行以下命令:

chkconfig --add elasticsearch

  • 启动elasticsearch
    service elasticsearch start

4.安装logstash

  • logstash的配置
      要先在logstash的config目录下,新建一个logback-elk.conf配置文件,应该我暂时用logback传输日志到logstash,所以就建了个logback-elk.conf的配置文件,命名随意。(暂时还没玩透kafka,所以当前先不用kafka传输日志)
      logback-elk.conf配置的内容如下:
input {
    tcp {  
        port => 4560  #logstash服务开启的端口号
        mode => "server"
        tags => ['tags']
        codec => json_lines    #解析方式为json格式打印
    }
}
output {
        elasticsearch {
                hosts => ["elasticsearch服务器地址:9200"]  #elasticsearch 主节点
                index =>"%{[appname]}-%{+YYYY.MM.dd}"  #appname 为在springboot项目中配置logback时用到,指向项目名
		user => "elastic" # 注意:这里演示使用超级账号,安全起见最好是使用自定义的账号,并授予该用户创建索引的权限,具体看下方地址
                password => "对应账户密码"
        }
        stdout { codec => rubydebug}
}
  • 检查logback-elk.conf的配置是否有错:
    出现Configuration OK说明内容配置没什么问题

进入logstash安装目录的bin目录中,使用下面命令检查

./logstash -f ../config/logback-elk.conf --config.test_and_exit

命令说明:
–path.settings 用于指定logstash的配置文件所在的目录
-f 指定需要被检测的配置文件的路径
–config.test_and_exit 指定检测完之后就退出,不然就会直接启动了

  • 配置命令启动
    cd /etc/init.d
    touch logstash
    chmod +x logstash
    vi logstash
#!/bin/bash

# chkconfig: 2345 50 50
# description: logstash


#JAVA_HOME=/usr/local/dev/java/jdk1.8.0_141

LS_HOME=/logstash地址
case $1 in
start) $LS_HOME/bin/logstash -f $LS_HOME/config/logback-elk.conf &;;
*) echo "require start";;
esac
  • 设置开机自启
    root身份下执行以下命令:

chkconfig --add logstash

  • 启动logstash
    service logstash start

5.安装kibana

  • 将目录权限归我们创建新用户所有,这里也不能以root角色启动
    chown -R elasticsearch:elasticsearch kibana目录

  • 修改config/kibana.yml的配置,内容如下:

#打开这行配置,默认为localhost,改为0.0.0.0不改外网访问不了
server.host: "0.0.0.0"

#将这行配置打开,将值配置为elasticsearch服务器的ip地址
elasticsearch.hosts: ["http://ip地址:9200"]
  • 配置命令启动
    cd /etc/init.d
    touch kibana
    chmod +x kibana
    vi kibana
#!/bin/bash

# chkconfig:   2345 98  02
# description:  kibana

KIBANA_HOME=kibana目录
case $1 in
        start)sudo -iu elasticsearch $KIBANA_HOME/bin/kibana &;;
        *) echo "require start";;
esac
  • 设置开机自启
    root身份下执行以下命令:

chkconfig --add kibana

  • 启动kibana
    service kibana start
    kibana启动成功,浏览器输入ip地址:5601,即可浏览。

Q.E.D.





莫道君行早,更有早行人。