ELK+filebeat+redis 日志分析平台

一.简介

ELK Stack是软件集合Elasticsearch、Logstash、Kibana的简称,由这三个软件及其相关的组件可以打造大规模日志实时处理系统。

其中,Elasticsearch 是一个基于 Lucene 的、支持全文索引的分布式存储和索引引擎,主要负责将日志索引并存储起来,方便业务方检索查询。

Logstash是一个日志收集、过滤、转发的中间件,主要负责将各条业务线的各类日志统一收集、过滤后,转发给 Elasticsearch 进行下一步处理。

Kibana是一个可视化工具,主要负责查询 Elasticsearch 的数据并以可视化的方式展现给业务方,比如各类饼图、直方图、区域图等。

所谓“大规模”,指的是 ELK Stack 组成的系统以一种水平扩展的方式支持每天收集、过滤、索引和存储 TB 规模以上的各类日志。

通常,各类文本形式的日志都在处理范围,包括但不限于 Web 访问日志,如 Nginx/Apache Access Log 。

基于对日志的实时分析,可以随时掌握服务的运行状况、统计 PV/UV、发现异常流量、分析用户行为、查看热门站内搜索关键词等。


上图是ELK Stack实际应用中典型的一种架构,其中:

1)filebeat:部署在具体的业务机器上,通过定时监控的方式获取增量的日志,并转发到Kafka消息系统暂存。

2)Kafka:以高吞吐量的特征,作为一个消息系统的角色,接收从filebeat收集转发过来的日志,通常以集群的形式提供服务。

3)logstash:然后,Logstash从Kafka中获取日志,并通过Input-Filter-Output三个阶段的处理,更改或过滤日志,最终输出我们感兴趣的数据。通常,根据Kafka集群上分区(Partition)的数量,1:1确定Logstash实例的数量,组成Consumer Group进行日志消费。

4)elasticsearch:最后,Elasticsearch存储并索引Logstash转发过来的数据,并通过Kibana查询和可视化展示,达到实时分析日志的目的。

Elasticsearch/Kibana还可以通过安装x-pack插件实现扩展功能,比如监控Elasticsearch集群状态、数据访问授权等。

我们一步步安装部署Elastic Stack系统的各个组件,然后以网站访问日志为例进行数据实时分析。

首先,到ELK 官网下载需要用到的Filebeat/Logstash/Elasticsearch/Kibana软件安装包。(推荐下载编译好的二进制可执行文件,直接解压执行就可以部署)

二.环境准备:

System: Centos release 6.8

ElasticSearch: 5.4.1

Logstash: 5.4.1

Kibana: 5.4.1

Java: openjdk version "1.8.0_161"

redis:3.05

Nginx: 1.10.1

1..下载软件包:

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

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

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

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.1-linux-x86_64.tar.gz

wget http://download.redis.io/releases/redis-3.0.5.tar.gz

yum install java-1.8.0-openjdk

2.准备

1)下面的命令实现永久关闭SELinux

[root@elk ~]# sed -i 's/^SELINUX=.*/#&/;s/^SELINUXTYPE=.*/#&/;/SELINUX=.*/a SELINUX=disabled' /etc/sysconfig/selinux

#永久修改下主机名,需要重启系统之后生效

#下面的命令实现临时关闭SELinux

[root@elk ~]# setenforce 0

setenforce: SELinux is disabled

2) 修改主机名

#临时修改

[root@elk ~]#hostname  elk.server.com

#永久修改

[root@elk ~]# vi /etc/sysconfig/network

localhost.localdomain ------》把这行修改成下面的

elk.server.com #修改成你自己的主机名

#添加域名

[root@elk ~]#cat /etc/hosts

192.168.10.243 elk.server.com

3)关闭防火墙

#临时关闭

[root@elk ~]# iptables -F

或者

[root@elk ~]# service iptables stop 

4) 同步时间

ntpdate -u ntp.api.bz

三.安装redis

#创建安装目录

[root@elk yum.repos.d]#mkdir -pv /data/application/

#编译并进行安装

[root@elk ~]# tar zxf redis-3.0.5.tar.gz && cd redis-3.0.5

[root@elk redis-3.0.5]# make PREFIX=/data/application/redis-3.0.5 install

#创建配置文件目录

[root@elk redis-3.0.5]#mkdir /data/application/redis-3.0.5/{etc,run,log}

#修改redis.conf

