企业级应⽤——ELK(⼀):ELK的部署
  ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核⼼套件,但并⾮全部。
  Elasticsearch是实时全⽂搜索和分析引擎,提供搜集、分析、存储数据三⼤功能;是⼀套开放REST和JAVA API等结构提供⾼效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
  Logstash是⼀个⽤来搜集、分析、过滤⽇志的⼯具。它⽀持⼏乎任何类型的⽇志,包括系统⽇志、错误⽇志和⾃定义应⽤程序⽇志。它可以从许多来源接收⽇志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种⽅式输出数据,包括电⼦邮件、websockets和Elasticsearch。
  Kibana是⼀个基于Web的图形界⾯,⽤于搜索、分析和可视化存储在 Elasticsearch指标中的⽇志数据。它利⽤Elasticsearch的REST接⼝来检索数据,不仅允许⽤户创建他们⾃⼰的数据的定制仪表板视图,还允许他们以特殊的⽅式查询和过滤数据。
ELK架构
  通常来说,只使⽤这三个组件就可以进⾏⽇志收集了,不过在企业实际⽣产中,需要⽤到ELK做集中⽇志收集的话,⽇志的产⽣量都是惊⼈的,所以通常情况下会需要缓存层来防⽌elasticsearch被压垮。架构如下图所⽰。(也可以通过filebeat来收集⽇志。)
ELK的部署
  需要注意的是,ELK的这三个组件版本要⼀致,否则可能会出现⼀些不必要的问题。我们这⾥选⽤最新版本7.5.1为例,演⽰主机均为ubuntu1804。
Elasticsearch
  我们这⾥⽤两台主机来搭建⼀个elasticsearch集,⼀般来说因为他的选举机制,elasticsearch集
都是3、5、7奇数个,不过2台主机也可以使⽤,我们这⾥节约主机使⽤两台主机做演⽰,IP分别为192.168.32.41、192.168.32.42。
wget /downloads/elasticsearch/elasticsearch-7.5.1-amd64.deb
  这个版本的deb包是⾃带java环境(openjdk11)的,如果主机已经预制java环境,可以去官⽹下载no-java的版本,使⽤jdk8的时候有warning,说未来版本将不⽀持jdk8,建议使⽤jdk11及以上。
dpkg -i elasticsearch-7.5.1-amd64.deb
  elasticsearch的配置⽂件路径为/etc/l,需要修改的不多,将集主机IP设置好就可以了,如下所⽰
root@elasticsearch1:~# grep "^[a-Z]" /etc/l
cluster.name: ELK-CLuster      #集名称,名称相同即属于是同⼀个集
node.name: node-1                #本机在集内的节点名称
path.data: /elasticsearch/data
path.logs: /elasticsearch/logs
<_lock: true  #服务启动的时候锁定⾜够的内存,防⽌数据写⼊swap
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.32.41","192.168.32.42"]
cluster.initial_master_nodes: ["node-1","node-2"]
  我这⾥是单独创建了⼀个⽇志路径和数据路径,⽅便管理,并修改属主赋予权限。
mkdir -p /elasticsearch/{data,logs}
chown -R elasticsearch:elasticsearch /elasticsearch
  除了在配置⽂件中设置_lock: true以外,还需要在启动配置⽂件中设置允许⽆限制使⽤内存,否则启动检查就会报错,导致服务起不来。
vim /usr/lib/systemd/system/elasticsearch.service
LimitMEMLOCK=infinity
vim /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g
  另⼀台主机也同样配置,记得修改node.name,之后就可以启动elasticsearch了。
systemctl enable --now elasticsearch
  在任意主机使⽤curl命令可以检查集的健康状态。
curl -sXGET 192.168.32.41:9200/_cluster/health?pretty=true
  获取到的是⼀个 json 格式的返回值,那就可以通过 python 对其中的信息进⾏分析,例如对 status 进⾏分析,如果等于 green(绿⾊)就是运⾏在正常,等于yellow(黄⾊)表⽰副本分⽚丢失, red(红⾊)表⽰主分⽚丢失。
  ⾄此,elasticsearch服务的部署就算是完成了。
