一、搜索引擎基础
搜索引擎是倒排索引,Elasticsearch必须成为索引才支持查询
搜索引擎两大组件:
搜索组件:搜索数据,运行查询,将查询结构显示给用户
索引组件:将获得的数据构建成能够让搜索引擎中的搜索功能完成数据查询
搜索引擎关键组件: 显示数据-->获取数据-->构建文档-->分析文档(切词,词法分析等操作,正规化的过程)-->索引文档--->索引(相当于数据库)---> 运行搜索-->构建搜索-->将结果呈现个用户
索引部分:lucene、sphinx
搜索部分:Solr(单机版,构建集群不容易)、Elasticsearch(集群服务)
lucene:分析文档,索引文档,索引,需要爬虫相关组件来获取数据,组合使用
Elasticsearch:搜索组件,只提供搜索,支持分布式
可以使多个多个分析器。构建查询,运行查询,把查询结果呈现个用户
Elasticsearch和lucene实现的功能:分析分档,索引分档,索引,构建查询,运行查询,将查询结果呈现个用户(命令行模式),缺少获取数据和简单版的用户界面需要其他组件来实现
用户界面:kibana
抓取数据组件:站内分析,如日志分析,需要在需要抓取数据服务器安装agent从而获取数据
构建文档:将不是文档的内容构建成文档的格式,将文档发送给lucene,然后才能完成以后的工作
实现抓取数据和构建文档的组件:logstash,即使服务端,又是agent,又能抓取数据,又能构建文档,但是比较重量级,不适合放在分布式文件系统,替换组件filebeat,只充当agnet,将数据发送给logstash,构建文档发送给elasticsearch处理
倒排索引
切词,并且标记每一个词出现的次数和出现在那一个文档中
词频:出现在同一个文件中的次数越多,权限越高,出现在其他文档中次数越多,权限越低,根据一个算法来搜索:TF-IDF
Elasticsearch相关概念
lucene:组织成文档才能进行分析
index:相当于关系型数据库中的database
type:相当于关系型数据库中的table
document:相当于关系型数据库中的行
elasticsearch集群属于无中心节点性,会将所有查询发送给所有节点
常用结构
redis消息队列防止数据将logstash压垮,若redis的消息队列过长,说明logstash负载过大,所以在增加一个即可
日志搜索存储的组合:
- es+filebeat
- es+logstash server+filebeat
- es+logstash server+redis+filebeat
- es+fluentd
二、Elasticsearch安装及集群配置
Elasticsearch安装,需要部署JVM环境
1.官方往网站https://www.elastic.co/downloads/elasticsearch,选择所需要的版本下载
2.安装
[root@~]# rpm -ivh elasticsearch-5.6.10.rpm
3.软件包文件说明
配置文件相关
/etc/elasticsearch/elasticsearch.yml:主配置文件
/etc/elasticsearch/jvm.options:JVM的配置文件,其中包括一些调堆内存的配置
/etc/elasticsearch/log4j2.properties :elasticsearch日志相关
elasticsearch.service:启动的unit file
程序文件:
/usr/share/elasticsearch/bin/elasticsearch
/usr/share/elasticsearch/bin/elasticsearch-keystore
/usr/share/elasticsearch/bin/elasticsearch-plugin:管理插件程序
端口相关:
- 搜索服务端口:tcp/ 9200
- 集群相关端口:tcp/9300
所有节点选举一个主节点,负责调整整个集群的状态,其中,急群众的每一个服务都是正常的则为green状态,若数据不丢失的情况下损坏一个节点则为yellow状态,若集群中有节点损坏,并且数据也有损坏则为red状态
4.集群服务配置相关
因为所有的集群都会有一个问题那就是如果集群之间若发生网络故障,那么就会有发生脑裂的可能,所以所有的集群服务节点都需要是奇数,而且有一个超过半数的一般才会继续提供服务,所以以下实验是根据3个节点搭建的集群服务
版本说明:各个组件需要使用相同版本
主配置文件参数说明
cluster.name: myes #集群名称,来识别一个集群内的所有节点
node.name:hostname #定义主机名
node.attr.rack:r1 #机架感知,大型网络常用,分片时不会分到同一个机架上
path.data:数据路径,需要修改路径的属主数组
path.logs:日志路径,需要修改路径的属主数组
bootstrap.memory_lock: true #是否锁定内存
network.host #绑定的IP地址,监听的地址
http.port:9200 #监听端口
discovery.zen.ping.unicast.hosts: ["172.18.100.2", "172.18.100.6","172.18.100.7"] #因为Elasticsearch在集群之间是单播,所以需要将集群中每一个地址都填到此处
discovery.zen.minimum_master_nodes: 1 #防止脑裂
gateway.reconver_after_nodes #重启后拥有几个节点才会激活集群
查看命令
curl -XGET http://192.168.1.1:9200/ #显示头部信息, 一些版本信息
curl -XGET http://192.168.1.1:9200/_cluster/health?pretty=true #集群健康状态
curl -XGET http://192.168.1.1:9200/_cluster/state?pretty #统计数据,包括各个节点信息等等
curl -XGET http://192.168.1.1:9200/_cat/ #查看各种信息
curl -XGET http://192.168.1.1:9200/_cat/indices #查看索引列表
curl -XGET http://192.168.1.1:9200/_cat/nodes #查看节点
curl -XPUT 'http://192.168.1.1:9200/索引名/' #创建索引
curl -XPUT http://192.168.1.1:9200/索引名/类型名/1 -d '{"key": "值"},{"key": "值"}' #创建文档支持5.6版本
curl -H "Content -Type: application/json" -XPUT http://192.168.1.1:9200/索引名/类型名/1 -d '{"key": "值"},{"key": "值"}' #6版本需要自己添加首部信息
curl -XGET http://192.168.1.1:9200/索引名/_search?pretty #搜索指定索引中有那些type
curl -XDELETE http://192.168.1.1:9200/索引名/类型名称/文档编号 #删除文档
RESTful表征状态转移
搜索语句
查询:
ELS:很多API
_cluster, _cat, _search
curl -X GET '<SCHEME://<HOST>:<PORT>/[INDEX/TYPE/]_search?q=KEYWORD&sort=DOMAIN:[asc|desc]&from=#&size=#&_source=DOMAIN_LIST'
/_search:搜索所有的索引和类型;
/INDEX_NAME/_search:搜索指定的单个索引;
/INDEX1,INDEX2/_search:搜索指定的多个索引;
/s*/_search:搜索所有以s开头的索引;
/INDEX_NAME/TYPE_NAME/_search:搜索指定的单个索引的指定类型;
简单字符串的语法格式
http://lucene.apache.org/core/6_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package.description
查询类型:Query DSL,简单字符串;
文本匹配的查询条件:
(1) q=KEYWORD, 相当于q=_all:KEYWORD
(2) q=DOMAIN:KEYWORD
{
"name" : "Docker in Action",
"publisher" : "wrox",
"datatime" : "2015-12-01",
"author" : "Blair"
}
_all: "Docker in Action Wrox 2015-12-01 Blair"
curl http://192.168.1.1:9200/books/_search?q=book_name:docker&pretty=tree&size=10
三、日志收集工具logstash高度插件化,支持很多种插件
数据导入工具,可以充当服务器,也可以当agent,但是比较重量级,系统资源消耗比较大,可以使用filebeat或者fluentd来充当agent
1.官方网站https://www.elastic.co/downloads/logstash,根据需要下载相对应的软件包
2.安装
[root@tomcat2 ~]# rpm -ivh logstash-5.6.10.rpm
3.软件包文件说明
配置文件相关
/etc/logstash/conf.d:配置文件,设置输入输出和格式转换等信息
/etc/logstash/jvm.options:JVM虚拟机的参数配置
/etc/logstash/log4j2.properties:日志相关
/etc/logstash/logstash.yml:主配置文件
启动相关
/usr/share/logstash/bin/logstash:启动,可以用来测试配置文件和临时启动
其中扩展配置文件的主要格式
input{ 输入插件
###定义输入
}
filter{ #过滤插件
###过滤器
}
output{ #输出插件
###输出
}
4.几种常用的输入输出和过滤器插件
input
1.标准输入
input {
stdin {}
}
2.标准输出
output {
stdout {
codec => rubydebug #编码格式
codec => json #编码格式
}
}
3.从文件输入
input {
file{
path => ["文件路径"] #文件,可以为多个
start_position => "beginning(第一行)|end(最后读取)" #首次启动从何处读取
}
}
4.过滤器插件grok,转换格式的插件,将一个多个内容分割出多行,并且将每一个段增加key,可以参考官方文档,有直接写好的模式,地址:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
freter{
grok {
match =>{
message => "%{变量}" #指定模式匹配,进行二次切分
patterns_dir #指定自己定义的模式文件
}
}
}
5.删除全文数据message
filter{
grok{
match =>{
message => "%{变量}" #指定模式匹配,进行二次切分
}
remove_field => "message" #删除指定字段
}
}
6.更改时间戳的日期格式date
filter{
grok{
match =>{
message => "%{变量}" #指定模式匹配,进行二次切分
}
remove_field => "message" #删除指定字段
}
date { #更改时间格式插件
match => ["timestamp","dd/MMM/YYYY:H:m:s Z"] #替换原有的@timestamp
remove_field => "timestamp" #删除
}
}
7.按需求更改字段中的内容,比如修改名等。mutate
fiilter {
mutate{
rename => {
"agent" => "user_agent"
}
}
}
8.geoip插件,是根据IP地址来定义地域,但是需要各个IP地址的数据库文件,可以下载网上下载IP地址搜索Maxmind组织,直到城市的位置,有免费,也有收费版的
filter {
geoip {
source => "clientip" #客户端IP地址的字段
target => "geoip" #根据geoip来定义位置
database => "数据库地址" #生产环境需要定制计划任务,来更新地址
}
}
9.将数据保存至redis
* 从redis中取数据
input {
redis {
batch_count => 1 #一次读取几个数据
data_type => "list" #以什么格式存数据,支持消息队列和消息订阅
key => "key" #创建键值名
host => "" #主机地址
port => 6379 #端口
threads => 5 #开几个进程来响应
}
}
* 将数据存入redis
output{
redis {
data_type => "channel" #消息订阅
key => "logstash-%{+yyy.MM.dd}"
}
}
10.将数据存入elasticsearch中
output {
elasticsearch {
hosts => ["http://node1:9200/","http://node2:9200/","http://node3:9200/"]
user => "ec18487808b6908009d3"
password => "efcec6a1e0"
index => "logstash-%{+YYYY.MM.dd}" #索引名称
document_type => "apache_logs" #类型名称
}
}
四、kibana基础配置
kibana是图形化显示工具
配置相关
/etc/kibana/kibana.yml
server.port:5601 #监听端口
server.host: "0.0.0.0" #通讯地址
server.basePath "" #对外通过什么rul输出信息,默认/
server.name: #主机名
elasticsearch.url:"" #指向els集群,若有Nginx反向代理,直接填写即可
elasticsearch.preserverHost: true #是否显示反向代理时的主机头
kibana.index: "kibana" #元数据
###ssl功能也可以设置
图形配置
可视化配置
将多个图整合到一块展示
五、filebeat,用来获取本地数据,并将数据转发给如redis等服务
相关配置文件
/etc/filebeat/filebeat.full.yml #模板文件
/etc/filebeat/filebeat.yml #主配置文件
filebeat.prospectors:
configurations.
- input_type: log
paths.
paths:
- /var/log/httpd/access_log* #日志路径
redis相关配置
output.redis:
hosts: ["172.18.100.4:6379"]
port: 6379
key: filebeat #key的名字
password: centos #密码
db: 0 #默认存入那个数据库
datatype: list #数据类型
worker: 2 #开机个进程
loadbalance: true #是否随机发送给多台redis服务器