3 快速入门

这篇教程为初学者详细介绍了如何在Elastic Cloud上创建并管理Elasticsearch(ES)部署,以及使用Docker本地安装和运行ES。内容涵盖创建ES服务和自管理环境的步骤,安装Kibana,发送请求到ES,添加、查询数据,以及从非结构内容中抽取字段。同时提供了清理测试数据的方法。
摘要由CSDN通过智能技术生成

这个手册帮助初学者如何开始:

  • 在测试环境安装和运行ES
  • 添加数据到ES
  • 查询和排序数据
  • 在查询期间从非结构内容中抽取字段

运行ES

安装ES最简单的方式是在Elastic云上使用ES服务创建一个管理部署。如果你更喜欢管理你自己的测试环境,你可以使用Docker安装和运行ES。

ES服务方式

1.Get a free trial

2.登录Elastic Cloud。

3.点击:Create deployment。

4.给你的部署一个名字。

5.点击 Create deployment ,以及下载elastic用户对应的这个密码。

6.点击Continue去打开Kibana。

7.点击Explore on my own

自己管理方式

安装和运行ES:

1.安装和启动Docker Desktop

2.运行:

docker network create elastic
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.1.2
docker run --name es-node01 --net elastic -p 9200:9200 -p 9300:9300 -it docker.elastic.co/elasticsearch/elasticsearch:8.1.2

当你第一次启动ES的时候,下面的安全配置将自动发生:

  • 对于传输层和HTTP层,会生成Certificates and keys 。
  • 这个传输层的安全(TLS)配置设置被写入到了elasticsearch.yml文件中。
  • 对于elastic用户,一个密码被生成。
  • 对于Kibana,一个登记的token被生成。

注意:在决定去看这个密码和登记的token,你可能需要往回回滚一点。

3.拷贝这个生成的密码和登记的token,在一个安全的位置保存他们。这些值只是在你第一次启动ES的时候显示。你将会使用他们去注册Kibana和你的ES集群并且登录。

注意:如果你需要重新设置elastic用户的密码或者其他的内置用户,运行elasticsearch-reset-password工具 。为了生成一个新的登记token,为了Kibana或者ES节点,运行elasticsearch-create-enrollment-token工具。这些工具在ES的bin目录下是可用的。

安装和运行Kibana 

为了分析,可视化,以及管理ES数据,去使用一个简单的UI,安装Kibana。

1.在一个新的终端对话框里面,运行:

docker pull docker.elastic.co/kibana/kibana:8.1.2
docker run --name kib-01 --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.1.2

当你启动Kibana的时候,一个唯一的链接输出到你的终端。

2.为了访问Kibana,点击这个在你的终端里面生成的链接:

a.在你的浏览器里面,粘贴你拷贝的这个登记的token,并且点击这个按钮去用ES连接到你的Kibana实例上。

b.使用当你启动ES的时候生成的密码作为elastic用户登录到Kibana上。

发送请求到ES

你使用REST APIs发送数据和其他的请求到ES。这个就可以让你跟ES相互联系,使用任意的客户端去发送HTTP请求,例如curl。你也可以使用Kibana的控制台去发送请求给ES。

ES服务

使用Kibana

打开Kibana的主菜单并且到Dev Tools > Console

2.在控制台运行下面的实例API请求:

使用curl

为了使用curl或者其他的客户端跟ES联系,你需要你的集群的断电:

  1. 打开kibana的主菜单,然后点击Manage this deployment
  2. 来自你的部署菜单,到Elasticsearch页,点击Copy endpoint
  3. 去提交一个实例的API请求,在一个新的终端回话中运行下面的curl命令。用elastic用户的密码代替<password>。用你的端点代替你的<elasticsearch_endpoint>。
curl -u elastic:<password> <elasticsearch_endpoint>/

自己管理

使用Kibana

1.打开kibana的主菜单,然后点击Manage this deployment

2.在控制台运行下面的实例API请求:

