2024年Go最新初识ElasticSearch_es服务器资源隔离(4),2024年最新程序员必须要了解的知识点

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

按照上面的权威指南操作,创建一个通过id链接到用户的博客,最上面提到本书基于 Elasticsearch 2.x 版本,这里使用的是Elasticsearch 7.x 版本。7.x版本不允许一个index下有多个type了。

调用查询映射接口,my_index索引已经映射到了name、email、dob的数据类型了。

ES关闭后,后面重新开启,查询ES服务器下的所有索引,查询结果如下,记录着之前创建过的索引,说明ES也是会对存储数据进行持久化。

按照上面的权威指南文档进行学习好像并没有那么流畅,我们重新找一份其他的较为可信的API文档进行学习。

基本概念

参看阿里云文档先来学习一下ES的一些基本概念,

集群(Cluster)

一个Elasticsearch集群由一个或多个ES节点组成,并提供集群内所有节点的联合索引和搜索能力(所有节点共同存储数据)。一个集群被命名为唯一的名字(默认为elasticsearch),集群名称非常重要,因为节点需要通过集群的名称加入集群。

请确保在不同的环境使用不同的集群名称,否则会导致节点添加到错误的集群中。

节点(Node)

一个节点是集群中的一个服务器,用来存储数据并参与集群的索引和搜索。和集群类似,节点由一个名称来标识,默认情况下,该名称是在节点启动时分配给节点的随机通用唯一标识符(UUID)。您也可以自定义任意节点的名称,节点名称对于管理工作很重要,因为通过节点名称可以确定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。

一个节点可以被添加到指定名称的集群中。默认情况下,每个节点会被设置加入到名称为elasticsearch的集群中,这意味着,如果在您在网络中启动了某些节点(假设这些节点可以发现彼此),它们会自动形成并加入名称为elasticsearch的集群中。

一个集群可以拥有任意多的节点。此外,如果在您的网络中没有运行任何Elasticsearch节点,此时启动一个节点会创建一个名称为elasticsearch的单节点集群。

索引(Index)

一个索引是一个拥有一些相似特征的文档的集合(相当于关系型数据库中的一个数据库)。例如,您可以拥有一个客户数据的索引,一个商品目录的索引,以及一个订单数据的索引。一个索引通常使用一个名称(所有字母必须小写)来标识,当针对这个索引的文档执行索引、搜索、更新和删除操作的时候,这个名称被用来指向索引。Elasticsearch与关系型数据库的对应关系如下表所示,

Elasticsearch关系型数据库
索引(index)数据库(Database)
文档类型(type)表(Table)
文档(document)一行数据(Row)
字段(field)一列数据(Column)
映射(mapping)数据库的组织和结构(Schema)

类型(Type)

一个类型通常是一个索引的一个逻辑分类或分区,允许在一个索引下存储不同类型的文档(相当于关系型数据库中的一张表),例如用户类型、博客类型等。目前已经不支持在一个索引下创建多个类型,并且类型概念已经在后续版本中删除,这也就是为什么上面在同一个索引下创建用户和博客失败的原因。

文档(Document)

一个文档是可以被索引的基本信息单元(相当于关系型数据库中的一行数据)。例如,您可以为一个客户创建一个文档,或者为一个商品创建一个文档。文档可以用JSON格式来表示。在一个索引中,您可以存储任意多的文档,且文档必须被索引。

字段(Field)

组成文档的最小单位。相当于关系型数据库中的一列数据。

映射(Mapping)

用来定义一个文档以及其所包含的字段如何被存储和索引,例如在mapping中定义字段的名称和类型,以及所使用的分词器。相当于关系型数据库中的Schema。

分片(Shards)

代表索引分片,Elasticsearch可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

一个分片可以是主分片或副本分片。Elasticsearch 7.0以下版本默认为一个索引创建5个主分片,并分别为每个主分片创建1个副本分片,7.0及以上版本默认创建1个主分片和1个副本分片。两者区别如下:

