ElasticSearch(ES)介绍,安装配置和基础使用

1.初认识ElasticSearch(ES)

1.1 什么是ElasticSearch?

ElasticSearch直译过来就是智能搜索,实质上是一个分布式搜索引擎

ES是一个近实时(NRT)的搜索引擎,一般从添加数据到能被搜索到只有很少的延迟(大约是1s),而查询数据是实时的。一般我们可以把ES配合logstash,kibana来做日志分析系统,或者是搜索方面的系统功能,比如在网上商城系统里实现搜索商品的功能也会用到ES。

它是ELK(ELK实际上是三个工具的集合,Elasticsearch + Logstash + Kibana,这三个工具组合形成了一套实用、易用的监控架构,很多公司利用它来搭建可视化的海量日志分析平台。之中的一个非常完善的产品。

1.2 那么ELK各自负责什么工作呢?

Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志(也就是将搜索出的数据进行可视化)

2.ES基本概念

我们用ES搜索来类比Mysql搜索

2.1 文档(Document)

        我们知道Java是面向对象的,而Elasticsearch是面向文档的,也就是说文档是所有可搜索数据的最小单元。ES的文档就像MySql中的一条记录,只是ES的文档会被序列化成json格式,保存在Elasticsearch中;

       这个json对象是由字段组成,字段就相当于Mysql的列,每个字段都有自己的类型(字符串、数值、布尔、二进制、日期范围类型);

       当我们创建文档时,如果不指定字段的类型,Elasticsearch会帮我们自动匹配类型;

       每个文档都有一个ID,类似MySql的主键,咱们可以自己指定,也可以让Elasticsearch自动生成;

       文档的json格式支持数组/嵌套,在一个索引(数据库)或类型(表)里面,你可以存储任意多的文档。


2.2 类型(Type)

          类型就相当于MySql里的表,我们知道MySql里一个库下可以有很多表,最原始的时候ES也是这样,一个索引下可以有很多类型,但是从6.0版本开始,type已经被逐渐废弃,但是这时候一个索引仍然可以设置多个类型,一直到7.0版本开始,一个索引就只能创建一个类型了(_doc)。这一点,大家要注意,网上很多资料都是旧版本的,没有对这点进行说明。
 

2.3 索引(Index)

       索引就相当于MySql里的数据库,它是具有某种相似特性的文档集合。反过来说不同特性的文档一般都放在不同的索引里;
       索引的名称必须全部是小写;
       在单个集群中,可以定义任意多个索引;
       索引具有mapping和setting的概念,mapping用来定义文档字段的类型,setting用来定义不同数据的分布。
 

2.4 结点(Node)

       一个节点就是一个ES实例,其实本质上就是一个java进程。也可以说是集群中的一台服务器。

       节点的名称可以通过配置文件配置,或者在启动的时候使用-E node.name=ropledata指定,默认是随机分配的。建议咱们自己指定,因为节点名称对于管理目的很重要,咱们可以通过节点名称确定网络中的哪些服务器对应于ES集群中的哪些节点;

ES的节点类型主要分为如下几种:
Master Eligible节点:每个节点启动后,默认就是Master Eligible节点,可以通过设node.master: false 来禁止。Master Eligible可以参加选主流程,并成为Master节点(当第一个节点启动后,它会将自己选为Master节点);注意:每个节点都保存了集群的状态,只有Master节点才能修改集群的状态信息。
Data节点:可以保存数据的节点。主要负责保存分片数据,利于数据扩展。
Coordinating 节点:负责接收客户端请求,将请求发送到合适的节点,最终把结果汇集到一起

         注意:每个节点默认都起到了Coordinating node的职责。一般在开发环境中一个节点可以承担多个角色,但是在生产环境中,还是设置单一的角色比较好,因为有助于提高性能
 

2.5 分片(shard)

一台服务器,无法存储大量的数据,ES把一个index里面的数据,分为多个shard,分布式的存储在各个服务器上面。

kafka:为什么支持分布式的功能,因为里面是有topic,支持分区的概念。所以topic A可以存在不同的节点上面。就可以支持海量数据和高并发,提升性能和吞吐量

了解分布式或者学过mysql分库分表的应该对分片的概念比较熟悉,ES里面的索引可能存储大量数据,这些数据可能会超出单个节点的硬件限制。

为了解决这个问题,ES提供了将索引细分为多个碎片的功能,这就是分片。这里咱们可以简单去理解,在创建索引时,只需要咱们定义所需的碎片数量就可以了,其实每个分片都可以看作是一个完全功能性和独立的索引,可以托管在集群中的任何节点上。

疑问二:分片有什么好处和注意事项呢?

通过分片技术,咱们可以水平拆分数据量,同时它还支持跨碎片(可能在多个节点上)分布和并行操作,从而提高性能/吞吐量;
ES可以完全自动管理分片的分配和文档的聚合来完成搜索请求,并且对用户完全透明;
主分片数在索引创建时指定,后续只能通过Reindex修改,但是较麻烦,一般不进行修改。
 

2.6 副本分片(replica shard)

一个分布式的集群,难免会有一台或者多台服务器宕机,如果我们没有副本这个概念。就会造成我们的shard发生故障,无法提供正常服务。

我们为了保证数据的安全,我们引入了replica的概念,跟hdfs里面的概念是一个意思。

可以保证我们数据的安全。

在ES集群中,我们一模一样的数据有多份,能正常提供查询和插入的分片我们叫做 primary shard,其余的我们就管他们叫做 replica shard(备份的分片) 

当我们去查询数据的时候,我们数据是有备份的,它会同时发出命令让我们有数据的机器去查询结果,最后谁的查询结果快,我们就要谁的数据(这个不需要我们去控制,它内部就自己控制了)

需要注意:

1.当分片或者节点发生故障时提供高可用性。因此,需要注意的是,副本分片永远不会分配到复制它的原始或主分片所在的节点上;

2.可以提高扩展搜索量和吞吐量,因为ES允许在所有副本上并行执行搜索;

3.默认情况下,ES中的每个索引都分配5个主分片,并为每个主分片分配1个副本分片。主分片在创建索引时指定,不能修改,副本分片可以修改。

3.ElasticSearch安装配置

在使用时我们需要安装3个东西:ES、Kibana、ElasticSearch Head。通过Kibana可以对ES进行便捷的可视化操作,通过ElasticSearch Head可以查看ES的状态及数据,可以理解为ES的图形化界面。

搜索docker镜像库里可用的ES镜像:

docker search elasticsearch

第二是已经融合了ES7.7和Kibana7.7的镜像,我们使用第二个

 把这个镜像从镜像库拉下来:

docker pull nshou/elasticsearch-kibana

把镜像启动为容器就可以了,端口映射保持不变,给这个容器命名为eskibana

docker run -d -p 9200:9200 -p 9300:9300 -p 5601:5601 --name eskibana  nshou/elasticsearch-kibana

还需要安装ElasticSearch Head,它相当于是ES的图形化界面,这个更简单,它是一个浏览器的扩展程序,直接在chrome浏览器扩展程序里下载安装即可:

1.打开chrome浏览器,在扩展程序chrome应用商店那里,搜索elasticsearch:

2.选择ElasticSearch Head,点击添加至Chrome,进行扩展程序的安装即可

到这里咱们的ES、Kibana、ElasticSearch Head都已经安装完成了

4.基础使用

ES 是RESTful 风格的系统,所以我们需要先掌握RESTful 的四个关键词:

PUT(修改),POST(添加),DELETE(删除),GET(查询)。其中在ES里面PUT和POST的界限并不是很分明,有时候PUT也作为添加。

4.1 索引基础操作

1.创建一个空索引

如下代码,咱们创建了一个0副本2分片的ropledata索引,然后咱们可以在Elasticsearch Head里刷新一下,并查看索引的信息:

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

 

 2.修改副本

咱们如果对刚才创建的索引副本数量不满意,可以进行修改,注意:分片不允许修改。

PUT ropledata/_settings 
{ 
  "number_of_replicas" : "2" 
}

 

3.删除索引

当这个索引不想用了,可以进行删除,执行如下命令即可,执行成功后,刷新ElasticSearch Head可以看到刚才创建的ropledata索引消失了:

DELETE /ropledata

 

 

 4.1 数据的增删改查

 1.插入数据

插入数据的时候可以指定id,如果不指定的话,ES会自动帮我们生成。我们以指定id为例,如下代码是我们创建了一个101的文档,创建成功后,可以在Elasticsearch Head的数据浏览模块里看到这些数据,代码及演示如下:

//指定id 
POST /ropledata/_doc/101 
{
  "id":1,
  "name":"且听_风吟",
  "page":"https://ropledata.blog.csdn.net",
  "say":"欢迎点赞,收藏,关注,一起学习" 
}

2.修改数据

这里大家要特别注意,ES里的文档是不可以修改的,但是可以覆盖,所以ES修改数据本质上是对文档的覆盖。ES对数据的修改分为全局更新局部更新,咱们分别进行code并对比:

全局更新

PUT /ropledata/_doc/101
{ 
  "id":1,
  "name":"且听_风吟",
  "page":"https://ropledata.blog.csdn.net",
  "say":"再次欢迎点赞,收藏,关注,一起学习" 
}

局部更新

POST /ropledata/_update/101 
{
  "doc":
  {
    "say":"奥力给"
  } 
}

局部更新的时候ES底层的流程是怎样的?和全局更新相比性能怎么样?

局部更新的底层流程:

内部先获取到对应的文档;
将传递过来的字段更新到文档的json中(这一步实质上也是一样的);
将老的文档标记为deleted(到一定时候才会物理删除);
将修改后的新的文档创建出来。

性能对比:

全局更新本质上是替换操作,即使内容一样也会去替换;
局部更新本质上是更新操作,只有遇到新的东西才更新,没有新的修改就不更新;
局部更新比全局更新的性能好,因此推荐使用局部更新。
 

3.查询数据

ES的数据查询知识点非常多,也非常复杂,本文只展示最基本的根据id搜索数据的code:

GET /ropledata/_doc/101

4.删除数据

比如我们想把ropledata索引下的id为101的文档删除,可以使用如下命令:

DELETE /ropledata/_doc/101

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值