第20章 ELK日志企业实战

1.1 ELK日志平台背景

作为运维工程师,我们每天需要对服务器进行故障排错,那么最先能帮助我们定位问题的就是查看服务器日志,通过日志可以快速的定位问题。

目前我们说的日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常需要分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。而且日志被分散的储存不同的设备上。

如果你管理数上百台服务器,我们登录到每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理系统,例如:开源的syslog,将所有服务器上的日志收集汇总。

集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用find、grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

今天给大家分享的开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kibana三个开源工具组成,不过现在还新增了一个Beats,它是一个轻量级的日志收集处理工具(Agent),Beats占用资源少。

适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具,目前由于原本的ELK Stack成员中加入了 Beats 工具所以已改名为Elastic Stack。

  1. Elasticsearch是基于Lucene全文检索引擎架构,基于JAVA语言编写,对外开源、免费,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等,ELK官网:https://www.elastic.co/
  2. Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。工作方式为C/S架构,Client端安装在需要收集日志的主机上,Server端负责将收到的各节点日志进行过滤、修改等操作在一并发往Elasticsearch服务器。
  3. Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志;
  4. FileBeat是一个轻量级日志采集器,Filebeat属于Beats家族的6个成员之一,早期的ELK架构中使用Logstash收集、解析日志并且过滤日志,但是Logstash对CPU、内存、IO等资源消耗比较高,相比Logstash,Beats所占系统的CPU和内存几乎可以忽略不计;
  5. Logstash和Elasticsearch是用Java语言编写,而Kibana使用node.js框架,在配置ELK环境要保证系统有JAVA JDK开发库;

1.2 ELK架构原理深入剖析

EKL企业分布式实时日志平台,如果没有使用Filebeat,Logstash收集日志,进行过滤处理,并且将数据发往elasticsearch,如果使用Filebeat,Logstash从FileBeat获取日志文件。Filebeat作为Logstash的输入input将获取到的日志进行处理,将处理好的日志文件输出到Elasticsearch进行处理。

  1. ELK工作流程;

客户端安装Logstash日志收集工具,通过logstash收集客户端APP的日志数据,将所有的日志过滤出来,存入Elasticsearch 搜索引擎里,然后通过Kibana GUI在WEB前端展示给用户,用户需要可以进行查看指定的日志内容。同时也可以加入redis通信队列:

http://static.oschina.net/uploads/space/2015/0911/123810_YuJh_854444.jpg?_=5144183

1.3 Elasticsearch配置实战

部署配置ES,需要配置JDK 环境,JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)),此处采用JDK1.8版本,配置JAVA环境变量,vi /etc/profile加入如下代码:

export JAVA_HOME=/usr/java/jdk1.8.0_131

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

#使环境变量立刻生效,同时查看JAVA版本,显示版本信息,则证明安装成功;

source /etc/profile

java -version

分别下载ELK软件包:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.3.0.tar.gz

wget https://artifacts.elastic.co/downloads/logstash/logstash-5.3.0.tar.gz

wget https://artifacts.elastic.co/downloads/kibana/kibana-5.3.0-linux-x86_64.tar.gz

  1. ELK安装信息

192.168.111.128 Elasticsearch

192.168.111.129 Kibana

192.168.111.130 Logstash

  1. 192.168.111.128上安装ES

安装JDK版本信息

tar xzf jdk-8u131-linux-x64.tar.gz

mkdir -p /usr/java/ ;mv jdk1.8.0_131/ /usr/java/

同时在/etc/profile末尾加入如下三行:

export JAVA_HOME=/usr/java/jdk1.8.0_131

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

  1. 下载ES并配置

tar xzf elasticsearch-5.3.0.tar.gz

mv elasticsearch-5.3.0 /usr/local/elasticsearch/

修改vim /usr/local/elasticsearch/config/elasticsearch.yml文件

设置监听地址为network.hosts:0.0.0.0

useradd elk

chown -R elk:elk /usr/local/elasticsearch/

su – elk

/usr/local/elasticsearch/bin/elasticsearch -d

1.4 Elasticsearch配置故障演练

启动后可能会报错,需要修改如下内核参数设置:
1)SecComp功能不支持;

ERROR: bootstrap checks failed
system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk;
因为Centos6不支持SecComp,而ES5.3.0默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。

Seccomp(全称securecomputing mode)是Linux Kernel从2.6.23版本开始所支持的一种安全机制。

在Linux系统里,大量的系统调用(systemcall)直接暴露给用户态程序。但是并不是所有的系统调用都被需要,而且不安全的代码滥用系统调用会对系统造成安全威胁。通过Seccomp,我们限制程序使用某些系统调用,这样可以减少系统的暴露面,同时是程序进入一种“安全”的状态。
解决方法:
在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

2)内核参数设置问题;

