搜索引擎的工作方式:给一个关键词,找到这个关键词所属的元素集合,对于互联网网页来讲,我们搜索一个关键词,就是找到关键词所在的页面,为了能够完成关键词搜索,现在通过的搜索引擎通常需要构建一个倒排索引完成文件存储,意思就是爬来一个文档以后,爬来的每一个独立的数据集要被作为一个独立的实体存放,对于els而言,该文档是以json格式存放的,对这个文档而言,首先要进行分析,需要把页面的每个数据做切词,之后每个词的文档是有一个集合。举例说明,比如“小桥流水人家”,切词之后生成小乔这词,这个词后面记录着该词文档的唯一标识id,即“小乔”id#,id#,id#。

倒排索引:就是存放一个词和词本身所对应文档的文档;

luncene:java语言编写的搜索库,把用户所收集过来的数据,能够组织成倒排索引的方式存储下来,而后通过API给用户提供一个搜索接口,如果需要调用,则要写java程序,如其工作单机就是单机的搜索引擎,如果是工作多机上,就是一个分布式存储引擎。

    luncene 的核心组件:

        索引:类似于关系型数据库

        类型:表

        文档:相当于行

        索引内部是类型;类型内部可以有文档,不做索引就不能搜索,一个索引可以有多个类型

ELS:从本质上来讲不是搜索引擎,基于luncene构建的开源的分布式的全文本实时搜索引擎,他只是调用luncene的API,并用这个功能直接用一个可调用的服务呈现给我们,也是分布式的,可以工作在多个节点上,因此ELS是一个开源的,分布式的实时的搜索引擎。

    ELS集群的工作方式:假如现在有三个节点,构建成ELS集群,当我们要存储一个数据集【索引】的时候,把一个索引切割成N片,每片都是一个独立的索引,如果一个用户发起查询请求给其中一个节点的时候,这个节点要查询本地索引分片,也要查询请求转发给另外两个节点,让他们做查询请求操作,另外两个节点做完查询请求操作后,把结果都汇总给第一个节点。为了提高节点的冗余能力要为每个分片做主从,为每个primary shard 做replica shard分片;做主从,主的可写。ELs集群的工作方式只要定义集群的名字一样,就可以在一个集群内工作。

wKiom1hqQQmDbJ1DAAIv1TvwmcE152.png


    当第一个节点启动起来的时候,集群会以单播波多波的方式监听在9300端口上,查找同一集群的其他节点,完成集群事物信息传递,ELS集群也需要一个主节点用于监控管理整个集群的状态,比如那个节点持有哪些shard,哪些持有真本shared哪些持有副本shared,如何分配均衡,都有主节点,每个节点都可以接受用户请求,写只能发给主,那个从都可以读,如果某个节点宕机了,就要启动修复过程。


    集群有状态:green, red, yellow   正常 不可用 修复

搜索引擎包含两个组件:索引组件或存储组件,搜索组件。

     索引组件:索取数据--建立文档--文档分析--文档索引(倒排索引

     搜索组件:用户搜索接口--建立查询(将用户键入的信息转换为可处理的查询对象)--搜索查询--展现结果。

搜索过程:要给用户一个接口,让用户能够键入要搜索的关键词,键入搜索词“小桥流水”之后,要做分析,要与搜索的分析方法一样,有两个分析过程,一个存储的的分析,一个的是键入搜索词的分析,这两个分析器要对应起来,如果不对应,则搜索的结果是没办法匹配的,导致搜索不到。

一个完整的搜索引擎第一步要有一个数据流来源,不断的更新并生成新的数据,数据来了之后还不能原始的存下来,多数情况下还要对其分析存下来,构建成一个倒排索引,随后基于这个构建好的数据集,用户可以键入他的搜索请求,所有请求键入以后,就可以给用户返回一个搜索相关匹配结果。


对于luncene来讲,获取的内容导入存储引擎的之前,要把他建立成一个文档,该文档是一个json格式存储的,给数据格式化,把数据做切割成一个又一个独立的数据单元,并且给每一个单元加属性描述,这个就是把数据集建立成文档过程,k-v,每个kv叫做一个域;对于luncene来讲,他有一个特殊字段叫all域,把原始数据原样不变的存一份。


集群的配置方式:

    时间要同步
    java-1.8.0-openjdk-src.x86_64
    java-1.8.0-openjdk-devel-1.8.0.65-3.b17.el7.x86_64
        #java -version 确认版本要在1.8或1.8以上
    yum install ./elasticsearch-5.1.1.rpm     #当前最新版本
    mkdir -pv /els/{data,logs}
    chown -R elasticsearch.elasticsearch /els/*
    vim /etc/elasticsearch/elasticsearch.yml
        cluster.name: myels    #判断多个集群节点是不是属于同一个集群的通过集群名称来判断即可
        node.name: node1    #节点名,且集群网络能够解析
        path.data: /els/data
        path.logs: /els/logs
        network.host: 0.0.0.0    #本地如果存在多个网卡时,最好设置成固定ip
        discovery.zen.ping.unicast.hosts: ["node1IP", "node2IP","node3IP"]
                discovery.zen.minimum_master_nodes: 2 #大于节点数的半数
        vim /etc/sysconfig/elasticsearch  #可配置使用最大和最小内存的使用量
                #例如:ES_JAVA_OPTS="-Xms512m -Xmx512m" 最大最小均为512M
    systemctl daemon-reload
    systemctl start elasticsearch.service 
        #N个节点则在N个主机上面重复N次操作即可

CRUD操作相关的API:

    curl -X<VERB> '<PROTOCOL>://HOST:PORT/<PATH>?<QUERY_STRING>' -d '<BODY>'

        VERB: GET, PUT, DELETE等;

        PROTOCOL: http, https

        QUERY_STRING:查询参数,例如?pretty表示用易读的JSON格式输出;

        BODY: 请求的主体;

    【PUT】创建文档:创建logs索引,messages类型,id为1的文档

~ # curl -XPUT '192.168.1.104:9200/logs/messages/1' -d '
{
datetime:"20160926",
hostname:"localhost",
process:"dbus",
pid:817,
event:"Activating service"
}' #下面内容是回车后自动生成的
{"_index":"logs","_type":"messages","_id":"1","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true

   【GET】获取文档: 

~ # curl -XGET '192.168.1.104:9200/logs/messages/1'
{"_index":"logs","_type":"messages","_id":"1","_version":1,"found":true,"_source":
{
datetime:"20160926",
hostname:"localhost",
process:"dbus",
pid:817,

   【POST】更新文档:POST方法会覆盖原有文档,如果只是部分更新内容,使用_update API

~]# curl -XPOST 'localhost:9200/students/class1/2/_update?pretty' -d '
{
"doc": { "age": 22 }
}'
{
"_index" : "students",
"_type" : "class1",
"_id" : "2",
"_version" : 2
}

  【DETELE】删除文档:

~]# curl -XDELETE 'localhost:9200/students/class1/2'
~]# curl -XDELETE 'localhost:9200/students'    #删除索引,则索引内部的文档都没有了
~]# curl -XGET 'localhost:9200/_cat/indices?v'   #验证


常用的集群状态信息查看命令:

   curl -XGET 'http://192.168.1.104:9200/_cluster/health?pretty'   #查看集群的健康状态
   curl -XGET 'http://192.168.1.104:9200/_cluster/stats?pretty'  #查看集群的状态信息
   curl -XGET 'http://192.168.1.104:9200/_cat/?pretty'  #查看cat接口子功能有哪些
   curl -XGET 'localhost:9200/_search?pretty'  #搜索所有索引所有类型的所有文档
   curl -XGET 'localhost:9200/logs/_search?pretty'  #搜索logs索引的数据
   curl -XGET 'localhost:9200/logs/_search?pretty&_source=event'  #只显示event
   curl -XGET 'localhost:9200/logs/_search?q=817&pretty'  #只显示含有817字串的
   curl -XGET 'localhost:9200/logs/_search?pretty' -d '   #返回所有文档
    > {
    >  "query":{
    >     "match_all":{}
    > }
    > }'
   curl -X GET 'http://192.168.1.103:9200/_cat/nodes?v' #使用cat API显示各个节点信息
    host      ip        heap.percent ram.percent load node.role master name
    localhost 127.0.0.1            4          86 0.08 d         m      node2.naruto.com
    localhost 127.0.0.1            7          83 0.10 d         *      node1.naruto.com
    localhost 127.0.0.1            4          86 0.01 d         m      node3.naruto.com
   curl -XGET 'localhost:9200/_cat/nodes?h=name,ip,port,uptime,heap.current' #堆内存的使用量
   curl -XGET 'http://192.168.1.104:9200/_cat/master'  #显示谁是主节点
   curl -X GET 'http://192.168.1.104:9200/_cat/health?v' #当前节点的健康状态
   curl -XGET 'localhost:9200/logs*/messages/_search?pretty' #显示所有以logs开头的索引
   注意:查看集群节点状态信息时,指明其中任何一个主机即可

  

ELK:

    E:elasticsearch

    L:logstash:数据流收集器,向产生日志的服务器上面部署一个agent,手机日志并通过一个统一的管道给集中存储在elk的一个组件,性能不高。

        ELK Beats Platform:

            PacketBeats:网络报文分析工具

,统计收集报文信息,专门用于收集网络数据包的,可监听网卡和服;的数据流,把网卡的报文,拿过来送给logstash-server,是一个分布式的实时探测器,能够探测每一个事物的请求和响应

            Filebeat:日志手机工具,是早期logstash forwarder【agent】 的替代品,功能强大,性能ok

            Topbeat:用来收集系统基础数据的,如cpu,内存,IO等相关的统计信息;

    K: Kibina:搜索界面,能够将用户的搜索语句发送给elk,由elk完成搜索,并且将结果返还回来,不但能返回搜索结果,而且还能对关注的数据用饼图祝状态做趋势展示等。就是为elk提供一个用户的搜索接口。



ELK的架构:

wKioL1hq_rKTK4h1AAAwh_sC3rE728.png


    现在有三个tomcat主机产生日志,需要把tomcat上的日志发送给Elasticsearch,然后通过搜索引擎分析日志,比如在指定的时间内有哪些ip地址访问了我们的网站,或者某个特定的ip访问了我们的网站,用logstash-server要不断的从三个节点获取日志数据,这个数据要通过logstah的输入插件把数据合并到logstash-server之上,需要由一个程序不停监控tomcat产生日志信息,并且把 信息输送给logstash的input插件,因此在tomcat上面需要安装一个agent程序,负责监控产生的日志信息,并且把信息输送给logstash的input插件,这个程序可以是logstash的agent,然后通过输出插件发送给elasticsearch,但是logstash自己当agent太过重量级,性能很低,因此可替代其工作的组件有filebeats,此时如果tomcat节点数据流过多,如果输入插件不足以承受这种范文的话,因此在tomcat和logstash-server之间加一个中间键,比如redis,利用其队列功能,将收集过来的数据存放到队列中,然后用输入插件不断的从队列中去出来,一一处理,然后在经过filter插件进行过滤,经过输出插件存储到els中,可以件数搜索命令转换成curl命令提交给els集群,从急群众获取数据后,通过kibana用非常直观的方式展示给用户。