ElasticStack系列,第一章

ElasticStack系列,第一章

一、Elastic Stack简介

ElasticStack目前由四部分组成:
	ElasticSearch:核心存储和检索引擎
	Kibana:数据可视化
	Logstash:高吞吐量数据处理引擎
	Beats:采集数据

在这里插入图片描述

ElasticSearch:基于Java,是一个开源分布式搜索引擎,特点:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格,多数据源,自动搜索负载等。

logstash:基于Java,是一个开源的用于收集,分析和存储日志的工具。(主要用beats做数据采集)

kibana:基于nodejs,也是一个开源的免费工具,kibana可以为logstash和elasticsearch提供的日志分析友好的web界面,可以汇总、分析和搜索重要数据日志。

beats:是elastic公司开源的一款采集系统监控数据的代理agent,实在被监控服务器上以客户端形式运行的数据搜集器的统称。可以直接把数据发送给elasticsearch或者通过logstash发送给elasticsearch,然后进行后续的数据分析活动。
Beats由如下组成:

Packetbeat:是一个网络数据包分析器,用于监控、收集网络流量信息,Packetbeat嗅探服务器之间的流量,解析应用层协议,并关联到消息的处理,其支 持ICMP (v4 and v6)、DNS、HTTP、Mysql、PostgreSQL、Redis、MongoDB、Memcache等协议;

Filebeat:用于监控、收集服务器日志文件,其已取代 logstash forwarder;

Metricbeat:可定期获取外部系统的监控指标信息,其可以监控、收集 Apache、HAProxy、MongoDBMySQL、Nginx、PostgreSQL、Redis、System、Zookeeper等服务;

Winlogbeat:用于监控、收集Windows系统的日志信息;

二、ElasticSearch简介和安装

1、简介

ElasticSearch是一个基于Lucene的搜索服务器。
它提供了一个分布式多用户能力的全文搜索引擎,基于RestFul web接口。
ElasticSearch使用Java开发的,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

2、安装

下载:https://www.elastic.co/cn/downloads/elasticsearch

单机版安装:

##创建elsearch用户,Elasticsearch不支持root用户运行
useradd elsearch

##在opt下创建elasticStack
mkdir elasticStack

##在elasticStack中创建es
cd elasticStack
mkdir es

##更改elasticStack文件夹的用户权限
chown elsearch:elsearch elasticStack/ -R
【目录elasticStack和es文件夹都所属elsearch了】

##切换用户elsearch
su elsearch

##上传或下载elasticsearch-6.5.4.tar.gz

##解压到当前目录
tar -xvf elasticsearch-6.5.4.tar.gz -C /opt/elasticStack/es

配置config:

##修改配置文件
cd /conf
vim elasticsearch.yml
network.host: 0.0.0.0 ?#设置ip地址,任意网络均可访问

##说明:在Elasticsearch中如果,network.host不是localhost或者127.0.0.1的话,
##就会认为是生产环境,会对环境的要求比较高,我们的测试环境不一定能够满足,一般情况下需要修改2处配置,如下:
#1:修改jvm启动参数
vim conf/jvm.options
-Xms128m #根据自己机器情况修改原来是-Xms1g
-Xmx128m #原来是-Xmx1g
##2:一个进程在VMAs(虚拟内存区域)创建内存映射最大数量【用root用户操作:su root】
vim /etc/sysctl.conf
vm.max_map_count=655360 #新增

sysctl -p #配置生效

启动:

##启动ES服务【以elsearch用户启动】
su elsearch
cd bin
./elasticsearch 或 ./elasticsearch -d #后台启动
##访问:
http://你的主机IP:9200/

##阿里云如果拒绝访问,你需要给ESC实例设置安全组规则:

在这里插入图片描述

启动过程中会发现一些错误,总结如下:

1、ERROR: [1] bootstrap checks failed,
[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]

#解决:切换到root用户,编辑limits.conf 添加类似如下内容
vi /etc/security/limits.conf

添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

2、max number of threads [1024] for user [elsearch] is too low, increase to at least [4096]

#解决:切换到root用户,进入limits.d目录下修改配置文件。
vi /etc/security/limits.d/90-nproc.conf
#修改如下内容:
* soft nproc 1024
#修改为
* soft nproc 4096

3、system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

#解决:Centos6不支持SecComp,而ES5.2.0默认bootstrap.system_call_filter为true
vim config/elasticsearch.yml
添加:
bootstrap.system_call_filter: false

在这里插入图片描述

3、ElasticSearch-head