使用curl

去提交一个实例API请求,在新的终端会话中运行下面的curl命令。

url -X GET http://localhost:9200/

添加数据

你添加数据到ES,作为称之为文档的JSON对象。ES在可查询的索引中存储这些文档。

对于时间序列数据,例如日志和指标数据,你一般添加文档到一个数据流中由多个自动生成的索引组成。

一个数据流需要一个索引模板去匹配它的名字。ES使用这个模板去配置这个流的背后的索引。文档发送数据流必须有一个@timestamp字段。

添加一个单个文档

提交下面的索引请求去添加一个单独的日志记录到logs-my_app-default这个数据流中。因为logs-my_app-default不存在,这个请求会自动创建它,通过使用内置的logs-*-*索引模板。

POST logs-my_app-default/_doc
{
  "@timestamp": "2099-05-06T16:21:15.000Z",
  "event": {
    "original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
  }
}

这个响应包含了生成这个文档的元数据:

  • 这个支持的_index包含了这个文档。ES自动生成了这个支持索引的名字。
  • 在这个索引上对应的文档有一个唯一的_id。
{
  "_index": ".ds-logs-my_app-default-2099-05-06-000001",
  "_id": "gl5MJXMBMk1dGnErnBW8",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

添加多个文档

在一个请求中使用_bulk去添加多个文档。批量数据必须以新行作为分隔JSON(NDJSON)。每一行必须以新行符(\n)结束,包括这个最后的行。

PUT logs-my_app-default/_bulk
{ "create": { } }
{ "@timestamp": "2099-05-07T16:24:32.000Z", "event": { "original": "192.0.2.242 - - [07/May/2020:16:24:32 -0500] \"GET /images/hm_nbg.jpg HTTP/1.0\" 304 0" } }
{ "create": { } }
{ "@timestamp": "2099-05-08T16:25:42.000Z", "event": { "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" } }

查询数据

索引的文档可以接近实时的被查询到。下面的查询匹配这个索引logs-my_app-default的所有的日志记录,并且通过字段@timestamp降序排。

GET logs-my_app-default/_search
{
  "query": {
    "match_all": { }
  },
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

默认的,响应的hits部分包括了匹配到查询的前10个记录。每一个命中的_source,包括了在索引期间提交的原始JSON对象。

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": null,
    "hits": [
      {
        "_index": ".ds-logs-my_app-default-2099-05-06-000001",
        "_id": "PdjWongB9KPnaVm2IyaL",
        "_score": null,
        "_source": {
          "@timestamp": "2099-05-08T16:25:42.000Z",
          "event": {
            "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638"
          }
        },
        "sort": [
          4081940742000
        ]
      },
      ...
    ]
  }
}

获取专用字段

解析整个的_source对于大的文档是笨重的。为了从响应中排除它,设置_source这个参数为false。代替的,使用fields参数去获取你想要的字段。

