ELK 分布式日志处理

来源:互联网 发布:代码编程制作 编辑:程序博客网 时间:2024/06/06 03:22


1:UV和PV的区别
2:讲解应用分层
3:分析的日志源应该来自于哪个层面
4:分析日志,到底分析什么
5:使用什么分析,自研Python程序,ELK开源解决方案
5:推荐系统的算法

(一)简要介绍ElasticSearch + Lucene(solr:数据搜索组件)(构建搜索引擎)


Alt text

  • 概念说明
1:什么是document
具有K/V键值对的结构模型,一般可以称之为document,例如:JSON格式的文档,在Lucene里面是Field:Value,F/V键值对
2: 什么是索引:(使用倒排索引创建索引项)
这里的索引就是相当于MySQL中的表,有多个索引项(document)组成,使得document切分出来的word,能够被创建为索引项。那么用户通过输入对应的word,能够匹配到对应的索引项,就能取出索引项对应的值,这里的值一般是页面数据。索引必须使用小写字母表示
3:什么是shard(分片)
将一个index分割为多个shard,所有的primary shard组合成为一个index

(二)ElasticSearch 详解

ElasticSearch是一个基于Lucene的搜索组件,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。且还是一个文档存储容器,
开源的 Elastic Stack下载路径:https://www.elastic.co/cn/products

Alt text

  • ElasticSearch集群的components
1:节点:
一个 ElasticSearch Instance 就是一个节点,实现数据存储,以及搜索数据,
2:集群:
ElasticSearch中可以定义多个集群,集群的名称必须唯一,一个节点只能属于一个集群,不能交叉
3:片区:
通过shard机制,实现索引数据分布式存储,默认是五个shard,可以被用户指定,无法动态修改,也就是说将索引中的数据切分为多个shard,且分别存储在不同的节点上,实现数据分布式访问。且每一个shard都有一个primary shard和一个replica shard,实现数据冗余,且replica shard可以被用户指定,可以动态修改
  • ElasticSearch 主要概念说明
1:索引:
相当于表,document的集合
2:类型:
相当于表结构,document的结构
3:文档:
文档使用json格式表示,是field的集合
4:映射:
实现切词分析,排序分析
  • ElasticSearch 集群的工作原理
各个节点之间以多播方式通信,且通过TCP的9300端口通信,基于节点名称通信。集群中必须定义一个主节点,用于管理集群。主节点会决定哪个shard是primary,且查找replica shard。如果集群中添加一个新的节点,那么shard均衡将会被ElasticSearch集群自动处理。集群的状态包括:greenred、yellow。
  • 下载安装(Java的JDK必须是最新的,底层是Java语言写的,因此需要安装JDK java开发包)
##### 提示:Java 的JDK必须是符合当前版本需求的。这里安装2.x版本,先不使用5.x版本
参考文档:https://www.elastic.co/guide/index.html
RPM包安装:
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.4.4/elasticsearch-2.4.4.rpm
https://www.elastic.co/downloads/past-releases/elasticsearch-2-0-0
源码安装:
温馨提示:如果想用最新版本的Elasticsearch,那么需要先升级系统的JDK环境
先看看系统的JDK版本:yum list all | grep jdk
直接安装最新版本(如果最新JDK满足Elasticsearch对JDK的要求)
yum install -y java-1.8.0-openjdk.x86_64
yum install -y java-1.8.0-openjdk-devel.x86_64
yum install -y java-1.8.0-openjdk-headless.x86_64
  • 配置文件介绍