lasticsearch-head是一个为ES开发的一个页面客户端工具,其源码托管于GitHub,
地址为:https://github.com/mobz/elasticsearch-head

head提供了4种安装方式:
    源码安装,通过npm run start启动(不推荐)
    通过docker安装(推荐)
    通过chrome插件安装(推荐)
    通过ES的plugin方式安装(不推荐)

通过docker安装

#拉取镜像
docker pull mobz/elasticsearch-head:5
#创建容器
docker create --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5
#启动容器
docker start elasticsearch-head

通过浏览器进行访问:

http://你的主机IP:9100   【docker暴露的9100端口】

注意:

由于前后端分离开发,所以会存在跨域问题,需要在服务端做CORS的配置,如下:
vim elasticsearch.yml
http.cors.enabled: true http.cors.allow-origin: "*"
通过chrome插件的方式安装不存在该问题。

chrome插件的方式安装

https://github.com/liufengji/es-head
下载然后解压
访问:chrome://extensions/
打开开发者模式
加载已解压的扩展程序

在这里插入图片描述

三、ElasticSearch快速入门

1、基本概念

索引

索引(index)是Elasticsearch对逻辑数据的逻辑存储,所以它可以分为更小的部分。

可以把索引看成关系型数据库的表,索引的结构是为快速有效的全文索引准备的,特别是它不存储原始值。

Elasticsearch可以把索引存放在一台机器或者分散在多台服务器上,每个索引有一或多个分片(shard),
每个分片可以有多个副本(replica)。

文档

存储在Elasticsearch中的主要实体叫文档(document)。
用关系型数据库来类比的话,一个文档相当于数据库表中的一行记录。

Elasticsearch和MongoDB中的文档类似,都可以有不同的结构,但Elasticsearch的文档中,相同字段必须有相同类型。

文档由多个字段组成,每个字段可能多次出现在一个文档里,这样的字段叫多值字段(multivalued)。

每个字段的类型,可以是文本、数值、日期等。字段类型也可以是复杂类型,一个字段包含其他子文档或者数组。

文档类型

在Elasticsearch中,一个索引对象可以存储很多不同用途的对象。
例如,一个博客应用程序可以保存文章和评论。

每个文档可以有不同的结构。

不同的文档类型不能为相同的属性设置不同的类型。
例如,在同一索引中的所有文档类型中,一个叫title的字段必须具有相同的类型。

映射

所有文档写进索引之前都会先进行分析,如何将输入的文本分割为词条、哪些词条又会被过滤,这种行为叫做映射(mapping)。
一般由用户自己定义规则。

2、RestFul API

在Elasticsearch中,提供了功能丰富的RESTful API的操作,包括基本的CRUD、创建索引、删除索引等操作。

2.1)、创建索引

在Lucene中,创建索引是需要定义字段名称以及字段的类型的,在Elasticsearch中提供了非结构化的索引,就是不需要创建索引结构,即可写入数据到索引中,实际上在Elasticsearch底层会进行结构化操作,此操作对用户是透明的。

(POSTMAN请求即可)

PUT /haoke
{	
    "settings": { 
        "index": { 
            "number_of_shards": "2",
            "number_of_replicas": "0"
        }  
    }
}

##	"number_of_shards" #分片数 
##	"number_of_replicas" #副本数

2.2)、删除索引

(POSTMAN请求即可)

DELETE /haoke
{
    "acknowledged": true
}

2.3)、插入数据

URL规则

POST /{索引}/{类型}/{id}    {id}可有可无,没有会自动生成一个随机数
POST /haoke/user/1001
##数据
{ 
    "id":1001, 
    "name":"张三", 
    "age":20, 
    "sex":"男"
}

##结果

{
    _index: "haoke"
    _type: "user"
    _id: "1001"
    _version: 1
    result: "created"  ##结果
    _shards: {
        total: 1
        successful: 1
        failed: 0
    }-
    _seq_no: 0
    _primary_term: 1
}

在这里插入图片描述

2.4)、更新数据

在Elasticsearch中,文档数据是不可以修改的,但是可以通过覆盖的方式进行更新。(先删除后新增的方式)

覆盖更新

URL规则:

PUT /{索引}/{type}/{id}
PUT /haoke/user/1001

##数据
{ 
    "id":1001, 
    "name":"张三", 
    "age":21, 
    "sex":"女"
}

##结果
{
    _index: "haoke"
    _type: "user"
    _id: "1001"
    _version: 2 ##版本
    result: "updated" ##结果
    _shards: {
        total: 1
        successful: 1
        failed: 0
    }-
    _seq_no: 2
    _primary_term: 1
}