[root@elk redis-3.0.5]#cp /data/application/redis-3.0.5/redis.conf  etc/

[root@elk redis-3.0.5]#vi /data/application/redis-3.0.5/redis.conf

修改以下几项:

daemonize yes #后台模式运行

pidfile /data/application/redis-3.0.5/run/redis.pid #redis的pid

bind 0.0.0.0 #这里根据自己的ip填写

port 6379#端口

logfile "/data/application/redis-3.0.5/log/redis.log" #log存放位置

dir /data/application/redis-3.0.5 

#启动redis

执行下面的命令

[root@elk~]#/ data/application/redis-3.0.5/bin/redis-server /data/application/redis-3.0.5/etc/redis.conf

#查看是否启动成功

[root@elk ~]# lsof -i:6379

COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

redis-ser 2736 root    4u  IPv4  26198      0t0  TCP 192.168.10.243:6379 (LISTEN)

#测试redis

[root@localhost ~]# /data/application/redis-3.0.5/bin/redis-cli -h 192.168.10.243

192.168.10.243:6379> ping

PONG

#出现PONG,证明可以使用

四. 安装elasticsearch

注意

es(elasticsearch)版本2.x以上需要JDK 1.8以上

运行es不能使用root用来来运行

es目录必须指定一个普通用户和组(授权)

es对内存和CPU的消耗比较高

es使用的端口看开放iptables:9200,9300等

es配置其他插件实现资源等可视化监控

es的版本和插件之间版本要匹配

es集群配置,第一节点配置好scp到其他节点即可(修改配置文件)

#创建elk用户

[root@localhost application]# adduser  -s /bin/bash -c 'elk' -m -d /home/elk elk

注:

从2.0开始不能用root用户启动需要elk用户启动

#解压

[root@elk elk_pack]# tar zxvf elasticsearch-6.01.tar.gz -C /data/application/

注:

Elasticsearch是不需要编译的,解压就可以使用

备份配置文件

[root@elk ~]# cp /data/application/elasticsearch-6.01/config/elasticsearch.yml{,.ori}

#找到以下几行修改

[root@elk config]# vi elasticsearch.yml

path.data: /data/shuju ----》存放数据路径

path.logs: /data/logs            -----》日志路径

network.host: 0.0.0.0    -----》根据自己的ip修改

http.port: 9200

bootstrap.memory_lock: false

bootstrap.system_call_filter: false

#创建los,shuju

[root@elk config]#mkdir /data/{shuju,logs}

#修改elasticsearch权限

[root@elk ~]#chown -R elk.elk /data/application/elasticsearch-6.0.1./

[root@elk ~]#chown -R elk.elk /data/{shuju,logs}    

[root@elk ~]# su – elk

#在前台显示下效果

[elk@elk ~]$/data/application/elasticsearch-6.0.1/bin/elasticsearch

#测试是否成功

[root@elk ~]# curl 192.168.10.243:9200

{

  "name" : "z8htm2J",

  "cluster_name" : "elasticsearch",

  "cluster_uuid" : "wEbF7BwgSe-0vFyHb1titQ",

  "version" : {

    "number" : "6.0.1",

    "build_hash" : "3adb13b",

    "build_date" : "2017-03-23T03:31:50.652Z",

    "build_snapshot" : false,

    "lucene_version" : "6.4.1"

  },

  "tagline" : "You Know, for Search"

}

启动elasticsearch出现如下错误

1.问题:最大线程数,打开的太低,需要增加线程数

max number of threads [1024] for user [elasticsearch] likely toolow, increase to at least [2048]

解决:

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

* soft nproc 2048

2.问题:打开虚拟内存的个数太少需要增加

max virtual memory areas vm.max_map_count [65530] likely toolow, increase to at least [262144]

解决:

[root@elk ~]#vi /etc/sysctl.conf

vm.max_map_count=655360

[root@elk ~]#sysctl -p

注:

vm.max_map_count文件允许max_map_count限制虚拟内存的数量

3.max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

#临时修改

[root@elk ~]# ulimit -SHn 65536

注:

-S 设置软件资源限制

-H 设置硬件资源限制

-n 设置内核可以同时可以打开文件描述符

[root@elk ~]# ulimit -n

65536

注:

修改这个原因,启动elasticsearch 会出现这个情况too many open files,导致启动失败

#永久修改

#在文件最后添加

[root@elk ~]# vi /etc/security/limits.conf

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