分片类型支持处理的请求数量是否可修改其他说明
主分片支持处理查询和索引请求。在创建索引时设定,设定后不可更改。索引内任意一个文档都存储在一个主分片中,所以主分片的数量和大小决定着索引能够保存的最大数据量。 注意 :主分片不是越多越好,因为主分片越多,Elasticsearch性能开销也会越大。
副本分片支持处理查询请求,不支持处理索引请求。可在任何时候添加或删除副本分片。副本分片对搜索性能非常重要,主要体现在以下两个方面:
  • 提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。
  • 提高Elasticsearch的查询效率,Elasticsearch会自动对搜索请求进行负载均衡。
    |

Recovery

代表数据恢复或数据重新分布,Elasticsearch在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

Gateway

代表Elasticsearch索引快照的存储方式,Elasticsearch默认优先将索引存放到内存中,当内存满时再将这些索引持久化存储至本地硬盘。gateway对索引快照进行存储,当这个Elasticsearch集群关闭再重新启动时就会从gateway中读取索引备份数据。Elasticsearch支持多种类型的gateway,有本地文件系统(默认)、分布式文件系统、Hadoop的HDFS和阿里云的OSS云存储服务。

Discovery.zen

代表Elasticsearch的自动发现节点机制,Elasticsearch是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议进行节点之间的通信,同时也支持点对点的交互。

Transport

Transport代表Elasticsearch内部节点或集群与客户端的交互方式,默认使用TCP协议进行交互。同时,通过插件的方式集成,也支持使用HTTP协议(JSON格式)、thrift、servlet、memcached、zeroMQ等传输协议进行交互。

数据类型(Data Type)

那么,ES支持的数据类型有哪些呢?字符串类型、数值类型、浮点类型、逻辑类型、日期类型、范围类型、二进制类型、复合类型等。详细参看文末链接,以及官网文档:

Field data types | Elasticsearch Guide [7.14] | Elastic

这里提出个问题,为什么ES在后续版本中不允许一个索引下有多个类型?

查阅资料显示是,因为同一个索引(index)下的不同类型(type)下如果有相同的字段(field)会存在冲突,导致Lucene处理效率下降。

传统sql数据库中,各个数据库表之间是相互独立的,即使有相同的字段也不会产生冲突,即表A中的列与表B中的列无关。但ES不同Type下的相同Field就会有问题,那么我们先来了解一下底层数据结构。

倒排索引(Inverted Index)

传统mysql的数据结构使用的是B+树进行数据存储,那ElasticSearch中的数据是如何存储的呢?

倒排索引也可以叫反向索引,一般进行搜索时都是通过正向索引去遍历得到对应的值,而反向索引则是通过值得到对应的文档集合。

倒排索引源于实际应用中需要根据属性的值来查找记录,lucene是基于倒排索引实现的。倒排索引由两个部分组成:单词词典和倒排文件。

  • 单词词典:它是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
  • 倒排文件:所有单词的倒排列表顺序的存储在磁盘的某个文件里,这个文件即被称为倒排文件,倒排文件是存储倒排索引的物理文件。

Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包。

关于Lucene的内容可以参看链接:https://segmentfault.com/a/1190000013822385

ES和Lucene的关系可以参看链接:Elasticsearch中数据是如何存储的? - 51CTO.COM

阿里ES内核

1、阿里云ES提供了慢查询隔离池(Slow Query Isolation Pool)功能,实现对单条查询请求进行开销追踪及逻辑隔离,超过资源安全阈值后,自动熔断异常查询,避免单条异常查询导致集群异常,提高集群的稳定性。

2、阿里云ES使用了时序查询剪枝功能提高查询性能。查询时按时间范围对数据进行裁剪,查询性能相较原生ES更好。

项目实践

新建一个Spring项目,Add FrameWork Support添加maven框架支持。添加依赖

未完待续。。。

参考链接

1、ElasticSearch中文文档:Elasticsearch: 权威指南 | Elastic

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

-1715644954515)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值