ELK STACK 之 Elasticsearch(一)入门

ELK STACK ginotang 696℃ 0评论

什么是ELK STACK

ELK STACK由3个部分组成,每一个部分都是一个可独立运行的服务。它们分别是:

  • elasticsearch
  • logstash
  • kibana

简单来说,elasticsearch是一个分布式的基于REST API的数据库系统,简称ES;logstash是一个数据收集系统;kibana则是一个基于WebUI的数据可视化系统,elasticsearch中的数据最终都经过kibana展现。三者之中,elasticsearch和kibana经常会一起使用。

Elasticsearch中的基本概念

学习elasticsearch之前,必须先掌握一些关键概念。分别有

  • Cluster(集群)
  • Node(节点)
  • Index(索引)
  • Type(类型)
  • Document(文档)
  • Shards(分片)和Replicas(复制)

Cluster

一个集群由一系列elasticsearch服务器组成,这些服务器都有一个相同的集群名称,或者说它们都在同一个分组下面。

Node

集群中的单个服务器称为一个节点,我们可以为节点指定一个唯一的名称,否则系统会随机生成一个UUID分配给节点。每一个节点都保存一份完整的数据,也就是说,即使集群中只剩下一个节点可用,我们的数据还是完全可访问的。

Index

索引可以理解为一个命名空间,我们可以建立多个索引,elasticsearch中的数据必须保存在特定索引下面,索引有点像分组,一个索引就是一个分组

Type

类型用于把索引进行细分,用关系型数据库的概念来说,如果把Index比如数据库,那么Type就比如一张数据表,用于把类似的数据归类。但是Type这个概念在6.0版本中已经不建议使用,在7.0中很可能会被移除。

Document

文档就是一条实际的数据,在elasticsearch中就是一个json对象,一个文档必须被保存在Type下面。

Shards和Replicas

我们说过,elasticsearch是分布式的数据库系统,好处是可以提高性能和高可用,在elasticsearch中是通过Shards和Replicas实现,并由elasticsearch内部维护,因此,在操作上这两个概念对使用者是不可见的。
Shards是一个逻辑空间,所有数据都分布在不同的Shards中,elasticsearch默认为每个节点创建5个Shard。
Replicas是Shards的备份,默认一个Shard有一个备份(Replica),即5个Shard就有5个Replica,一个分片的备份不会保存在同一个节点中,否则就不存在高可用。

安装并运行elasticsearch

目前官方最新的版本是6.3.2,安装演示的系统是Centos7。我们可以通过yum仓库的方式或者rpm方式安装。

安装elasticsearch

注意:由于elasticsearch是使用java语言开发的,因此必须先安装java运行环境。

运行elasticsearch

安装好后,elasticsearch提供了针对systemd的系统服务,因此可以直接使用systemd控制elasticsearch。
但是,运行前我们需要先更新它的配置文件,位置在/etc/elasticsearch/elasticsearch.yml
过滤注释和空行之后剩下的配置如下:

配置完毕就可以启动服务

服务启动之后,elasticsearch会监听9200和9300端口,可以通过netstat命令查看

9200端口是本地REST API端口,而9300端口是节点间通讯端口。

测试REST API

elasticsearch是基于REST API接口的,所有数据的CURD操作都是通过REST API的方式进行。我们可以通过curl命令测试服务是否成功运行

如果看到返回的json对象,说明服务成功运行。从返回结果可以看到,我们的配置文件中没有配置cluster名称和uuid,因此elasticsearch自动为我们创建了一个。

elasticsearch的数据操作

和关系型数据库一样,elasticsearch同样有CURD操作,不同的是es所有对数据的操作都必须经过REST API的方式和配合不同的http方法:PUT、GET、POST、DELETE。

增加数据

例如要录入公司的雇员数据,公司名称为megacorp。添加数据通过http的PUT方法即可。

上面请求的URL中,除了前面的ip地址外,后面由三个部分组成,分别是索引名称类型名称id

查询数据

数据查询是比较简单的,通过GET方法请求指定URL即可,如果希望返回格式化的结果,需要使用pretty参数。

返回结果中的_source属性值就是我们提交的完整数据。

更新/替换数据

ES中每一条数据都由一个唯一的URI引用,当把数据提交到一个已经存在的URI中,那么新的数据就会把旧的数据替换。
例如前面的/megacorp/employee/1,我们再次提交数据到这个URI下面

然后使用GET查询这条数据

返回结果中_source的值被替换成新的值,如果我们的意图是替换整条数据,这是期望的结果。但是如果我们是希望在原有基础上添加数据,那么就需要使用_update API。
提交的json中必须指定属性为"doc",否则更新失败,如下所示

删除数据

通过http方法DELETE,可以对数据进行删除

DELETE除了可以删除特定的数据,还可以删除整个Index

批量获取数据

ES提供了_mget API,即multi get,用于批量获取数据。mget发送出去的json对象属性必须是"docs"

又或者简单地在特定的Index下面获取指定ID的数据

只返回/megacorp/employee下面id为1和2的员工资料。

批量操作数据

mget api用于批量获取数据,而这里所介绍的是_bulk API,它支持的批量操作有:

  • create 如果文档不存在,则创建它
  • index 创建一个新文档或者替换一个现有文档
  • update 更新一个文档
  • delete 删除一个文档

create和index的不同之处在于,如果文档已经存在,create会抛出错误,不执行操作,而index则会替换现有文档,如果文档原先不存在,则create和index的行为一致。除了delete动作不能有请求体外,其他动作后面都必须有请求体。

注意:在使用_bulk API的时候,请求体中的每一行必须以换行符结束,尤其需要注意的是最后一行

bulk请求体格式如下:

其中action代表create、index、update、delete,而metadata则代表Index、Type、id。
请求体一般就是我们具体的文档内容,即GET请求中返回的_source属性的值。

批量创建数据

混合使用多个操作
使用bulk批量操作的时候,不同操作之间是可以同时使用的,例如删除和更新操作同时进行:

转载请注明:Pure nonsense » ELK STACK 之 Elasticsearch(一)入门

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x