【ES三周年】01 |
您所在的位置:网站首页 › 开税发票网站怎么登录 › 【ES三周年】01 |
1. 入门简介1.简介 Elasticsearch(ES) 是一个基于 Apache Lucene 开源的分布式、高扩展、近实时的搜索引擎,主要用于海量数据快速存储,实时检索,高效分析的场景。通过简单易用的 RESTful API,隐藏 Lucene 的复杂性,让全文搜索变得简单。 ES 功能总结有三点: 分布式存储分布式搜索分布式分析因为是分布式,可将海量数据分散到多台服务器上存储,检索和分析,只要是海量数据需要完成上面这三种操作的业务场景,一般都会考虑使用 ES,比如维基百科,Stack Overflow,GitHub 后台均有使用。 下面是 DB-Engines Ranking 给出的数据库流行度排行榜。ES 位居 Top 10 的位置,受欢迎的程度,可见一斑。 2. 特点ES 为什么这么受欢迎,得益于其相较于传统数据库所拥有的强大功能。 ES 不是什么新技术,主要是将全文检索、数据分析以及分布式技术结合在一起,形成了独一无二的 ES;数据库的功能面对很多领域是不够用的,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;ES 作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能;可以作为一个大型分布式集群(数百台服务器)技术,处理 PB 级数据,服务大公司;也可以运行在单机上,服务小公司;对用户而言,开箱即用,非常简单,作为中小型的应用,分钟级部署,就可以作为生产环境的系统来使用了。 3. Kibana说到 ES 必须要提一下 Kibana 。 ES、Logstash 和 Kibana 共同组成 ELK。ELK 是这三个开源项目的首字母缩写。这个三个项目组合在一起,就形成了 ELK 软件栈。他们三个共同形成了一个强大的生态圈。 简单地说,Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 ES 等存储库中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Elasticsearch 处于最核心的位置,它可以帮我们对数据进行快速地搜索及分析。 Kibana 以 Web 后台的形式提供了一个可视化操作 ES 的系统,支持根据 ES 数据绘制图表,支持 ES 查询语法自动补全等高级特性,更加方便了我们操作 ES。 事实上 Elasticsearch 的完整栈有如下的几个: ElasticsearchKibanaLogstashBeats其中 Beats 是一个免费且开放的平台,集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。 4. 存储结构要想完成对 ES 的增删改查,必须先了解一下 ES 的存储结构。 大家对 MySQL 的存储结构应该是很清楚的,所以咱们在学习 ES 存储结构时,同时类比 MySQL,这样理解起来会更透彻。MySQL 的数据模型由数据库、表、字段、字段类型组成,自然 ES 也有自己的一套存储结构。 ES 存储结构与 MySQL 存储结构的对应关系。 ES存储结构 MySQL存储结构 Index 表 Document 行 Field 表字段 Mapping 表结构定义 DSL SQL 事物 乐观锁(version) 1. index索引(index)类似 MySQL 的表,是文档(document)的集合。文档是 ES 中存储的一条数据,下面会详细介绍。 2. typetype 为文档类型,不过在 ES 7.0 以后的版本 已经废弃文档类型了,一个 index 中只有一个默认的 type,即 _doc。在 ES 老版本中文档类型代表一类文档的集合,index 类似 MySQL 的数据库,文档类型类似 MySQL 的表。既然 ES 新版本文档类型没什么作用了,那么 index(索引)就类似 MySQL 表的概念,ES 没有数据库的概念了。 老版本 ElasticSearch与Mysql对照表: 3. documentES 是面向文档的数据库,文档是 ES 存储的最基本的存储单元,文档类似 MySQL 表中的一行数据。在 ES 中,文档使用 JSON 格式存储,因此存储上要比 MySQL 灵活很多,因为 ES 支持任意格式的 JSON 数据。 { "_index" : "order", "_type" : "_doc", "_id" : "1", "_version" : 2, "_seq_no" : 1, "_primary_term" : 1, "found" : true, "_source" : { "id" : 10000, "status" : 0, "total_price" : 10000, "create_time" : "2020-09-06 17:30:22", "user" : { "id" : 10000, "username" : "asong2020", "phone" : "888888888", "address" : "深圳人才区" } } }其中 _source 为记录的具体内容,其他字段为文档的元数据,是插入 JSON 记录时 ES 自动生成的系统字段,二者共同组成一个 document。 常用的元数据有: _index:代表当前文档所属索引,(可以当成mysql中记录的所在表) _type:代表当前文档所属类型(ES 7.0 以后废弃了 type 用法,但是元数据还是可以看到的) _id:文档唯一 ID,如果没有为文档指定 ID 则自动生成。 _source:文档的原始 JSON 数据 _version:文档的版本号,每修改一次文档,字段就会加 1,这个字段新版 ES 也给取消了 _seq_no:文档编号,每修改一次文档,字段就会加 1,替代老的 version。注意 seq_no 递增属于整个 index,而不是单个文档 _primary_term:文档所在主分区,这个可以跟 seq_no 搭配实现乐观锁并发控制,以防止旧版本的文档覆盖较新的文档。 4. field文档由多个 JSON 字段组成,字段跟 MySQL 中表的字段类似,常用字段类型有: binary:编码为Base64字符串的二进制值boolean:布尔类型Keywords:关键词族,不支持全文搜索。具体包括 keyword, constant_keyword 和 wildcardNumbers:数值类型,包括 long、integer、short、byte、double、float、half_float、scaled_float、unsigned_longDates:日期类型,包括 date 和 date_nanostext 文本类型,支持全文搜索alias:为现有字段的别名更多类型请查阅 Elasticsearch Guide 8.0] » Mapping » Field data types。 5. mappingmapping 类似于 MySQL 的表结构定义,每个索引都有一个映射的规则,我们可以通过定义索引的映射规则,提前定义好文档的 JSON 结构和字段类型。如果没有定义索引的 mapping,ES 会在写入数据的时候,根据我们写入的数据字段推测出对应的字段类型,相当于自动定义索引的 mapping 。 mapping是处理数据的方式和规则方面做一些限制, 如:某个字段的数据类型、默认值、分析器、是否被索引等等。这些都是映射里面可以设置的,其它就是处理ES里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。 注意: ES 的自动映射很方便,是实际业务中,对于关键字段类型,通常预先定义好,这样可以避免 ES 自动生成不是你想要的字段类型。 5. 其他重要概念除了数据结构的相关概念,因 ES 是一个分布式支持水平扩展的数据库系统,必然少不了分布式相关的概念,这个最好也需要了解一下。 1. Cluster 集群一个集群由一个或多个节点组成,它们共同持有数据,一起提供存储搜索功能。 集群 由一个唯一的名字 进行区分,默认为"elasticsearch",集群中的节点通过这个唯一的名字加入集群。 2. Node 节点节点是 ES 集群的一部分,只要多个节点在同个网络中,节点就可以通过 指定集群的名称 加入其中,与集群中的其他节点相互感知。 和集群类似,一个节点也是由一个唯一名字来标识的。默认情况下,这个名字是一个随机的漫威漫画角色名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于 ES 集群中的哪些节点。 3. Shard 分片索引可以存储大量的数据,这些数据可能超过单个节点的硬件限制。为了解决这一问题,ES 提供细分索引的能力,即分片(shard)。 一个 shard 对应一个 Lucene 实例。ES 可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。 分片的数量只能在索引创建前指定,并且索引创建后不能更改。 至于一个分片怎样分布,它的文档怎样聚合回搜索请求,完全由 ES 管理,对于作为用户来说,这些都是透明的。 4. Replica 副本在一个网络环境里,节点故障随时都可能发生,在某个分片/节点出现故障时,有一个备份机制是非常有用的。为此 ES 允许你为分片创建一份或多份拷贝,这些拷贝叫做副本(replica)。 副本之所以重要,主要有两方面的原因:一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高查询效率,ES 会自动对搜索请求进行负载均衡。 总之,每个索引可以被分成多个分片。一个索引也可以被复制 0 次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片和副分片(主分片的拷贝)。分片和复本的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变副本数量,但是不能改变分片的数量。 默认情况下,ES 中的每个索引被分为 5 个主分片和 1 份拷贝。如果你的集群中至少有两个节点,你的索引将会有 5 个主分片和另外 5 个副分片,这样的话每个索引总共就有 10 个分片。一个索引的多个分片可以存放在集群中的一台主机上,也可以分散存放在多台主机上,这取决于你的集群机器数量。主分片和副分片的具体位置是由 ES 内在的策略所决定的。有一点可以确定是,同一个节点上面,副本和主分片是一定不会在同一个节点上的。 注意: 从 7.x 版本开始,不设置 index 的 shard 数,缺省(默认)主分片由 5 改为了 1 个。 以上相关概念的逻辑关系如下图: 5. Allocation 分配将分片分配给某个节点的过程,包括分配主分片或者副本。如果是副本,还包含从主分片复制数据的过程。这个过程是由master节点完成的。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |