ELK学习笔记

###############搜索引擎知识和相关框架
搜索:从海量数据中获取想要的信息

传统做法:
1.文档中使用find功能
2.mysql中使用like模糊查询
问题:
1.海量数据不能及时响应。少量数据可以mysql建立索引解决
2.一些无用测词不能进行过滤,没法进行分词
3.数据量大的话难以拓展
4.相同的数据难以进行相似度最高的进行排序

搜索引擎:
1。存储非结构化数据
2.快速检索和响应
3.进行相关性排序,过滤
4.可以去掉停用词(没有特殊含义的词,比如英文啊,is等,中文:这,的,是等)
  框架一般支持可以自定义的停用词

常用框架:
1.Lucene
  Apiche的开源项目,高性能,可拓展的工具库,提供搜索的基本框架;
  如果开发人员需要使用,需自己开发,成本大,但是性能高
2.solr
  solr是基于lucene的全文搜索框架,提供了比lucene更为丰富的功能,
  同时实现了可配置,可拓展且对查询性能进行了优化
  建立索引时,搜索效率下降,实时索引搜索效率不高
  数据量的增加,solr的搜索效率会变得更低,适合小数据量的搜索


3.elasticsearch
  基于lucene的搜索框架,它提供了一个分布式的多用户能力的全文搜索引擎,
  基于RESTful web接口,上手容易,拓展节点方便,可用于存储和检索海量的数据,接近实时搜索,海量数据增加,搜索响应的性能几乎不受影响;
  分布式搜索矿建,自动发现节点,副本机制,保障高可用性

#########################ES特性
ElasticSearch是一个基于Lucene的搜索服务器,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
作用:  存储数据时有序存储
    数据和索引分类
    压缩数据
1.特点:全文检索,结构化检索,数据统计,分析,接近实时检索,分布式搜索(可部署数百甚至更多的服务器)
    处理PB级别数据,搜索纠错,自动完成(提示)
2.使用场景:日志搜索,数据聚合,数据监控,报表统计分析

#####################ES目录和配置文件
bin:启动文件
log:日志文件,=>运行日志,慢查询日志
config:核心配置文件
lib:依赖包
plugins:插件


#################字段属性
字符串:字符串有keyword 和 text两种类型,keyword是建立精确索引的字符串,text是建立分词索引的字符串。
ip类型:ip
数字类型:short,integer,long

###############单点安装ES
下载安装包,解压,执行./bin/elasticsearch运行
访问9200端口验证安装


#####################head插件安装
进入github.com网站搜索elasticsearch-head复制下载链接
wget link下载
解压
安装node.js=>下载安装,见https://www.cnblogs.com/liuqi/p/6483317.html
更改elasticsearch配置文件vim ./config/elasticsearch.yml,添加http.cors.enabled: true 和http.cors.allow-origin: "*"
后天启动elasticsearch,./bin/elasticsearch -d,启动head插件npm run start,访问9100端口

#########################elasticsearch 集群安装
更改master 节点elasticsearch配置文件vim ./config/elasticsearch.yml,添加http.cors.enabled: true 和http.cors.allow-origin: "*"
cluster.name: ZW
node.name: master
node.master: true

network.host: 127.0.0.1
##############################
更改ES slaver2节点elasticsearch.yml的配置
cluster.name: ZW
node.name: slave1
network.host: 127.0.0.1
http.port: 8200
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
#######################
更改ES slaver2节点elasticsearch.yml的配置
cluster.name: ZW
node.name: slave2
network.host: 127.0.0.1
http.port: 7200
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]

######################logstash
Logstash是一个接收,处理,转发日志的工具.Logstash在ELK日志系统中担任搬运工的角色,它为数据存储,报表查询和日志解析创建了一个功能强大的管道链。

Logstash提供了多种多样的 input,filters,codecs和output组件


###########ES概念
索引:含有相同属性的文档集合(database)必须是英文字母小写且不含下划线

类型:索引可以定义一个和多个类型,文档必须属于一个类型(table)

文档:是可以被索引的基本数据单位(row)

分片:每个索引都有多个分片,每个分片都是一个lucene索引,分片只能在创建索引的时候指定,不可以动态修改
      数据量大,没有足够的硬盘空间,且一次搜索这么大的数据,响应速度更不上es,可以提高吞吐方便拓展
备份:分片的拷贝,可以动态修改
ES默认5个分片,1个副本

Relational DB->Database -> tables ->row ->columns
ES         ->indices  -> types  ->documents-> fields


###############健康状况查看
http://localhost:9200/_cat/nodes?v
http://localhost:9200/_cluster/health(推荐)
http://localhost:9200/_cat/indices?v(看索引)
green:正常
yellow:集群正常,数据正常,备份副本不正常
red:集群本分正常,数据可能丢失,需要紧急修复

#################ES API基本格式
API : http://<ip>:<port>/<索引>/<类型>/<文档ID>

常用的http动词:GET/PUT/POST/DELETE

########################索引创建
1.直接创建索引
建立一个名为my_index的索引,索引类型为my_type.禁用all字段,然后在把需要的字段放到_all中.
curl -XPUT ip:9200/my_index -d '{  
"settings":{    
        "index": {   
               "refresh_interval" : "-1",  ##减少shard刷新间隔,用于大规模bulk插入,且对实时查询不要求时使用,完成bulk插入后再修改为1s  
               "number_of_shards": "20",  ##初始化20个主分片,分片数量确定后不可修改,非常重要  
               "translog.flush_threshold_size": "1024mb" ##默认是200mb,增大这个参数可以允许translog在flush前存放更大的段(segment);
           ##更大的段的创建会减少flush的频率,并且更大的段合并越少,会减少磁盘IO,索引性能更高。  
               "number_of_replicas": "1", ##设置1个备份,bulk导入大量的数据,可以考虑不要副本,设置为0  
               "max_result_window": 999999    
            }    
    },  
    "mappings" :{  
        "my_type" : {  
           "include_in_all": false, ##禁用_all,可以在具体字段打开  
           "dynamic": "false",  
            "_source": {  
                "enabled": "true"  
            },  
            "_all": { "analyzer": "ik_max_word" },  
            "properties": {  
                "myid" : {  
                    "type": "keyword",##5x后废弃了string,改为keyword和text  
                    "index": "not_analyzed",  
                    "include_in_all": true,  
                    "store": true  
                }  
       }  
     }  
   }  
}'

2.动态创建索引
修改elasticsearch.yml中的配置,之后提交数据时es会自动识别数据类型,然后创建索引及索引类型,但是不建议使用此方式.
#自动创建索引
action.auto_creat_index:true


3.使用模板创建索引
创建一个名为my_template的模板,匹配所有my_index开头的索引,匹配成功后会按照settings和mappings创建一个新的索引.
curl -XPUT ip:9200/_template/my_template -d'  
{  
        "template": "my_index*", ##匹配所有my_index开头的索引  
        "order":0,  ##当存在多个索引模板时并且某个索引两者都匹配时,使用order来确定模板合并顺序
        "settings": {...},  
        "mappings" :{...}  
}  
###########curl
curl
-X 指定http的请求方法 有HEAD GET POST DELETE
-d 指定要传输的数据
-H 指定http的头信息

新增索引
curl -XPUT 'localhost:9200/blog_test?pretty'
删除索引
curl -XDELETE 'localhost:9200/blog_test?pretty'
新增记录
curl -XPUT 
-H "Content-Type:application/json" 'localhost:9200/blog/artical/1?pretty' 
-d '{
    "title":"小D课堂",
    "content":"hahaha.com 小D课堂成立于2016年,专注于互联网教育,课程包括。。。。。"
}'

###########################################结构化查询语句DSL
###########################################
什么是query DSL
1.Domain Specific Language 领域特定语言
2.Elasticsearch提供完整的查询DSL,基于JSON定义查询
3.用于构造复杂的查询语句

##################curl查询
curl -XPOST -H "Content-Type:application/json" 'http://localhost:9200/blog/artical/_search'
-d '{
"query":{
    "term":{"title":"elk"}
    }
}'

################bool查询(判断)
方式:POST
{
    "query":{
        "bool":{
            "must":{"match":{"title":"elk"}},
            "must_not":{"match":{"title":"小D"}}
        }
    }
}