config目录下有2个配置文件:es的配置文件(elasticsearch.yml) 和日志配置文件(logging.yml
cluster.name: elasticsearch
配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
node.name: "Franz Kafka"
节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。
node.master: true
指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
node.data: true
指定该节点是否存储索引数据,默认为true。
index.number_of_shards: 5
设置默认索引分片个数,默认为5片。
index.number_of_replicas: 1
设置默认索引副本个数,默认为1个副本。
path.conf: /path/to/conf
设置配置文件的存储路径,默认是es根目录下的config文件夹。
path.data: /path/to/data
设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,例:
path.data: /path/to/data1,/path/to/data2
path.work: /path/to/work
设置临时文件的存储路径,默认是es根目录下的work文件夹。
path.logs: /path/to/logs
设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins: /path/to/plugins
设置插件的存放路径,默认是es根目录下的plugins文件夹
bootstrap.mlockall: true
设置为true来锁住内存。因为当jvm开始swapping时es的效率会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过`ulimit -l unlimited`命令。
network.bind_host: 192.168.0.1
设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0
network.publish_host: 192.168.0.1
设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
network.host: 192.168.0.1
这个参数是用来同时设置bind_host和publish_host上面两个参数。
transport.tcp.port: 9300
设置节点间交互的tcp端口,默认是9300
transport.tcp.compress: true
设置是否压缩tcp传输时的数据,默认为false,不压缩。
http.port: 9200
设置对外服务的http端口,默认为9200
http.max_content_length: 100mb
设置内容的最大容量,默认100mb
http.enabled: false
是否使用http协议对外提供服务,默认为true,开启。
gateway.type: local
gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置方法下次再详细说。
gateway.recover_after_nodes: 1
设置集群中N个节点启动时进行数据恢复,默认为1
gateway.recover_after_time: 5m
设置初始化数据恢复进程的超时时间,默认是5分钟。
gateway.expected_nodes: 2
设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。
cluster.routing.allocation.node_initial_primaries_recoveries: 4
初始化数据恢复时,并发恢复线程的个数,默认为4
cluster.routing.allocation.node_concurrent_recoveries: 2
添加删除节点或负载均衡时并发恢复线程的个数,默认为4
indices.recovery.max_size_per_sec: 0
设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。
indices.recovery.concurrent_streams: 5
设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5
discovery.zen.minimum_master_nodes: 1
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4
discovery.zen.ping.timeout: 3s
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。
discovery.zen.ping.multicast.enabled: false
设置是否打开多播发现节点,默认是true。
discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
  • 配置Java环境 启动服务
1:查看当前的Java JDK版本,是否符合要求,下载的为2.4.4版本,因此满足条件
[root@7 ~]# java -version
openjdk version "1.8.0_65"
2:指定JAVA_HOST的环境变量所在路径
编辑/etc/profile.d/java.sh文件,添加
export JAVA_HOME=/usr
. /etc/profile.d/java.sh
3:安装java-1.8.0-openjdk-devel.x86_64包
yum install -y java-1.8.0-openjdk-devel.x86_64(这里应该将JDK跟新至最新版本了)
4:下载ElasticSearch
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.4.4/elasticsearch-2.4.4.rpm
5:安装ElasticSearch
yum install -y elasticsearch-2.4.4.rpm
6:编辑配置文件/etc/elasticsearch/elasticsearch.yml
cluster.name: yhy-es (修改集群名称)
node.name: yhy-node-1 (修改节点的名称)
transport.tcp.port 9300 (默认集群内部通信端口)
http.port: 9200 (默认介绍数据查询端口)
network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["192.168.23.10"]
discovery.zen.ping.multicast.enabled: true
7:启动elasticsearch
systemctl daemon-reload (重新载入 systemd,扫描新的或有变动的单元)
systemctl start elasticsearch.service
8:再启动两个虚拟机作为node2 和 node3
9:拷贝环境配置文件
scp /etc/profile.d/java.sh 192.168.23.11:/etc/profile.d/
scp /etc/profile.d/java.sh 192.168.23.12:/etc/profile.d/
10:在对应的主机上执行
. /etc/profile.d/java.sh
11:把elasticsearch-2.4.4.rpm拷贝到node2 和 node3
scp /root/elasticsearch-2.4.4.rpm 192.168.23.11:/root
scp /root/elasticsearch-2.4.4.rpm 192.168.23.12:/root
12:分别安装
yum install -y elasticsearch-2.4.4.rpm
13:将node1上的配置文件复制到node2和node3
scp /etc/elasticsearch/elasticsearch.yml 192.168.23.11:/etc/elasticsearch/
scp /etc/elasticsearch/elasticsearch.yml 192.168.23.12:/etc/elasticsearch/
14:修改下节点名,集群名称不变
node.name: yhy-node-2 (修改节点的名称)
node.name: yhy-node-3 (修改节点的名称)
15:启动node2和node3的elasticsearch
systemctl daemon-reload
systemctl start elasticsearch.service
16:必须保证节点直接可以相互通信,抓包看看报文信息
tcpdump -i enp0s3 -nn tcp port 9300

(二)ElasticSearch API 简要介绍

调用其API会返回很多信息,例如集群的信息,节点的信息等

  • 检查集群的状态----Restful API说明
1:检查集群状态信息
2:管理集群
3:执行 增删改查 命令
4:执行高级命令
  • Restful API的访问接口
### 下面的API可以在浏览器中查看,也可以使用curl -X GET 命令查看
# 显示单台节点的信息
http://192.168.23.10:9200
http://192.168.23.10:9200/?pretty (使用美化的形式查看json数据)
# 使用_cat API查询
http://192.168.23.10:9200/_cat (可以查看许多API接口)
例如:http://192.168.23.10:9200/_cat/nodes(节点个数)
例如:http://192.168.23.10:9200/_cat/nodes?v(信息信息)
# 使用_cluster API查询
1:stats
2:health
3:state
4:nodes
http://192.168.23.10:9200/_nodes/health
http://192.168.23.10:9200/_cluster/health
http://192.168.23.10:9200/_cluster/health?pretty

(三)ElasticSearch Plugins 简要介绍

ElasticSearch提供了很多丰富的插件,能够给我们很直观的管理集群和查看集群

  • 安装插件
1:将插件放入插件的目录中,就像PHP一样安装插件, 插件目录在/usr/share/elasticsearch/plugins
2:使用plugin命令安装
/usr/share/elasticsearch/bin/plugin ,如果经常使用,可以将插件命令写入环境变量PAHT中
/usr/share/elasticsearch/bin/plugin --help
install Install a plugin
remove Remove a plugin
list List installed plugins
/usr/share/elasticsearch/bin/plugin install --help
3:安装插件
/usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf
/usr/share/elasticsearch/bin/plugin install license
/usr/share/elasticsearch/bin/plugin install marvel-agent
4:在浏览器上就可以访问创建提供的接口
192.168.23.10:9200/_plugin/head
192.168.23.10:9200/_plugin/kopf
  • 手动创建document(文档的数值类型有:字符串,数值,布尔,时间)
1:手动创建index、document
curl -X PUT '192.168.23.10:9200/uplooking/ops/dage?pretty' -d '{"name": "dage", "age": 20}'
{
"_index" : "uplooking",
"_type" : "ops",
"_id" : "dage",
"_version" : 1,
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"created" : true
}
curl -X PUT '192.168.23.10:9200/uplooking/ops/xiaoge?pretty' -d '{"name": "xiaoge", "age": 20}'
{
"_index" : "uplooking",
"_type" : "ops",
"_id" : "xiaoge",
"_version" : 1,
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"created" : true
}
2:取出通过index取出document
curl -X GET '192.168.23.10:9200/uplooking/ops/xiaoge?pretty'
{
"_index" : "uplooking",
"_type" : "ops",
"_id" : "xiaoge",
"_version" : 1,
"found" : true,
"_source" : {
"name" : "xiaoge",
"age" : 20
}
}
  • 手动修改document
curl -X POST 192.168.23.10:9200/uplooking/ops/xiaoge/_update?pretty -d '{ "doc": {"age": 19} }'
{
"_index" : "uplooking",
"_type" : "ops",
"_id" : "xiaoge",
"_version" : 2,
"found" : true,
"_source" : {
"name" : "xiaoge",
"age" : 19
}
}
  • 手动删除document
curl -X DELETE 192.168.23.10:9200/uplooking/ops/dage?pretty
  • 查看当前的索引
curl -X GET 192.168.23.10:9200/_cat/indices?v
  • 删除索引
curl -X DELETE 192.168.23.10:9200/uplooking
  • 搜索数据(查询数据) DSL查询语言介绍使用这个工具查看:http://www.bejson.com/jsonviewernew/
1:使用restful API查询(query DSL)
curl -X GET 192.168.23.10:9200/uplooking/_search?pretty(查询uplooking索引的文档)
curl -X GET 192.168.23.10:9200/_search?pretty (查询所有索引的文档)
2:使用rest 查询(filter DSL,速度较快,可以缓存查询结果)
curl -X GET '192.168.23.10:9200/uplooking/_search?pretty' -d '{ "query": { "match_all": {}} }'
curl -X GET '192.168.23.10:9200/uplooking/_search?pretty' -d '{ "query": { "term": { "age": 20 }} }'
curl -X GET '192.168.23.10:9200/uplooking/_search?pretty' -d '{ "query": { "terms": { "age": [19, 20] }} }'
  • 映射和分析 mapping and analysis
# 全key扫描,不要指定查询的key
curl -X GET '192.168.23.10:9200/uplooking/_search?q=20&pretty'
# 指定key扫描,指定查询的key
curl -X GET '192.168.23.10:9200/uplooking/_search?q=age:20&pretty'
# 使用_mapping查看数值类型
curl -X GET '192.168.23.10:9200/uplooking/_mapping/ops?pretty'
# 分析
需要使用分词工具

(四)ELK Stack 简要介绍

ES是一个强大的,通用的索引组,其他的组件都可以自行开发

Alt text

  • Logstash 安装(依赖于jruby编译器,因此需要配置Java环境)
1:查看当前的Java JDK版本,是否符合要求,下载的为2.4.4版本,因此满足条件
[root@7 ~]# java -version
openjdk version "1.8.0_65"
2:指定JAVA_HOST的环境变量所在路径
编辑/etc/profile.d/java.sh文件,添加
export JAVA_HOME=/usr
. /etc/profile.d/java.sh
3:安装java-1.8.0-openjdk-devel.x86_64包
yum install -y java-1.8.0-openjdk-devel.x86_64(这里应该将JDK跟新至最新版本了)
4: 下载RPM包,或者配置yum源
①:https://www.elastic.co/downloads/past-releases/logstash-2-4-0
②:https://www.elastic.co/guide/en/logstash/2.4/installing-logstash.html
5:安装完毕之后,将其命令添加至PATH中
编辑/etc/profile.d/logstash.sh,添加
export PATH=/opt/logstash/bin:$PATH
. /etc/profile.d/logstash.sh
6:logstash的配置文件用于指定插件的运作机制,支持四种插件:inputfilter、codec、output,编辑/etc/logstash/conf.d/easy.conf,这里至写了三种插件,filter插件使用其默认值
# 指定数据从哪里来
input {
stdin {}
}
# 指定数据到哪里去
output {
stdout {
codec => rubydebug
}
}
7:检查配置文件是否正确
logstash -f /etc/logstash/conf.d/easy.conf --configtest
8:运行logstash
logstash -f /etc/logstash/conf.d/easy.conf
9:运行之后,直接在底下输入一条日志数据,让其清洗,返回的应该是json的数据
Oct 3 15:17:21 7 NetworkManager[531]: <info> (enp0s3): device state change: secondaries -> activated (reason 'none') [90 100 0]
{
"message" => "Oct 3 15:17:21 7 NetworkManager[531]: <info> (enp0s3): device state change: secondaries -> activated (reason 'none') [90 100 0]",
"@version" => "1",
"@timestamp" => "2017-10-04T14:31:00.987Z",
"host" => "7"
}
10:参考文档
https://www.elastic.co/guide/en/logstash/2.4/index.html
  • Logstash 常用插件介绍
1:input 插件
①:file:监听文件的最后一行,就是tail -f 一样
创建一个/etc/logstash/conf.d/file.conf,内容如下:
input {
file {
# 指明文件路径,这里使用列表的形式,表示可以读取多个文件
path => ["/var/log/messages"]
# 指明类型为system类型
type => "system"
# 指定读取的起始位置,如果"end",将会从文件结尾处开始读取
start_position => "beginning"
}
}
output {
stdout {
# 指定编码格式
codec => rubydebug
}
}
# 检查配置文件正确性
logstash -f /etc/logstash/conf.d/file.conf --configtest
# 运行logstash
logstash -f /etc/logstash/conf.d/file.conf
②:udp:使用udp连接获取数据,必须指明的参数为port,自己监听的端口,host指明监听的地址
首先必须安装collectd程序,collectd是一个守护(daemon)进程,用来定期收集系统和应用程序的性能指标,同时提供了机制,以不同的方式来存储这些指标值,这里将collectd安装在logstash服务器本地。推荐一篇文章:https://linux.cn/article-5252-1.html ,到时候,可以使用Python的多线程多进程模型完成collectd的功能
# 安装collectd
yum install -y collectd
# 编辑配置文件
vi /etc/collectd.conf
Hostname "localhost"
打开LoadPlugin network
添加network插件的配置
<Plugin network>
# 指明将数据发送给192.168.23.13的25826端口
<Server "192.168.23.13" "25826">
</Server>
</Plugin>
# 运行collectd
systemctl start collectd.service
# 查看
systemctl status collectd.service
# 创建/etc/logstash/conf.d/udp.conf,添加内容如下
input {
udp {
# 指明监听的端口
port => 25826
# 指明编码
codec => collectd {}
# 指明由collectd发送的信息都解析
type => "collectd"
}
}
output {
stdout {
# 指定编码格式
codec => rubydebug
}
}
# 运行logstash
logstash -f /etc/logstash/conf.d/udp.conf
2:redis插件
从Redis中获得数据,什么是Redis,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。支持redis 通道(channel)和 列表(lists)
3:filter插件:信息有input插件输入,filter插件将信息过滤,清洗,之后再有output插件输出
①:grok插件介绍:清洗文本数据,最常用就是清洗web日志,这个功能Python可以做
grok正则匹配文件:/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns
grok语法说明:
# 如果是匹配到192.168.23.111 那么就清洗为clientip: 192.168.23.111
COMMONAPACHELOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)
官方示例:https://www.elastic.co/guide/en/logstash/2.4/plugins-filters-grok.html
# 创建/etc/logstash/conf.d/grok.conf,添加内容如下
input {
file {
# 指明文件路径,这里使用列表的形式,表示可以读取多个文件
path => ["/var/log/httpd/access_log"]
# 指明类型为system类型
type => "system"
# 指定读取的起始位置,如果"end",将会从文件结尾处开始读取
start_position => "end"
}
}
filter {
grok {
# 指定匹配的正则表达式
# match => { "message" => "%{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}" }
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
output {
stdout {
# 指定编码格式
codec => rubydebug
}
}
# 检查配置文件
# 运行logstash
温馨提示:网上有很多别人写好的Nginx日志匹配的规则,直接复制,例如
URIPARM1 [A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]*
URIPATH1 (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%&_\- ]*)+
URI1 (%{URIPROTO}://)?(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?
NGINXACCESS %{IPORHOST:remote_addr} - (%{USERNAME:user}|-) \[%{HTTPDATE:log_timestamp}\] %{HOSTNAME:http_host} %{WORD:request_method} \"%{URIPATH1:uri}\" \"%{URIPARM1:param}\" %{BASE10NUM:http_status} (?:%{BASE10NUM:body_bytes_sent}|-) \"(?:%{URI1:http_referrer}|-)\" (%{BASE10NUM:upstream_status}|-) (?:%{HOSTPORT:upstream_addr}|-) (%{BASE16FLOAT:upstream_response_time}|-) (%{BASE16FLOAT:request_time}|-) (?:%{QUOTEDSTRING:user_agent}|-) \"(%{IPV4:client_ip}|-)\" \"(%{WORD:x_forword_for}|-)\"
  • Redis 简要介绍--用于讲解消息中间件
1:安装 Redis
yum install -y redis
2:编辑配置文件/etc/redis.conf,Redis作为一个消息中间件,那么应该监听于本机的外网socket上,因此修改
bind: 0.0.0.0
3:启动Redis
systemctl start redis
4:output插件
①:elasticsearch
②:redis
# 创建/etc/logstash/conf.d/redis.conf,添加内容如下
input {
file {
# 指明文件路径,这里使用列表的形式,表示可以读取多个文件
path => ["/var/log/httpd/access_log"]
# 指明类型为system类型
type => "httpdLog"
# 指定读取的起始位置,如果"end",将会从文件结尾处开始读取
start_position => "end"
}
}
filter {
grok {
# 指定匹配的正则表达式
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
output {
redis {
# 指明Redis监听的端口
port => "6379"
# 指明Redis主机的地址
host => ["192.168.23.13"]
# 指明Redis保存数据的类型,这里使用列表的形式,模拟消息队列
data_type => "list"
# 指明key值
key => "logstash"
}
}
# 检查配置文件
logstash -f /etc/logstash/conf.d/redis.conf --configtest
# 运行logstash
logstash -f /etc/logstash/conf.d/redis.conf
# 请求httpd之后,会产生信息,日志的清洗结果会聚合到Redis中,连接进入Redis
redis-cli
# 查看Redis的list的长度
LLEN logstash
# 查看一条document信息
LINDEX logstash 10
  • 再启动一台主机作为一台logstash-master端(192.168.23.14)
1:指定JAVA_HOST的环境变量所在路径
编辑/etc/profile.d/java.sh文件,添加
export JAVA_HOME=/usr
. /etc/profile.d/java.sh
2:安装java-1.8.0-openjdk-devel.x86_64包
yum install -y java-1.8.0-openjdk-devel.x86_64(这里应该将JDK跟新至最新版本了)
3: 下载RPM包,或者配置yum源
①:https://www.elastic.co/downloads/past-releases/logstash-2-4-0
②:https://www.elastic.co/guide/en/logstash/2.4/installing-logstash.html
4:安装完毕之后,将其命令添加至PATH中
编辑/etc/profile.d/logstash.sh,添加
export PATH=/opt/logstash/bin:$PATH
. /etc/profile.d/logstash.sh
5:编辑配置文件/etc/logstash/conf.d/server.conf,添加
input {
redis {
# 指明Redis监听的端口
port => "6379"
# 指明Redis主机的地址
host => ["192.168.23.13"]
# 指明Redis保存数据的类型,这里使用列表的形式,模拟消息队列
data_type => "list"
# 指明key值
key => "logstash"
}
}
output {
stdout {
codec => rubydebug
}
}
6:检查语法
logstash -f /etc/logstash/conf.d/server.conf --configtest
7:启动logstash
logstash -f /etc/logstash/conf.d/server.conf
8:再次请求httpd,logstash-master是否有数据输出

(五)Kibana 简要介绍


  • 安装兼容ES的Kibana程序, 在ES的主节点安装即可
# 官方文档说明
https://www.elastic.co/guide/en/kibana/4.6/setup-repositories.html
# 配置yum仓库
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
vi /etc/yum.repos.d/kibana.repo
yum repolist
# 安装kibana
yum install -y kibana
# 编辑配置文件/opt/kibana/config/kibana.yml,因为此时kibana与ES安装在同一台主机上
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"
# 启动kibana,查看监听的端口是否已经打开
systemctl start kibana.service
# 使用web界面打开kibana
http://192.168.23.10:5601
  • 修改logstash-master的配置文件/etc/logstash/conf.d/server.conf
input {
redis {
port => "6379"
host => ["192.168.23.13"]
data_type => "list"
key => "logstash"
}
}
output {
elasticsearch {
hosts => ["192.168.23.10:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
  • 重新启动logstash-master节点
# 检查配置文件
logstash -f /etc/logstash/conf.d/server.conf --configtest
# 启动服务
logstash -f /etc/logstash/conf.d/server.conf
  • 请求web服务器,让web服务器产生日志信息,再通过ES的_cat API接口,查看由logstash写入的index
# 使用命令接口查看
curl -X GET "192.168.23.10:9200/_cat/indices"
# 也可以使用插件查看,看看document的值是否被清洗成功
http://192.168.23.10:9200/_plugin/head/
  • 再次访问kibana图形化web接口
http://192.168.23.10:5601

(六)ELK stack 总结


  • logstash 使用systemctl启动的时候,在/etc/logstash/conf.d/目录下的配置文件,只能够有一个
# logstash-agent
/etc/logstash/conf.d/redis.conf
# logstash-agent
/etc/logstash/conf.d/server.conf
  • 文档中的 ELK stack 架构图示

Alt text

  • logstash-agent端的架构演变
1:对于日式的搜集工具可以不是logstash,很多小公司可以自己写一个Python程序,或者写一个go程序,或者使用lumberjack
2:对于消息中间件可以使用kafka
3:对于kibana可以使用自研的web程序,读取ES中的数据