注:

文件格式:username|@groupname type resource limit

分为3中类型type(有 soft,hard 和 -)

soft是指当前系统生效的设置值

hard 系统设置的最大值

[if !supportLists]- [endif]同时设置了soft和hard的值

 nofile - 打开文件的最大数目

noproc - 进程的最大数目

soft<=hard soft的限制不能比hard限制高

#需要重启系统才会生效

五.安装logstash

#解压

[root@elk elk_pack]# tar zxvf logstash-6.0.1tar.gz  -C /data/application/

注:

Logstash是不需要编译的,解压就可以使用

#测试能否使用

[root@elk ~]# /data/application/logstash-6.0.1/bin/logstash -e 'input { stdin { } } output {stdout {} }'

Sending Logstash's logs to /data/application/logstash-5.2.0/logs which is now configured via log4j2.properties

The stdin plugin is now waiting for input:

[2017-04-12T11:54:10,457][INFO ][logstash.pipeline        ] Starting pipeline {"id"=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>125}

[2017-04-12T11:54:10,481][INFO ][logstash.pipeline        ] Pipeline main started

[2017-04-12T11:54:10,563][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}  

hello world  ---->输入hell world,随便输入什么,能输出就证明可以使用

2017-04-12T03:54:40.278Z localhost.localdomain hello world ---->输出hello world

/data/application/logstash-5.2.0/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns

六、安装Kibana

#解压

[root@elk elk_pack]# tar zxvf kibana-6.0.1-linux-x86_64.tar.gz  -C /data/application/

注:

Kibana是不需要编译的,解压就可以使用

#修改配置kibana.yml文件

#cd kibana这个目录

[root@elk ~]# cd /data/application/kibana-6.0.1/config/

#找到以下几行修改

[root@elk config]# egrep -v "^$|^[#]" kibana.yml

server.port: 5601 #kibana的端口

server.host: "0.0.0.0" #访问kibana的ip地址

elasticsearch.url: "http://192.168.10.243:9200"  #elasticsearch的ip地址

kibana.index: ".kibana" #创建索引

#测试是否启动成功

[root@192 ~]# /data/application/kibana-6.0.1/bin/kibana

log   [06:22:02.940] [info][status][plugin:kibana@5.2.0] Status changed from uninitialized to green - Ready

  log   [06:22:03.106] [info][status][plugin:elasticsearch@5.2.0] Status changed from uninitialized to yellow - Waiting for Elasticsearch

  log   [06:22:03.145] [info][status][plugin:console@5.2.0] Status changed from uninitialized to green - Ready

  log   [06:22:03.193] [warning] You're running Kibana 5.2.0 with some different versions of Elasticsearch. Update Kibana or Elasticsearch to the same version to prevent compatibility issues: v5.3.0 @ 192.168.10.243:9200 (192.168.201.135)

  log   [06:22:05.728] [info][status][plugin:timelion@5.2.0] Status changed from uninitialized to green - Ready

  log   [06:22:05.744] [info][listening] Server running at http://192.168.10.243:5601

  log   [06:22:05.746] [info][status][ui settings] Status changed from uninitialized to yellow - Elasticsearch plugin is yellow

  log   [06:22:08.263] [info][status][plugin:elasticsearch@5.2.0] Status changed from yellow to yellow - No existing Kibana index found

  log   [06:22:09.446] [info][status][plugin:elasticsearch@5.2.0] Status changed from yellow to green - Kibana index ready

  log   [06:22:09.447] [info][status][ui settings] Status changed from yellow to green – Ready

#证明启动成功

#查看port

[root@elk shuju]# lsof -i:5601

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

node    4690 root   13u  IPv4  40663      0t0  TCP 192.168.10.243:esmagent (LISTEN)

通过web访问

http://192.168.10.243:5601

七.客户端安装filebeat收集nginx日志

1)安装nginx

安装依赖包

[root@www ~]# yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel

下载nginx的源码包:http://nginx.org/download

[root@www ~]# tar zxf nginx-1.10.2.tar.gz

[root@www ~]# cd nginx-1.10.2/

[root@www ~]# groupadd www#添加www组

[root@www ~]# useradd -g www www -s /sbin/nologin#创建nginx运行账户www并加入到www组,不允许www用户直接登录系统

[root@www nginx-1.10.2]# ./configure --prefix=/usr/local/nginx1.10 --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=www --group=www