###############filter查询
{
    "query":{
        "bool":{
            "must":{"match":{"title":"elk"}},
            "filter":{
                "range":{
                    "PV":{"gt":15}
                    }
                }
            }
        }
}

1.大部分filter查询不query速度
2.filter不会计算相关度得分,且结果会有缓存,效率高
3.全文搜索,评分排序使用query(其他一般都用filter)
4.是非过滤,精确匹配,使用filter

##查看模板
curl -XGET ip:9200/_template/my_template 
##更改模板方法,将PUT请求改为POST请求


##删除模板
curl -XDELETE ip:9200/_template/my_template

##索引修改
curl -XPUT ip:9200/my_index/_settings -d'{"index.number_of_replicas": 2}'; #修改索引备份为两份

###########索引结构
1.非结构化索引
看head插件的索引信息里面的“mapping”关键字的值:{}。空为非结构化

2.结构化索引
符合查询处写json
使用postman写
方式:PUT
url:127.0.0.1:9200/book
{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":1
    },
    "mappings":{
        "novel":{
            "properties":{
                "word_count":{
                "type":"integer"
                },
                "author":{
                    "type":"keyword"
                },
                "title":{
                    "type":"text"
                },
                "publish_date":{
                    "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
                    "type":"date"
                }
            }
        }
    }
}

#################################插入
1.指定文档id插入
url的类型后面指定文档id
方式:PUT
127.0.0.1:9200/people/man/1
{
    "name":"周旺",
    "country":"China",
    "age":18,
    "birthday":"1993-06-28"
}

2.自动产生文档id插入
不指定id,使用post方法让ES自动生成
方式:POST
127.0.0.1:9200/people/man/
{
    "name":"周旺1994",
    "country":"China",
    "age":18,
    "birthday":"1994-06-28"
}
####################修改数据
1.直接修改(关键字_update)
方式:POST
127.0.0.1:9200/people/man/1/_update
{
    "doc":{
        "name":"周旺hahahah"
}
}

2.通过脚本修改
方式:POST
127.0.0.1:9200/people/man/1/_update
{
    "script":{
        "lang":"painless",
        "inline":"ctx._source.age+=10"
}
}


########################删除操作
1.文档
方式:DELETE
127.0.0.1:9200/people/man/1

2.索引(慎重)
   1.head插件动作-删除

   2.方式:DELETE
    127.0.0.1:9200/索引名

###################查询语法
1.简单查询
方式:POST
url:127.0.0.1:9200/book/nevol/_search
{
  "query": {
    "match_all": {}
  }
}

2.条件查询
###############控制查询返回位置和数据条数
{
  "query": {
    "match_all": {
        
    }
  },
  "from":1,
  "size":3
}

############################筛选
{
  "query": {
    "match": {
        "title":"大法"
    }
  }
}
######################排序
{
  "query": {
    "match": {
        "title":"大法"
    }
  },
  "sort":[
      {"publish_date":{"order":"desc"}}
      ]
}
3.聚合查询(aggs)
#################分组
{
    "aggs":{
        "group_by_word_count":{
            "terms":{
                "field":"word_count"
            }
        },
        "group_by_publish_date":{
            "terms":{
                "field":"publish_date"
            }
        }
    }
}
 ##########################计算(min,max,avg,sum)
{
    "aggs":{
        "grades_word_count":{
            "stats":{
                "field":"word_count"
            }
        }
    }
}
#####################min
{
    "aggs":{
        "grades_word_count":{
            "min":{
                "field":"word_count"
            }
        }
    }
}

###########################################################################
##########################################################################logstash
logstash插件使用
input,filter,output
1.input插件:file, http, kafka, rabbitmq等

2.filter插件:
grok(号称将非标准化的日志数据转换成标准化并且可搜索数据最好的方式,常用语处理Niginx,syslog等日志)

drop(跳过某些日志,不进入output)
geoip(获取地理位置)

3.output(插件)
elasticSearch,csv, email, file等

例:
input{
    ##从文件读取日志信息
    file{
        path=>"/var/log/messages"
        type=>"system"
        start_position=>"beginning"
    }
}

filter{

}

