Elasticsearch使用

一、搜索引擎基础

搜索引擎是倒排索引,Elasticsearch必须成为索引才支持查询
搜索引擎两大组件:
搜索组件:搜索数据,运行查询,将查询结构显示给用户
索引组件:将获得的数据构建成能够让搜索引擎中的搜索功能完成数据查询
搜索引擎关键组件: 显示数据-->获取数据-->构建文档-->分析文档(切词,词法分析等操作,正规化的过程)-->索引文档--->索引(相当于数据库)---> 运行搜索-->构建搜索-->将结果呈现个用户


image.png

索引部分: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集群属于无中心节点性,会将所有查询发送给所有节点
常用结构


image.png

redis消息队列防止数据将logstash压垮,若redis的消息队列过长,说明logstash负载过大,所以在增加一个即可
日志搜索存储的组合:
  1. es+filebeat
  2. es+logstash server+filebeat
  3. es+logstash server+redis+filebeat
  4. 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高度插件化,支持很多种插件

1.png

数据导入工具,可以充当服务器,也可以当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功能也可以设置

图形配置


image.png

可视化配置


image.png

image.png

将多个图整合到一块展示
image.png

五、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服务器

基于filebeat+redis+logstash+elasticseach+

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

推荐阅读更多精彩内容