GET logs-my_app-default/_search
{
  "query": {
    "match_all": { }
  },
  "fields": [
    "@timestamp"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

这个响应包含了每一个命中的字段的值,作为一个平面阵列。

{
  ...
  "hits": {
    ...
    "hits": [
      {
        "_index": ".ds-logs-my_app-default-2099-05-06-000001",
        "_id": "PdjWongB9KPnaVm2IyaL",
        "_score": null,
        "fields": {
          "@timestamp": [
            "2099-05-08T16:25:42.000Z"
          ]
        },
        "sort": [
          4081940742000
        ]
      },
      ...
    ]
  }
}

查询日期范围

去查询一个特定的时间或者IP范围,使用一个range查询。

GET logs-my_app-default/_search
{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "2099-05-05",
        "lt": "2099-05-08"
      }
    }
  },
  "fields": [
    "@timestamp"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

你可以使用一个日期计算去定义一个相关的时间范围。下面的这个查询是从过去的一天去查询数据,这个不会匹配在logs-my_app-default中的任何的日志记录。

GET logs-my_app-default/_search
{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "now-1d/d",
        "lt": "now/d"
      }
    }
  },
  "fields": [
    "@timestamp"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

从非结构内容中抽取字段

你可以从非结构内容中抽取runtime fields,像在一个查询期间的日志信息。

使用下面的查询去抽取source.ip运行时字段从event.original。为了在响应中包含它,添加source.ip到fields参数中。

GET logs-my_app-default/_search
{
  "runtime_mappings": {
    "source.ip": {
      "type": "ip",
      "script": """
        String sourceip=grok('%{IPORHOST:sourceip} .*').extract(doc[ "event.original" ].value)?.sourceip;
        if (sourceip != null) emit(sourceip);
      """
    }
  },
  "query": {
    "range": {
      "@timestamp": {
        "gte": "2099-05-05",
        "lt": "2099-05-08"
      }
    }
  },
  "fields": [
    "@timestamp",
    "source.ip"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

组合查询

你可以使用bool查询去组合多个查询。下面的查询组合两个range查询。一个是在@timestamp字段,一个是在source.ip的运行时字段。

GET logs-my_app-default/_search
{
  "runtime_mappings": {
    "source.ip": {
      "type": "ip",
      "script": """
        String sourceip=grok('%{IPORHOST:sourceip} .*').extract(doc[ "event.original" ].value)?.sourceip;
        if (sourceip != null) emit(sourceip);
      """
    }
  },
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "@timestamp": {
              "gte": "2099-05-05",
              "lt": "2099-05-08"
            }
          }
        },
        {
          "range": {
            "source.ip": {
              "gte": "192.0.2.0",
              "lte": "192.0.2.240"
            }
          }
        }
      ]
    }
  },
  "fields": [
    "@timestamp",
    "source.ip"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

聚合数据

使用聚合去汇总数据,作为指标,统计,或者其他的分析。

下面的查询使用一个聚合去计算average_response_size,通过使用http.response.body.bytes运行时字段。这个聚合只是运行在匹配这个query的文档上。

GET logs-my_app-default/_search
{
  "runtime_mappings": {
    "http.response.body.bytes": {
      "type": "long",
      "script": """
        String bytes=grok('%{COMMONAPACHELOG}').extract(doc[ "event.original" ].value)?.bytes;
        if (bytes != null) emit(Integer.parseInt(bytes));
      """
    }
  },
  "aggs": {
    "average_response_size":{
      "avg": {
        "field": "http.response.body.bytes"
      }
    }
  },
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "@timestamp": {
              "gte": "2099-05-05",
              "lt": "2099-05-08"
            }
          }
        }
      ]
    }
  },
  "fields": [
    "@timestamp",
    "http.response.body.bytes"
  ],
  "_source": false,
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}

这个响应的聚合对象包含了聚合的结果。

{
  ...
  "aggregations" : {
    "average_response_size" : {
      "value" : 12368.0
    }
  }
}

探索更多的查询选择

为了保持探索,索引更多的数据到你的数据流中,去检验Common search options

清理

当你做完的时候,删除你的测试数据流和它的背后的索引。

DELETE _data_stream/logs-my_app-default

你也可以删除你的测试部署。

ES服务

在部署的页面点击Delete deployment,然后跟着提示往下走。

自己管理

去停止你的ES和Kibana的Docker容器,运行:

docker stop es-node01
docker stop kib-01

去移除他们的容器和网络,运行:

docker network rm elastic
docker rm es-node01
docker rm kib-01

接下来是什么

通过安装数据层和ILM,去更充分的得到你的时间序列数据。看Use Elasticsearch for time series data

使用敏捷灵活的代理,直接从你的数据源去收集日志和指标数据,并且发送他们到ES。看这个 Ingest logs, metrics, and uptime data with Elastic Agent

使用Kibana去探索,可视化,和管理你的ES数据。看这个Kibana quick start guide

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值