output{
    ##标准输出
    elasticsearch{
        hosts=>["localhost:9200"]
        index=>"logstash-test-%{type}-%{host}"
    }
}


##############快速启动logstash
标准输入输出
./bin/logstash -e '{input {stdin {}} output{ stdout {}}'

配置步骤:
logstash.yml 修改pipeline.worker,根据cpu核数增加1到2即可
jvm.options 修改 xms和xmx为相同,一般是系统内存三分之二

######################logstash采集输送日志流程测试
按特定配置启动logstash
./logstash -f ../config/logstash_file2stdout.conf

#########codec使用
codec:解码编码 数据格式
好处:方便logstash与支持自定义数据格式的运维产品进行使用

logstash的精细化处理流程
input-decode-filter-encode-output

input {
    ###########从文件读取日志信息,输送到控制台
    file {
        path=>"D:\elasticsearch-5.6.0\logs\ZW.log"
        #codec=>"json" ##以Json格式读取日志
        type=>"elasticsearch"
        start_position=>"beginning"
    }
}
#filter{
#
#}
output{
    #elasticsearch {
    #     hosts => ["localhost:9200"]
    #     index => "test"
    #}
    ####标准输出
    #stdout{}
    stdout {
        codec => rubydebug
    }
}

###############filter使用
例子:切割插件mutate
任意输入一个字符串以“|”作为分割字符

input{
    stdin{}
}

filter{
    mutate{
        split=>["message","|"]
    }
}

output{
    ####输出进行格式化,采用ruby库来解析日志
    stdout{codec=>rubydebug}
}


#############logstash实操
从日志文件中读取数据,输出到ES集群中
配置文件
input{
    file{
        path=>"D:\elasticsearch-5.6.0\logs\ZW.log"
        type=>"elasticsearch"
        start_position=>"beginning"
    }
}

output{
    elasticsearch{
        hosts=>"localhost:9200"
        index=>"es-message-%{+YYY.MM.dd}"
    }
    stdout{codec=>rubydebug}##同步输出到控制台

}

验证:
查看索引列表:http://localhost:9200/_cat/indices?v
查看数据:http://localhost:9200/es-message-2018.03.26/_search?pretty

##################################################
##################################################kibana
外网访问:
开放端口,修改配置文件config目录下的kibana.yml
server.host:"0.0.0.0"

守护进行后台启动
nohup xxx &

######注意事项
1.kibana和elasticsearch的版本不能相差太大
2.运行比kibana更高版本的elasticsearch通常可以正常使用
3.小版本差异会出现一些警告

kibana.yml常见配置项
elasticsearch.pingTimeout      日常用的ping
elasticsearch.requestTimeout    读取es超时时间
elasticsearch.url        es主机地址
elasticsearch.username        es鉴权用户
elasticsearch.password

#############kibana状态以及服务器资源使用率
http://localhost:5601/status

############创建索引表达式
使用*通配符,去匹配ES中的一个或者多个索引,没有则无法创建

############discover面板
可以显示字段
查询索引的数据,或者使用luncene语法进行查询

#######kibana图形,报表分析
数据集:https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip
数据导入到es
(linux)curl -H 'Content-Type:application/x-ndjson' -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
(windows)安装curl,且注意需要使用"",不然会报错:curl在windows中cannot resolve the host:'localhost'


############配置logstash采集并输送到elasticSeach
    

    常见问题解决
        1、JVM内存溢出导致的 ES或者Logstash服务启不来,报错 insufficient memory
            解决:升级机器的内存和CPU;
            或者改elasticSeach和logstash的JVM.option,最大堆内存xmx和初始堆内存xms


        2、ES启动报错
            seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
            
            修改elasticsearch.yml 添加一下内容            
            bootstrap.memory_lock: false   为了避免内存和磁盘之间的swap
            bootstrap.system_call_filter: false  

        3、ERROR: bootstrap checks failed
            max virtual memory areas vm.max_map_count [65530] is too low, increase to at least 

            临时设置:sudo sysctl -w vm.max_map_count=262144
            永久修改:
            修改/etc/sysctl.conf 文件,添加 “vm.max_map_count”设置
            并执行:sysctl -p


 

猜你喜欢

转载自my.oschina.net/zhouwang93/blog/1786469