• elasticsearch介绍


    简介

    Elasticsearch是一个高可扩展的开源全文搜索和分析引擎,它允许存储、搜索和分析大量的数据,并且这个过程是近实时的。它通常被用作底层引擎和技术,为复杂的搜索功能和要求提供动力。

    基础概念

    Elasticsearch中有几个核心的概念,理解这些概念对于ES的学习还是很有帮助的。

    近实时(Near Realtime NRT)

    Elasticsearch是一个近实时的搜索平台,近实时的意思是指从你建立索引到你能够搜索这个文档这个过程,这个过程时间大概是1秒钟。

    集群(Cluster)

    一个集群包含一个或多个节点(node),用来保存全部数据,并且这些节点联合提供索引和搜索能力。集群使用唯一名称进行不同集群间的区分,默认名称是”elasticsearch”。集群的名称很重要,因为一个节点如果要加入到一个集群中,需要设置节点的集群名称。
    在实际应用中,需要确保你的不同环境,所使用的名称是不同的,否则会导致节点加入到其它集群环境中。比如你可以使用:logging-dev、logging-stage、logging-prod分别用来搭建开发、过渡、生产环境。
    集群可以只有一个节点,这个集群也能正常提供工作能力。此外,也可以搭建多个Elasticsearch集群,通过集群名称区分。

    节点(Node)

    在集群中一个节点是一个单独的服务,用来存储数据,为集群的索引和搜索提供能力。集群中的节点,也有唯一标识的,默认在节点启动的时候会随机指定一个UUID(Universally Unique IDentifiter)。如果不使用默认名称,可以为其指定一个名称。节点名称对于集群管理也是很重要的。
    一个节点要加入到指定集群,需要为节点指定集群名称。默认情况下,每个节点都设置集群名称为”elasticsearch”,所以当在同一网络环境中,默认启动一些节点,这些节点会组装成一个名为elasticsearch集群。

    索引(Index)

    一个索引包含许多特征类似的文档。例如,有一个索引用来索引用户数据,另一个索引用来索引产品目录,其它的索引可以索引其它数据。一个索引需要指定一个名称(必须全部小写),执行索引、搜索、修改和删除操作,需要指定对应的索引名称。
    在一个集群中,你可以创建多个索引。

    类型(Type)

    在一个索引中,可以定义多个类型。一个类型可以管理索引中符合特定逻辑的一部分数据。一般来说,类型定义具有公共字段的文档。例如你想创建一个博客平台,并且使用一个索引存储所有数据。在这个索引中,你可以定义一个类型用来存储用户数据,另一个类型用来存储博客数据,还可以创建一个类型用来存储评论。

    文档(Documeng)

    文档是能够被索引的基础单元。例如一个文档存储一个用户信息,另一个文档存储一个产品信息。Elasticsearch文档使用JSON(JavaScript Object Notation)来表现数据。
    在一个索引/文档中可以存储许多文档。需要注意,尽管一个文档在物理存储上是存储在一个索引中的,但文档必须被索引或分配给索引的类型中。

    分片(Shard)&副本(Replicas)

    在实际应用中可能存在这样的场景,一个索引存储超过了一个节点的物理存储能力。例如一个索引有十亿的文档,超过了1TB的存储,在单个节点无法完全存储,并且对于单个节点的搜索请求是非常慢的。
    为了解决这些问题,Elasticsearch提供了为索引切分成多个分片(Shard)的能力,当你创建一个索引的时候,你能够定义索引被分割成多少个shard。每一个shard都是功能完全,能够独立索引的,可以分配到集群中任何一个节点中。

    使用分片有两个重要原因:

    • 允许水平分割文档,分布存储。
    • 允许你分配并且执行分片,在多个节点中能够提供查询性能和吞吐量。

    shard如何分布,当一个请求发来后如何组织数据,这些对于用户来说都是透明的。
    当在一个网络环境中,有可能某个节点或分片丢失。Elasticsearch提供了一种针对这种故障转移的功能,就是副本。Elasticsearch允许你为一个分片创建一个或多个副本。分片和副本又称为主/副分片。

    使用副本有两个重要原因:

    • 当一个节点或分片丢失后,能够继续使用。因此,需要注意的是主/副分片不会存储在一个节点中。
    • 当进行搜索的时候,允许搜索所有的副本,所以提高了搜索性能。

    所以一个索引能够分割成多个shard,一个索引能够可以有零个或多个副本。每个索引都有主分片(索引切割后的分片,又称原始分片)和副本分片(从原始分片复制过来的)。分片数量和副本数量在创建索引的时候可以被指定,当索引创建后,可以指定改变副本数量,但是不能改变分片数量。默认情况下每个索引在Elasticsearch有5个分片和1个副本,也就是说总共10个shard(副本是对分片来说的,每个shard又一个副本)。每一个shard内部都是一个Lucene索引实例,单个lucene索引最多能够存储2,147,483,519(Integer.MAX_value-128)个文档。

           elasticsearch 可视化工具图片

    • node:即一个 Elasticsearch 的运行实例,使用多播或单播方式发现 cluster 并加入。
    • cluster:包含一个或多个拥有相同集群名称的 node,其中包含一个master node。
    • index:类比关系型数据库里的DB,是一个逻辑命名空间。
    • alias:可以给 index 添加零个或多个alias,通过 alias 使用index 和根据index name 访问index一样,但是,alias给我们提供了一种切换index的能力,比如重建了index,取名customer_online_v2,这时,有了alias,我要访问新 index,只需要把 alias 添加到新 index 即可,并把alias从旧的 index 删除。不用修改代码。
    • type:类比关系数据库里的Table。其中,一个index可以定义多个type,但一般使用习惯仅配一个type。
    • mapping:类比关系型数据库中的 schema 概念,mapping 定义了 index 中的 type。mapping 可以显示的定义,也可以在 document 被索引时自动生成,如果有新的 field,Elasticsearch 会自动推测出 field 的type并加到mapping中。
    • document:类比关系数据库里的一行记录(record),document 是 Elasticsearch 里的一个 JSON 对象,包括零个或多个field。
    • field:类比关系数据库里的field,每个field 都有自己的字段类型。
    • shard:是一个Lucene 实例。Elasticsearch 基于 Lucene,shard 是一个 Lucene 实例,被 Elasticsearch 自动管理。之前提到,index 是一个逻辑命名空间,shard 是具体的物理概念,建索引、查询等都是具体的shard在工作。shard 包括primary shard 和 replica shard,写数据时,先写到primary shard,然后,同步到replica shard,查询时,primary 和 replica 充当相同的作用。replica shard 可以有多份,也可以没有,replica shard的存在有两个作用,一是容灾,如果primary shard 挂了,数据也不会丢失,集群仍然能正常工作;二是提高性能,因为replica 和 primary shard 都能处理查询。另外,如上图右侧红框所示,shard数和replica数都可以设置,但是,shard 数只能在建立index 时设置,后期不能更改,但是,replica 数可以随时更改。但是,由于 Elasticsearch 很友好的封装了这部分,在使用Elasticsearch 的过程中,我们一般仅需要关注 index 即可,不需关注shard。

    综上所述,shard、node、cluster 在物理上构成了 Elasticsearch 集群,field、type、index 在逻辑上构成一个index的基本概念,在使用 Elasticsearch 过程中,我们一般关注到逻辑概念就好,就像我们在使用MySQL 时,我们一般就关注DB Name、Table和schema即可,而不会关注DBA维护了几个MySQL实例、master 和 slave 等怎么部署的一样。

    下表用Elasticsearch 和 关系数据库做了类比:

    • index => databases
    • type => table
    • field => field
    • document => record
    • mapping => schema

    本文来自http://lxwei.github.io/posts/Elasticsearch-%E7%AE%80%E4%BB%8B.html和https://www.jianshu.com/p/afd961ecb13c的整理结合,适合初学者理解

    资深者请查看原文

         

  • 相关阅读:
    Log4net源码分析(一)
    找不到具有绑定 WSHttpBinding 的终结点的与方案 http 匹配的基址。注册的基址方案是 []。
    C#线程锁使用全功略
    C#泛型版的超级优化的快速排序算法和插入排序、二分查找算法
    用WM_COPYDATA实现进程通信
    构建插件式的应用程序框架(二)-订立契约
    Ajax网站安全,谁来保证
    构建插件式的应用程序框架(三)-动态加载
    构建插件式的应用程序框架(八)-视图服务的简单实现
    插件架构学习体会(一) 宿主程序说:插件你得听我的
  • 原文地址:https://www.cnblogs.com/yu-hailong/p/8086856.html
Copyright © 2020-2023  润新知