max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
max number of threads [1024] for user [hadoop] is too low, increase to at least [2048]
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解决方法:

vim /etc/security/limits.conf 

* soft nofile 65536
* hard nofile 65536

vim /etc/security/limits.d/90-nproc.conf 

soft nproc 2048

vi /etc/sysctl.conf

vm.max_map_count=655360

Max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。

调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。

如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。
sysctl -p或者exit退出终端;

如下图:

至此ES配置完毕,如果想配置ES集群模式,同样也非常简单,只需要拷贝 ES副本集即可,然后修改相应的参数。

1.5 Elasticsearch插件部署实战

ES老版本(5.x以下)部署ES HEAD插件方法如下:

cd /usr/local/elasticsearch;

./bin/plugin install mobz/elasticsearch-head

http://192.168.111.128:9200/_plugin/head/

Elasticsearch-head是elasticsearch的集群管理工具,它是完全由HTML5编写的独立网页程序,你可以通过插件把它安装到ES,然后重启ES,通过界面访问和管理即可。

ES新版本(5.x以上)部署ES HEAD插件方法如下:

  1. 安装nodejs和npm

yum -y install nodejs npm

  1. 下载源码并安装

git clone https://github.com/mobz/elasticsearch-head.git

cd elasticsearch-head/

#基于国内taobao镜像安装grunt;

npm install -g grunt –registry=https://registry.npm.taobao.org

#安装Head插件;

npm install

#npm install –registry=https://registry.npm.taobao.org

ES配置修改&elasticsearch-head插件源码修改

  1. 修改elasticsearch.yml,增加跨域的配置;

http.cors.enabled: true

http.cors.allow-origin: “*”

  1. 编辑elasticsearch-head/Gruntfile.js,修改服务器监听地址;

增加hostname属性,将其值设置为*,以下两种配置任选一种;

# Type1

connect: {

hostname: ‘*’,

server: {

options: {

port: 9100,

base: ‘.’,

keepalive: true

}

}

}

# Type 2

connect: {

server: {

options: {

hostname: ‘*’,

port: 9100,

base: ‘.’,

keepalive: true

}

}

}

  1. 编辑head/_site/app.js,修改head连接es的地址;

将localhost修改为ES的IP地址。

this.base_uri = this.config.base_uri || this.prefs.get(“app-base_uri”) || “http://localhost:9200”;

#将localhost修改为ES的IP地址

this.base_uri = this.config.base_uri || this.prefs.get(“app-base_uri”) || “http://192.168.1.161:9200”;

  1. 启动Elasticsearch-head独立服务;

cd elasticsearch-head/

nohup ./node_modules/grunt/bin/grunt server &

访问head插件如图所示:

1.6 Kibana WEB安装配置

部署安装Kibana不需要安装JAVA JDK环境,直接下载源码,解压即可。

tar xzf kibana-5.3.0-linux-x86_64.tar.gz
mv kibana-5.3.0-linux-x86_64 /usr/local/kibana/

修改kibana配置文件信息,设置ES地址:

vim /usr/local/kibana/config/kibana.yml

1.7 Logstash客户端配置实战

由于Logstash基于JAVA语言开发,Agent部署需要安装JDK运行环境库:

tar xzf jdk-8u121-linux-x64.tar.gz

mkdir -p /usr/java/ ;mv jdk1.8.0_131/ /usr/java/

vim /etc/profile添加如下代码;

export JAVA_HOME=/usr/java/jdk1.8.0_131

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

解压Logstash软件;

tar xzf logstash-5.3.0.tar.gz

mv logstash-5.3.0 /usr/local/logstash/

1.8 ELK收集系统标准日志

#创建收集日志配置目录;

mkdir -p /usr/local/logstash/config/etc/

cd /usr/local/logstash/config/etc/

创建ELK整合配置文件:vim logstash.conf,内容如下:

input {

stdin { }

}

output {

stdout {

codec => rubydebug {}

}

elasticsearch {

hosts => “192.168.111.128” }

}

  1. 启动logstash服务

/usr/local/logstash/bin/logstash -f logstash.conf

1.9 ELK-WEB日志数据图表

Logstash启动窗口中输入任意信息,会自动输出相应格式日志信息:

浏览器输入:http://192.168.111.129:5601/

为了使用kibana 你必须配置至少一个索引模式,索引模式是用于确认Elasticsearch index,用来运行搜索和分析,也可以用于配置字段。

Index contains time-based events 索引基于时间的事件;

Use event times to create index names [DEPRECATED] 使用事件时间来创建索引名字【过时】

Index name or pattern 索引名字或者模式;

模式允许你定义动态的索引名字 使用*作为通配符,例如默认:

logstash-*

选择:

Time field name;

单击Discover,可以搜索和浏览 Elasticsearch 中的数据,默认搜索的是最近 15分钟的数据。可以自定义选择时间。