局部更新

URL规则:

POST /{索引}/{type}/{id}/_update
  1. 从旧文档中检索JSON 2. 修改它 3. 删除旧文档 4. 索引新文档
#注意:这里多了_update标识   PUT换成了POST
POST /haoke/user/1001/_update

##数据
{ 
    "doc":
    {
        "age":23  
    }
}

##结果
{
    _index: "haoke"
    _type: "user"
    _id: "1001"
    _version: 4
    result: "updated"
    _shards: {
        total: 1
        successful: 1
        failed: 0
    }-
    _seq_no: 4
    _primary_term: 1
}

2.5)、删除数据

URL规则:

DELETE /{索引}/{类型}/{id}

在Elasticsearch中,删除文档数据,只需要发起DELETE请求即可。

注意:

删除一个文档也不会立即从磁盘上移除,它只是被标记成已删除状态。
Elasticsearch将会在你之后添加更多索引的时候才会在后台进行删除内容的清理。

测试:

DELETE /haoke/user/1001

结果:
{
    _index: "haoke"
    _type: "user"
    _id: "1001"
    _version: 5
    result: "deleted" ##结果
    _shards: {
        total: 1
        successful: 1
        failed: 0
    }-
    _seq_no: 5
    _primary_term: 1
}

2.6)、查询数据

A、根据ID搜索

URL规则:

GET /{索引}/{类型}/{id}
GET /haoke/user/FD_2gm4BoifuYiH46rUl
结果:
{
    _index: "haoke"
    _type: "user"
    _id: "FD_2gm4BoifuYiH46rUl"
    _version: 1
    found: true
    _source: {
        id: 1002
        name: "李四"
        age: 21
        sex: "男"
    }-
}

B、查询所有

URL规则:

GET /{索引}/{类型}/_search

注意:

默认返回10条数据
更多数据要做分页查询

测试:

GET /haoke/user/_search
##结果:
{
    took: 9
    timed_out: false
    _shards: {
        total: 2
        successful: 2
        skipped: 0
        failed: 0
    }-
    hits: {
        total: 1
        max_score: 1
        hits: [1] ##击中,查询出1条数据
        0:  {
            _index: "haoke"
            _type: "user"
            _id: "FD_2gm4BoifuYiH46rUl"
            _score: 1 ##得分
            _source: {
                id: 1002
                name: "李四"
                age: 21
                sex: "男"
            }-
        }-
        -
    }-
}

C、根据字段搜索

URL规则:

GET /{索引}/{类型}/_search?q=字段:字段值

测试:

GET /haoke/user/_search?q=age:21

##结果:
{
    took: 2
    timed_out: false
    _shards: {
        total: 2
        successful: 2
        skipped: 0
        failed: 0
    }-
    hits: {
        total: 1
        max_score: 1
        hits: [1]	##击中
        0:  {
            _index: "haoke"
            _type: "user"
            _id: "FD_2gm4BoifuYiH46rUl"
            _score: 1	##得分
            _source: {
                id: 1002
                name: "李四"
                age: 21
                sex: "男"
            }-
        }-
        -
    }-
}

2.7)、DSL搜索

_index _type _id _score id name age sex
haoke user FT_Hh24BoifuYiH4yLVZ 1 1002 李四 21
haoke user Fj_Ih24BoifuYiH4mrUZ 1 1001 张三 20
haoke user Fz_Ih24BoifuYiH49rXb 1 1004 赵六 32
haoke user GD_Jh24BoifuYiH4ULXB 1 1005 孙七 33
haoke user GT_Jh24BoifuYiH4frUv 1 1003 王五 31

a、查询年龄等于20的

{
    "query":{
        "match":{
            "age":20
        }
    }
}

b、查询年龄大于30岁的男性

{
    "query":{
        "bool":{
            "filter":{		##过滤
                "range":{   ##范围
                    "age":{
                        "gt":30
                    }
                }
            },
            "must":{		##必须
                "match":{	##匹配
                	"sex":"男"
                }
            }
        }
    }
}

//TODO 有关DSL的详细叙述,之后再写

2.8)、高亮显示

name高亮显示:

{
    "query":{
        "match":{
            "name":"张三 李四"
        }
    },
    "highlight":{
        "fields":{
            "name":{}
        }
    }
}

2.9)、聚合

类似group by

{
    "aggs":{
        "all_interests":{
            "terms":{
                "field":"age"
            }
        }
    }
}

以上只是简单的阐述一下,详细内容之后会做解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章