架构
elk比较常见的架构:
本文用的架构:
ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。 Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。(可以关注下beats,有替代logstash shipper的趋势) 一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。 Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
为什么用到ELK 一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。 一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。 一个完整的集中式日志系统,需要包含以下几个主要特点: ①收集-能够采集多种来源的日志数据 ②传输-能够稳定的把日志数据传输到中央系统 ③存储-如何存储日志数据 ④分析-可以支持 UI 分析 ⑤警告-能够提供错误报告,监控机制 ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。
安装
网上很多关于elk介绍的例子都是基于老版本介绍的,最新版本的elk的安装和老版本有些区别,下面的安装步骤都是基于最新版本的es、logstash、kibana基于centos6.3安装。 网上安装jdk的介绍很多,这里不做介绍(安装jdk1.8,不然后续启动最新的es、kibana会报错)
安装配置logstash
mkdir -p /home/disk2/log/elk
cd /home/disk2/log/elk
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.4.0.zip (如机器没外网访问权限可先下载到本地再传到服务器,下同)
unzip logstash-5.4.0.zip
#修改logstash配置
cd logstash-5.4.0/config
vim logstash.yml
修改pipeline.workers为当前cpu数量
安装配置es
cd /home/disk2/log/elk
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.0.zip
unzip elasticsearch-5.4.0.zip
#配置
cd elasticsearch-5.4.0/config
vim elasticsearch.yml
#修改如下内容
cluster.name: log
node.name: node-1
path.data: /home/disk2/log/elk/elasticsearch-5.4.0/data
path.logs: /home/disk2/log/elk/elasticsearch-5.4.0/logs
network.host: you.website.com
http.port: 8000# 默认9200端口
http.cors.enabled: true
http.cors.allow-origin: "*"
bootstrap.system_call_filter: false#重要,centos6需添加此行配置
#修改系统配置
vim /etc/security/limits.conf
添加配置:
work soft nofile 65536
work hard nofile 65536
work soft memlock unlimited
work hard memlock unlimited
vim /etc/sysctl.conf
添加配置
vm.max_map_count = 262144
执行sysctl -p
vim /etc/security/limits.d/90-nproc.conf
添加配置
work soft nproc 65535
安装配置elasticsearch-head插件
#安装nodejs、xz
yum install xz
yum install nodejs
#此时执行npm -v查看npm是否安装,不出意外已经安装好了
#下载elasticsearch-head
#下载地址:https://github.com/mobz/elasticsearch-head,下载后解压缩。
#进入elasticsearch-head目录执行
使用npm安装grunt:
npm install grunt
npm install –g grunt–cli
npm安装依赖:
到elasticsearch-head-master目录下,运行命令:
npm install
如果速度较慢或者安装失败,可以使用国内镜像:
npm install -g cnpm --registry=https://registry.npm.taobao.org
#修改Gruntfile.js(通过8100端口访问es head)
connect: {
server: {
options: {
hostname: 'you.website.com',
port: 8100,
base: '.',
keepalive: true
}
}
}
#修改_site/app.js,修改连接es的地址
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://you.website.com:8000";
启动:
node_modules/grunt/bin/grunt server &
#浏览器访问http://you.website.com:8100/
#可参考http://blog.csdn.net/napoay/article/details/53896348
安装配置kibana
cd /home/disk2/log/elk
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.0-linux-x86_64.tar.gz
tar -zvxf kibana-5.4.0-linux-x86_64.tar.gz
mv kibana-5.4.0-linux-x86_64 kibana-5.4.0
#修改配置
cd kibana-5.4.0/config
vim kibana.yml
修改如下配置:
server.port: 8100
server.host: "you.website.com"
elasticsearch.url: "http://you.website.com:8000"
使用
配置logstash
假如日志已经汇总到了一台机器,并且通过shell脚本进行了指定格式切分(可以使用logstash gork正则匹配字段,但网上说效率很低,待确认),这里采用dissect过滤,关于logstash的filter可以进一步研究下
在logstash下创建conf.d目录
vim bpslog.conf
添加如下配置(本配置包括了filter:dessect,输出到es,es配置自定义模板):
input
{
file {
path => ["/home/disk2/log/orp/formatedlog/bpslog/*/*.log"]
type => "bpslog"
start_position => "beginning"
}
file {
path => ["/home/disk2/log/orp/formatedlog/manhattan/*/*.log"]
type => "manhattanlog"
start_position => "beginning"
}
}
filter {
if ([message] == "") {
drop {}
}
if [type] == "bpslog" {
dissect {
mapping => {
"message" => "%{app}mysplit%{bid}mysplit%{opcode}mysplit%{uri}mysplit%{logId}mysplit%{logtime}mysplit%{bps}"
}
}
}
else if [type] == "manhattanlog" {
dissect {
mapping => {
"message" => "%{app}mysplit%{bid}mysplit%{uri}mysplit%{logId}mysplit%{logtime}mysplit%{raldata}"
}
}
}
}
output{
if [type] == "bpslog" {
elasticsearch {
hosts => ["you.website.com:8201"]
index => "%{type}-%{+YYYY.MM.dd}"
template_overwrite => true
template => "/home/disk2/log/elk/logstash-5.4.0/template/bps.json"
}
}
else if [type] == "manhattanlog" {
elasticsearch {
hosts => ["you.website.com:8000"]
index => "%{type}-%{+YYYY.MM.dd}"
template_overwrite => true
template => "/home/disk2/log/elk/logstash-5.4.0/template/manhattan.json"
}
}
stdout{codec=>rubydebug}
}
自定义模板配置
{
"bps" : {
"template": "bpslog-*",
"settings": {
},
"mappings" : {
"logs" : {
"properties" : {
"@timestamp" : {
"type" : "date",
"format" : "dateOptionalTime",
"doc_values" : true
},
"@version" : {
"type" : "string",
"index" : "not_analyzed", #不分词
},
"app" : {
"type" : "string",
"index" : "not_analyzed",
},
"bid" : {
"type" : "integer",
"index" : "not_analyzed",
},
"opcode" : {
"type" : "integer",
"index" : "not_analyzed",
},
"uri" : {
"type" : "string",
"index" : "no",
}
"logId" : {
"type" : "integer",
"index" : "not_analyzed",
},
"logtime" : {
"type" : "string",
"index" : "not_analyzed",
},
"bps" : {
"type" : "string",
"index" : "no",
},
}
}
}
}
}
启动logstash
cd /home/disk2/log/elk/logstash-5.4.0/bin
./logstash -f ../conf.d &
启动es
cd /home/disk2/log/elk/elasticsearch-5.4.0/bin
./elasticsearch -d
使用kibana
kibana.logstash.es/content/kib…
安装X-pack插件
实践拓展
场景
1) datasource->logstash->elasticsearch->kibana
2) datasource->filebeat->logstash-> elasticsearch->kibana
3) datasource->filebeat->logstash->redis/kafka->logstash-> elasticsearch->kibana
4) kafka->logstash-> elasticsearch->kibana
5) datasource->filebeat->kafka->logstash->elasticsearch->kibana(最常用)
6) filebeatSSL加密传输
7) datasource->logstash->redis/kafka->logstash->elasticsearch->kibana
8) mysql->logstash->elasticsearch->kibana