一.搜索引擎的介绍
(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
修改完成后systemctl start elasticsearch.service
观察9200和9300端口是否打开
(4)使用curl进行测试
curl -XGET '172.18.254.242:9200/'
curl -XGET '172.18.250.223:9200/'
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的所有匹配到文档
curl -XGET '172.18.254.242:9200/books/computer/_search?pretty' -d '
{
"query": {
"match_all": {}
}
}'
属于query模式的全部匹配模式
curl -XGET '172.18.254.242:9200/books/computer/_search?q=elasticsearch&pretty=true'
curl -XGET '172.18.254.242:9200/books/computer/_search?q=_all:kubernete&pretty=true'——查询一本名叫kubernete的书
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
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页面上管理集群
三.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
/usr/share/logstash/bin/logstash --help来查看帮助
其中最常用的是-t和-f,-t用来检查语法,-f指定要启动哪个文件
- 例:
cd /etc/logstash/conf.d
vim test.conf
input {
stdin {}
}
output {
stdout {}
}
vim test.conf
input {
stdin {}
}
output {
stdout {
codec => rubydebug
}
}
logstash中三个重要的插件
1.input plugins
[图片上传中...(搜狗截图20171207103040.png-91526f-1512613953070-0)]
2.filter plugins
3.output plugins
主要查件的介绍与使用
(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
(2)filter查件——grok
grok的作用是将各种描述信息按照需要进行切分
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
(3)output的file文件
指定输出内容到某指定的路径文件中去
vim test.conf
将output修改即可
output {
file {
path => ["/tmp/httpd_access_log.json"]
}
}
检查语法没有错误后,执行test.conf
(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
此时在elasticsearch集群中就可以查询访日的内容
只搜索集群的某个地址
curl -XGET '172.18.250.223:9200/logstash-*/_search?q=clientip=172.18.250.223&pretty'
(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命令测试一下
再次编辑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端口打开
curl -XGET '172.18.250.223:9200/logstash-*/_search?pretty'
(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'
(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地址的来源地区的
四.集群方式实现
具体实施步骤
(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
重启filebeat.service
(6)在客户端多访问几次Node6的http服务
redis-cli -a magedu
LINDEX filebeat 0
LINDEX filebeat 1
LINDEX filebeat 2
在node5上检查redis.conf脚本没有错误后
执行该脚本
此时发现LINDEX中的filebeat文件消失了,这是因为redis中的filebeat数据被elasticsearch集群提走
综上可以将上述中的geoip.conf最为conf.d的配置守护文件,将其他文件移除到/root/目录下,然后开启logstash服务
五.基于kibana的集群访问
(1)在node5上rpm -ivh kibana-5.5.1-x86_64.rpm
vim /etc/kibana/kibana.yml
开启服务发现5601端口被打开
在web页面打开kibana
(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
在kibana界面可以查询访问情况
此时就可以在kibana界面上来管理elasticsearch集群了
在kibana界面上可以观察geoip的相关信息
也可以通过图形的方式来进行监控和观察
根据自身要求来创建图形的显示方式
创建新的视图来显示客户端ip地址的地理位置
根据需要创建后来查看显示结果
以上图形如果想要以后继续查看可以点击save,并命令后保存即可
为了更好地视图的体验,可以通过编辑Dashbord来中和两个图形
其他选项,如在Visualize中,选择markdown进行文本编辑