2017 12-01 ELK的应用
一.搜索引擎的介绍
(1)索引组件:获取数据-->建立文档-->文档分析-->文档索引(倒排索引)
(2)搜索组件:用户搜索接口-->建立查询(将用户键入的信息转换为可处理的查询对象)-->搜索查询-->展现结果
索引组件:Lucene(apache 旗下的产品)
Lucene Core:Apache Lucene™ 是一个高性能,全功能的文本搜索引擎库,全部由Java编写。其技术上几乎适合任何需要全文搜索的应用程序,尤其是对跨平台的应用。
(3)搜索组件:Solr, ElasticSearch(基于Lucene core来工作的搜索组件)
- Solr(企业级搜索应用服务器):是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
- ElasticSearch: 是一个分布式的 RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中存储数据,可以发现意料之中以及意料之外的情况。
二.Elastic Stack
(1)ELK的组成
1.ElasticSearch
2.Logstash:
Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源采集数据、转换数据,然后将数据发送到指定的的 “存储库” 中。
3.Kibana:
Kibana 让您能够可视化 Elasticsearch 中的数据并操作 Elastic Stack,因此您可以在这里解开任何疑问。
4.Beats:
平台集合了多种单一用途数据采集器。这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。
(2)ELS集群的工作逻辑
1.多播,单播:9300(集群端口)/tcp,服务器端口:9200
2.关键因素:clustername
所有的节点选举一个主节点,负责管理整个集群状态以及各shards(切片,默认切为5个分片)的分布式方式
三种状态:green yellow red
green:健康状态,所有主副切片都存在
Yellow:缺少某些切片,但是可以恢复
red:缺少某些切片,并且不可恢复
3.实验:创建一个小的集群
步骤:
(1)配置三个节点并安装ES,官方下载地址:www.elastic.co选择download——选择rpm包进行下载
因为该搜索引擎是基于java语言开发的所以要安装jvm
yum install java-1.8.0-openjdk-devel,其他两个节点做相同操作
(2)创建新的目录
mkdir -pv /els/{data,logs}
chown -R /els/*
(3)修改配置文件
vim /etc/elasticsearch/elasticsearch.yml
修改如下
cluster.name: myels1
node.name: node1
path.data: /els/data
path.logs: /els/logs
network.host: 172.18.254.242
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node3","node4"]
discovery.zen.minimum_master_nodes: 2——选举机制防止脑裂,同意机制必须超过半数
其他节点同上,只需要将节点名和network.host修改即可
启动之前还要vim jvm.options
搜狗截图20171206204908.png
修改完成后systemctl start elasticsearch.service
观察9200和9300端口是否打开
搜狗截图20171206205102.png
(4)使用curl进行测试
curl -XGET '172.18.254.242:9200/'
搜狗截图20171206205307.png
curl -XGET '172.18.250.223:9200/'
搜狗截图20171206205340.png
curl -XGET '172.18.254.242:9200/_cluster/?pretty'——漂亮模式显示
4.三个特殊端点
(1)/_cluster
curl -XGET '172.18.254.242:9200/_cluster/?pretty'——漂亮模式显示
(2),/_cat
curl -XGET '172.18.254.242:9200/_cat/indices?pretty'
查看文档命令,正常为空,所以可以使用-XPUT来创建文档
实验创建一个书的文档,名字为computer(分类名)
curl -XGET '172.18.254.242:9200/books/computer/1' -d '{
"name": "Elasticsearch in Action",——书的名字
"date": "DEC3,2015",——日期
"author": "Radu"——作者
}'
(3)/_search
curl -XGET '172.18.254.242:9200'/books/computer/_search?pretty' ——查看有关computer的所有匹配到文档
搜狗截图20171206225020.png
curl -XGET '172.18.254.242:9200/books/computer/_search?pretty' -d '
{
"query": {
"match_all": {}
}
}'
属于query模式的全部匹配模式
搜狗截图20171207091224.png
curl -XGET '172.18.254.242:9200/books/computer/_search?q=elasticsearch&pretty=true'
搜狗截图20171207091947.png
curl -XGET '172.18.254.242:9200/books/computer/_search?q=_all:kubernete&pretty=true'——查询一本名叫kubernete的书
搜狗截图20171207092143.png
curl -XGET '172.18.254.242:9200/books/computer/_search?q=_all:kubernete~&pretty=true'——加入波浪符代表模糊匹配允许字符有一个不相同
(3)安装elasticsearch-head插件
通过该插件可以实现在web端对elasticsearch集群的管理
1.vim /etc/elasticsearch/elasticsearch.yml
搜狗截图20171207093004.png
2.安装head
git clone htttp://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
执行npm install npm run start &——后台启动并运行
ss -ntl 发现9100端口被打开
重启elasticsearch.service
此时可以在web页面上管理集群
搜狗截图20171207095659.png
三.logstash
在上述中已经介绍了logstash的作用,其主要的作用就是对来源数据采集(input),转换数据(filter),发送数据(output)到指定的存储库
在官网上下载www.ealstic.co/download/logstash-5.5.1.rpm
然后rpm -ivh logstash-5.5.1.rpm
rpm -ql logstash |less
搜狗截图20171207101025.png
/usr/share/logstash/bin/logstash --help来查看帮助
其中最常用的是-t和-f,-t用来检查语法,-f指定要启动哪个文件
- 例:
cd /etc/logstash/conf.d
vim test.conf
input {
stdin {}
}
output {
stdout {}
}
搜狗截图20171207101025.png
vim test.conf
input {
stdin {}
}
output {
stdout {
codec => rubydebug
}
}
搜狗截图20171207102323.png
logstash中三个重要的插件
1.input plugins
搜狗截图20171207102829.png
[图片上传中...(搜狗截图20171207103040.png-91526f-1512613953070-0)]
2.filter plugins
搜狗截图20171207103040.png
3.output plugins
搜狗截图20171207103148.png
主要查件的介绍与使用
(1)input中的file方式来获取数据
vim test.conf
input {
file {
path => ["/var/log/httpd/access_log"]
start_position => "beginning"
}
}
output {
stdout {
codec => rubydebug
}
}
在另一个客户端访问node4的httpd
curl http//:172.18.250.89/
执行/usr/share/logstash/bin/logstash -f ./test.conf
搜狗截图20171207104831.png
(2)filter查件——grok
grok的作用是将各种描述信息按照需要进行切分
搜狗截图20171207105355.png
vim test.conf
加入filter
input {
file {
path => ["/var/log/httpd/access_log"]
start_position => "beginning"
}
}
filter {
grok {
match => {
"message" => "%{COMBINEDAPACHELOG}"
}
}
}
output {
stdout {
codec => rubydebug
}
}
/usr/share/logstash/bin/logstash -f ./test.conf
搜狗截图20171207110050.png
(3)output的file文件
指定输出内容到某指定的路径文件中去
vim test.conf
将output修改即可
output {
file {
path => ["/tmp/httpd_access_log.json"]
}
}
检查语法没有错误后,执行test.conf
搜狗截图20171207111131.png
(4)output elasticsearch
output {
elasticsearch{
hosts=> ["http://172.18.254.242:9200","http://172.18.250.223:9200"]
index => "logstash-%{+YYYY.MM.dd}"
action => "index"——构建索引
}
}
检查语法正确就可以执行
输出的数据就会存储到elasticsearch集群的并新建了一个logstash
在elasticsearch集群中使用curl命令来访问node3
搜狗截图20171207113458.png
此时在elasticsearch集群中就可以查询访日的内容
搜狗截图20171207113734.png
只搜索集群的某个地址
curl -XGET '172.18.250.223:9200/logstash-*/_search?q=clientip=172.18.250.223&pretty'
搜狗截图20171207113931.png
(5)beats插件
Beats 平台集合了多种单一用途数据采集器。这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。
官网下载beats
rpm -ql filebeat
注意:filebeat本身可以直接将输出数据输送到elasticsearch中,也可以先发送到logstash.service,然后由logstash发送到elasticsearch中
本实验为了方便将filebeat和logstash放在同一主机上进行运行测试
配置文件 /etc/filebeat/filebeat.yml
vim /etc/filebeat/filebeat.yml
-input_type: log
paths:
- /var/log/httpd/access_log*
output.elasticsearch:
hosts: ["172.18.254.242:9200", "172.18.250.223:9200"]
protocol: "http"
上述配置是将输出数据直接发送到elasticsearch中
curl命令测试一下
搜狗截图20171207150841.png
搜狗截图20171207151022.png
再次编辑filebeat.yml配置文件进行修改,实现基于filebeat通过Logstash.service将数据发送到elasticsearch中
vim filebeat.yml
output.logstash:
hosts: ["172.18.250.89:5044"]
输入不变,只改变输出类型即可
并且还要修改/etc/logstash/conf.d/test.conf
input {
beats {
port => 5044
}
}
此时不需要执行/usr/share/logstash/bin/logstash -f ./test.conf
而是直接执行
systemctl start logstash.service
systemctl restart filebeat.service
ss -ntl 5044端口打开
搜狗截图20171207151829.png
搜狗截图20171207152259.png
curl -XGET '172.18.250.223:9200/logstash-*/_search?pretty'
搜狗截图20171207152444.png
(6)mutate插件
filter {
grok {
match => {
"message" => "%{COMBINEDAPACHELOG}"
}
}
mutate {
rename => {
"clientip" => "client_ip"
}
}
date {
match => ["timestamp","dd/MMM/YYYY:H:m:s Z"]
}
}
curl -XGET '172.18.250.223:9200/logstash-*/_search?q=clientip=172.18.250.223&pretty'
搜狗截图20171207175636.png
(7)geoip
vim geoip.conf
input {
beats {
port => 5044
}
}
filter {
match => {
"message" => "%{COMBINEDAPACHELOG}"
}
}
date {
match => ["timestamp","dd/MMM/YYYY:H:m:s Z"]
}
geoip {
source => "clientip"
target => "geoip"
database => "/etc/logstash/GeoLite2-City.mmdb"
}
}
output {
elasticsearch{
hosts=> ["http://172.18.254.242:9200","http://172.18.250.223:9200"]
index => "logstash-%{+YYYY.MM.dd}"
action => "index"
}
}
echo '72.18.250.223 - - [07/Dec/2017:18:13:41 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0" >> /var/log/httpd/access_log
echo 202.18.250.223 - - [07/Dec/2017:18:13:41 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0" '>> /var/log/httpd/access_log
将公网ip追加到httpd的日志文件中,否则用私网ip访问是无法显示ip地址的来源地区的
搜狗截图20171207220017.png
四.集群方式实现
搜狗截图20171207203542.png
具体实施步骤
(1)在node5上yum install java-1.8.0-openjdk-devel
rpm -ivh logstash-5.5.1.rpm
将之前的test.conf脚本复制到本机上
(2)在node6上 yum install httpd
rpm -ivh filebeat-5.5.1-x86_64.rpm
systemctl start httpd
vim /var/www/html/index.html
test node7
在elasticsearch中的服务上访问Node6的http服务
(3)编辑filebeat的配置文件
paths
- /var/log/httpd/access_log
开启output.logstash
hosts: ["172.18.250.62:5044"]——node5的ip地址
(4)在node5上配合redis服务
yum install redis
vim /etc/redis.conf
bind 0.0.0.0
requirepass magedu
启动redis
(5)编辑redis-input.conf
vim /etc/logstash/conf.d/redis-input.conf
修改input即可
input {
redis{
host => "172.18.250.89"
port => 6379
data_type => "list"
db => "0"
key => "filebeat"
password => "magedu"
}
}
在Node6 vim /etc/filebeat/filebeat.yml
自定义output.redis
搜狗截图20171207210123.png
重启filebeat.service
(6)在客户端多访问几次Node6的http服务
redis-cli -a magedu
LINDEX filebeat 0
LINDEX filebeat 1
LINDEX filebeat 2
搜狗截图20171207214017.png
搜狗截图20171207214105.png
在node5上检查redis.conf脚本没有错误后
执行该脚本
此时发现LINDEX中的filebeat文件消失了,这是因为redis中的filebeat数据被elasticsearch集群提走
综上可以将上述中的geoip.conf最为conf.d的配置守护文件,将其他文件移除到/root/目录下,然后开启logstash服务
五.基于kibana的集群访问
搜狗截图20171207220648.png
(1)在node5上rpm -ivh kibana-5.5.1-x86_64.rpm
vim /etc/kibana/kibana.yml
搜狗截图20171207221503.png
开启服务发现5601端口被打开
在web页面打开kibana
搜狗截图20171208204319.png
(2)在node6上
cd /var/log/httpd/
while true; do echo "$[$RANDOM%224+1].$[$RANDOM%256].$[$RANDOM%256].$[$RANDOM%255+1] - - [07/Dec/2017:22:32:53 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.29.0"" >> access_log;sleep 1;done
搜狗截图20171207224808.png
在kibana界面可以查询访问情况
搜狗截图20171208204543.png
此时就可以在kibana界面上来管理elasticsearch集群了
在kibana界面上可以观察geoip的相关信息
搜狗截图20171208204543.png
也可以通过图形的方式来进行监控和观察
搜狗截图20171208204919.png
根据自身要求来创建图形的显示方式
搜狗截图20171208205206.png
创建新的视图来显示客户端ip地址的地理位置
搜狗截图20171208205412.png
根据需要创建后来查看显示结果
搜狗截图20171208205708.png
以上图形如果想要以后继续查看可以点击save,并命令后保存即可
搜狗截图20171208210057.png
为了更好地视图的体验,可以通过编辑Dashbord来中和两个图形
搜狗截图20171208211105.png
其他选项,如在Visualize中,选择markdown进行文本编辑
搜狗截图20171208212211.png
搜狗截图20171208212309.png
搜狗截图20171206205307.png
搜狗截图20171206205340.png
搜狗截图20171206225020.png
搜狗截图20171207091224.png
搜狗截图20171207091947.png
搜狗截图20171207092143.png
搜狗截图20171207093004.png
搜狗截图20171207095659.png
搜狗截图20171207101025.png
搜狗截图20171207102829.png
搜狗截图20171207103040.png
搜狗截图20171207103148.png
搜狗截图20171207203542.png
搜狗截图20171207210123.png
搜狗截图20171207214017.png
搜狗截图20171207214105.png
搜狗截图20171207220648.png
搜狗截图20171207221503.png
搜狗截图20171208204319.png
搜狗截图20171207224808.png
搜狗截图20171208204543.png
搜狗截图20171208204543.png
搜狗截图20171208204919.png
搜狗截图20171208205206.png
搜狗截图20171208205412.png
搜狗截图20171208205708.png
搜狗截图20171208210057.png
搜狗截图20171208211105.png
搜狗截图20171208212211.png
搜狗截图20171208212309.png