Logstash
  logstash也是⼀个基于java的插件式服务,很多功能都是依靠于插件来实现的,我们安装官⽅的安装包,⼤部分常⽤插件都是已经预置了,如果还有其他的功能需求,就需要去官⽹或者github下载插件了。这些之后再说,我们先去官⽹上将Logstash7.5.1安装包下载下来并部署上。
wget /downloads/logstash/logstash-7.5.1.deb
  logstash也同样需要java环境
apt update
apt install openjdk-8-jdk
  或者安装oracle的jdk,⽣产环境还是推荐使⽤oracle公司的jdk,更加稳定。然后安装logstash
dpkg -i logstash-7.5.1.deb
  对于logstash的配置也很少,不做修改也可以使⽤,不过我们这⾥同样还是修改⼀下数据⽬录和⽇志⽬录
root@logstash1:~# grep "^[a-Z]" /etc/l
path.data: /logstash/data
path.logs: /logstash/logs
  修改属主
mkdir -p /logstash/{data,logs}
chown -R /logstash
  logstash的默认执⾏程序路径为/usr/share/logstash/bin/logstash,这其实也是⼀个shell脚本⽂件,脚本中调⽤java的类库。
root@logstash1:~# /usr/share/logstash/bin/logstash --help
WARNING: Could not l which is typically located in
$LS_HOME/config or /etc/logstash. You can specify the path using --path.settings.
Continuing using the defaults
Usage:
bin/logstash [OPTIONS]
Options:
-n, --node.name NAME          Specify the name of this logstash instance,
jdk怎么使用
if no value is given
it will default to the current hostname.
(default: "logstash1")
-f, --fig CONFIG_PATH Load the logstash config from a specific file
or directory.  If a directory is given, all
files in that directory will be concatenated
in lexicographical order and then parsed as a
single config file. You can also specify
wildcards (globs) and any matched files will
be loaded in the order described above.
-e, --config.string CONFIG_STRING Use the given string as the configuration
data. Same syntax as the config file. If no
input is specified, then the following is
used as the default input:
"input { stdin { type => stdin } }"
and if no output is specified, then the
following is used as the default output:
"output { stdout { codec => rubydebug } }"
If you wish to use both defaults, please use
the empty string for the '-e' flag.
(default: nil)
  不过常⽤的选项也就-e和-f,分别是通过命令⾏指定参数或者通过⽂件来指定配置参数。我们可以使⽤命令来测试
/usr/share/logstash/bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug }}'
  通过标准输⼊输⼊信息,并通过标准输出返回⽇志信息。同样,我们也可以调⽤input的file插件和output的file插件实现从⽂件中读取数据,或者写⼊⽂件。这样就可以实现对⽇志⽂件的抓取了。我们可以先尝试抓取系统⽇志如syslog。
/usr/share/logstash/bin/logstash -e 'input { file { path => "/var/log/syslog"} } output { stdout{ codec => rubydebug }}'
  哈,系统⽇志如果太多,估计会刷屏的。
  不过刚才那些都只是⼀些基本⽤法⽽已,⽽实际⽣产中,我们肯定不能使⽤命令⾏来⼿动获取数据,我们需要的是⼀个可靠的服务,来帮我们⾃动抓取⽇志并筛选过滤,这就需要我们使⽤配置⽂件来设置了。
  例如我们要做的抓取本机的nginx的访问⽇志、错误⽇志还有系统⽇志,并传递⾄之前配好的elasticsearch中。
  那就在路径/etc/logstash/conf.d/⽬录下,创建⼀个新的配置⽂件,使⽤systemd启动时会⾃动读取conf.d下的配置⽂件。