[root@www nginx-1.10.2]# make&& make install

修改日志类型为json  

[root@rocketmq-nameserver2 soft]# vim nginx/conf/nginx.conf

#添加如下内容

log_format 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",'

                '"url":"$uri",'

                '"referer":"$http_referer",'

                '"agent":"$http_user_agent",'

                '"status":"$status"}';

    access_log  logs/access.log  json;

 2)安装部署Filebeat

tar xf filebeat-6.0.1-linux-x86_64.tar.gz 

cd filebeat-6.0.1-linux-x86_64

编写收集文件:

filebeat.prospectors:

- input_type: log

  paths:

    - /var/log/*.log

- input_type: log

  paths:

    - /aebiz/soft/nginx/logs/*.log

  encoding: utf-8

  document_type: my-nginx-log

  scan_frequency: 10s

  harvester_buffer_size: 16384

  max_bytes: 10485760

  tail_files: true

output.redis:

  enabled: true

  hosts: ["192.168.10.243"]

  port: 6379

  key: filebeat

  db: 0

  worker: 1

  timeout: 5s

  max_retries: 3

启动

[root@~ filebeat-6.0.1-linux-x86_64]# ./filebeat -c filebeat2.yml

后台启动

[root@~ filebeat-6.0.1-linux-x86_64]# nohup  ./filebeat -c filebeat2.yml &

八.收集端编写logstash文件

[root@bogon config]# vim 02-logstash.conf

input {

    redis {

      host => "192.168.10.243"

  port => "6379"

      data_type => "list"

      key => "filebeat"

      type => "redis-input"

    }

}

filter {

    json {

      source => "message"

      remove_field => "message"

    }

}

output {

    elasticsearch {

      hosts => ["192.168.10.243:9200"]

      index => "logstash-nginx-%{+YYYY.MM.dd}"

      document_type => "nginx"

      # template => "/usr/local/logstash-2.3.2/etc/elasticsearch-template.json"

      workers => 1

  }

}

启动前检查  -t 参数

[root@bogon config]# /data/application/logstash-6.0.1/bin/logstash -t -f /data/application/logstash-6.0.1/config/02-logstash.conf

Configuration OK[2018-05-06T14:11:26,442][INFO ][logstash.runner ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash

启动

[root@bogon config]# /data/application/logstash-6.0.1/bin/logstash-f /data/application/logstash-6.0.1/config/02-logstash.conf

[2018-05-06T14:12:06,694][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}[2018-05-06T14:12:07,317][WARN ][logstash.outputs.elasticsearch] You are using a deprecated config setting "document_type" set in elasticsearch. Deprecated settings will continue to work, but are scheduled for removal from logstash in the future. Document types are being deprecated in Elasticsearch 6.0, and removed entirely in 7.0. You should avoid this feature If you have any questions about this, please visit the #logstash channel on freenode irc. {:name=>"document_type", :plugin=>["192.168.10.243:9200"], index=>"logstash-nginx-%{+YYYY.MM.dd}", document_type=>"nginx", workers=>1, id=>"a8773a7416ee72eecc397e30d8399a5da417b6c3dd2359fc706229ad8186d12b">}  ..........

后台启动 

[root@bogon config]# nohup  /data/application/logstash-6.0.1/bin/logstash -t -f /data/application/logstash-6.0.1/config/02-logstash.conf &

九,启动各组件

查看redis是否收到filebeat发送key为filebeat的数据

[root@elk config]# /data/application/redis-3.0.5/bin/redis-cli

127.0.0.1:6379> keys *

(empty list or   )  #我的为空,数据是被logstash取走了

启动顺序由左到右Elasticsearch-àKibana--àLogstash

启动es

[root@elk config]# su - elk

[elk@elk ~]$ /data/application/elasticsearch-6.0.1/bin/elasticsearch

启动kibana

[root@elk etc]# /data/application/kibana-6.0.1-linux-x86_64/bin/kibana

启动logstah

[root@bogon config]# /dahta/application/logstash-6.0.1/bin/logstash -f /data/application/logstash-6.0.1/config/02-logstash.conf

客户端启动filebeat

[root@rocketmq-nameserver2 filebeat-6.0.1-linux-x86_64]# ./filebeat -c filebeat2.yml

十.访问kibana添加索引



参考:

http://www.ywnds.com/?p=9776

下篇

x-pack、head、ksof 组件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容