vim /etc/logstash/conf.f
input {
file {
path => "/var/log/syslog"
stat_interval => 3
start_position => "beginning"
type => "syslog"
}
file {
path => "/apps/nginx/logs/access_json.log"
stat_interval => 3
start_position => "beginning"
codec => "json"
type => "nginx_accesslog"
}
file {
path => "/apps/nginx/logs/error.log"
stat_interval => 3
start_position => "beginning"
type => "nginx_errorlog"
}
}
output {
if [type] == "syslog" {
elasticsearch {
hosts => ["192.168.32.41:9200"]
index => "syslog-%{+YYYY.MM.dd}"
}}
if [type] == "nginx_accesslog" {
elasticsearch {
hosts => ["192.168.32.41:9200"]
index => "nginx_accesslog-%{+YYYY.MM.dd}
}}
if [type] == "nginx_errorlog" {
elasticsearch {
hosts => ["192.168.32.41:9200"]
index => "nginx_accesslog-%{+YYYY.MM.dd}
}}
}
  logstash⽀持条件判断,多输⼊以及多输出,设定type规则,来将每⼀类⽇志分类在不同的索引,且⽀持java的时间变量,可以实现根据⽇期归档每⼀天的⽇志,⽅便查看和统计。
  我们可以使⽤命令来测试脚本的语法是否正确,如果不加-t可以直接以前台进程的⽅式启动logstash,不过会占据终端,但测试的时候还是蛮⽅便的。
/usr/share/logstash/bin/logstash -f /etc/log/logstash/conf,f -t
  不过仅仅是这样,是⽆法统计具体访问时间、访问ip及访问路径的详细信息的,我们需要将nginx的⽇志序列化,或者说是储存为json 格式。
  所以修改nginx的配置⽂件,将⽇志格式修改⼀下。
http {
include      pes;
default_type  application/octet-stream;
#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                  '$status $body_bytes_sent "$http_referer" '
#                  '"$http_user_agent" "$http_x_forwarded_for"';
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"uri":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
access_log  /apps/nginx/logs/access_json.log  access_json;
  PS:加⼊的属性名称不要有type,否则会影响到logstash做type判断。然后记得在配置⽂件中注明输⼊信息为json格式。看到如下信息,则说明⽇志被成功拆解。
{
"http_user_agent" => "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0",
"path" => "/apps/nginx/logs/access_json.log",
"@timestamp" => 2020-01-03T08:17:47.000Z,
"upstreamhost" => "-",
"xff" => "-",
"responsetime" => 0.0,
"size" => 0,
"status" => "304",
"http_host" => "192.168.32.51",
"clientip" => "192.168.32.1",
"domain" => "192.168.32.51",
"tcp_xff" => "",
"host" => "192.168.32.51",
"@version" => "1",
"uri" => "/index.html",
"referer" => "-",
"upstreamtime" => "-"
}
  使⽤systemctl enable --now logstash启动logstash服务,过⼀会,⽇志就写⼊elasticsearch服务器中了,最好
将/etc/systemd/system/logstash.service⽂件的中启动⽤户组都改为root,避免因为权限问题,导致⽆法读取数据。
  我记得之前遇到过⼀次,命令⾏可以正常使⽤logstash,不过使⽤systemd启动就⼀直报错,logstash: could not find java; set
JAVA_HOME or ensure java is in PATH,明明环境变量都是正常的,后来在/usr/share/logstash/bin/logstash脚本⽂件中加了⼀
个JAVA_HOME=/usr/local/jdk环境变量就好了,⽽之后配的时候就没有遇到这个问题了,这就很奇怪了。
Kibana
  ⽇志信息都已经写到elasticsearch服务器中了,不过我们怎么才可以看到具体的⽇志信息呢?这就需要借助⽇志展⽰⼯具Kibana了。  虽然elasticsearch可视化⼯具也有不少,例如head、kopf、cerebro等等,不过他们都是监控elasticsearch集状态的,对⽇志做展⽰分析的还是⾸推开源的官⽅组件Kibana。
  同样下载kibana7.5.1版本

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。