ELK概念清单(ELK架构入门必读)

之前尝试了用mysql做大规模数据的检索优化【点击查看】

可以看到单字段检索的情况下,是可以通过各种手段做到各种类型索引快速检索的,那是一种相对简单的场景。

但是实际应用往往会复杂一些 —— 各类索引(关键词匹配、全文检索、时间范围)混合使用,还有排序的需求。这种情况下mysql就有点力不从心了,复杂的索引类型,在多索引检索的时候对每个字段单独建索引于事无补,而联合索引无法在如此复杂的索引类型下建起来。

用ElasticSearch来解决这个场景的问题就要简单的多了。那么如何用elastic来解决这个问题呢? 还是带着业务需求来实践一遍吧:

①检索字段有7个,4个关键词匹配,1个特殊要求的a=b&c=d的分段全文检索,1个中文全文检索,1个时间范围

②数据量很大,需要支持3个月数据的检索,最好能按月建索引,方便冷备、恢复

 

1.倒排索引(反向索引)

直接硬刚理解比较难以理解,但是我们可以从反面来进行对比来分析。

反向索引的反面即正向索引,我理解为我们平常使用如redis的key-value方式,是通过key来查找value。而elasticsearch则刚好与之相反,他是通过将value分成多份来查询key的,例如,有这么一个键值对:"letter"->"abcdefg"

使用redis即get letter可获取到值 abcdefg

使用elasticsearch,搜索a或b或c或d或e或f或g,就会返回abcdefg

这样本来正向索引只需要一个键值对的,变成了7个键值对了

如果配合redis使用的话,那么可以使用elasticsearch,搜索a或b或c或d或e或f或g,就会返回letter,再通过redis查询key获取abcdefg

2.搜索引擎三大过程

爬取内容、进行分词、建立反向索引

3.分布式搜索引擎

elasticsearch在lucene的基础上进行封装,实现了分布式搜索引擎

4.索引、类型和文档

elasticsearch的索引相当于mysql中的数据库 (Index=>Database)

类型相当于mysql中的表 (Type=>Table)

文档相当于mysql中的数据 (Document=>Row)

5.elasticsearch也是master-slave架构

实现了数据的分片和备份

6.elasticsearch、Logstash和Kibana组成elk日志系统

7.ES在数据存储上有2个重要特点:分片和副本

分片:是指将一份完整的数据集(索引)分成若干片段的数据;分片使es保存的数据具有很强的横向扩展能力,可以支持海量数据的高性能存储和查询。

副本:副本是分片数据的备份。使数据具有高可用和容灾能力,即使部分ES数据节点挂掉仍然可以正常运行

8. 为什么Elasticsearch检索可以比MySQL快

Mysql只有term dictionary这一层,是以B+树的方式存储在磁盘上的。检索一个term需要若干次的random access的磁盘操作。

而Elasticsearch在term dictionary的基础上添加了term index来加速检索,term index以树的形式缓存在内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘的random access次数。

额外值得一提的两点是:term index在内存中是以FST(finite state transducers)的形式保存的,其特点是非常节省内存。Term dictionary在磁盘上是以分block的方式保存的,一个block内部利用公共前缀压缩,比如都是Ab开头的单词就可以把Ab省去。这样term dictionary可以更节约磁盘空间。

9. ES的核心概念

数据库的功能面对很多领域是不够用的,特殊的功能比如全文检索、同义词处理、相关度排名、复杂数据分析、海量数据的近实时处理;Elasticsearch作为传统数据库的一个补充,提供了数据库所不能提供的很多功能

1.Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级。
2.Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的。
3.Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群
4.Document&field:文档,es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。
5.Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。
6.Type:类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。
7.shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。
8.replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。

10.

ES会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引。

"type": "text" "type": "geo_point"

11.ES的元数据

1. _index元数据
  a.代表一个document存放在哪个index中
  b.类似的数据放在一个索引,非类似的数据放不同索引:product index(包含了所有的商品),sales index(包含了所有的商品销售数据),inventory index(包含了所有库存相关的数据)。如果你把比如product,sales,human resource(employee),全都放在一个大的index里面,比如说company index,不合适的。
  c.index中包含了很多类似的document,就是说这些document的fields很大一部分是相同的,你说你放了3个document,每个document的fields都完全不一样,这就不是类似了,就不太适合放到一个index里面去了
  d.索引名称必须是小写的,不能用下划线开头,不能包含逗号
2. _type元数据
  a.代表document属于index中的哪个类别(type)
  b.一个索引通常会划分为多个type,逻辑上对index中有些许不同的几类数据进行分类:因为一批相同的数据,可能有很多相同的fields,但是还是可能会有一些轻微的不同,可能会有少数fields是不一样的,举个例子,就比如说,商品:可能划分为电子商品,生鲜商品,日化商品,等等。
  c.type名称可以是大写或者小写,但是同时不能用下划线开头,不能包含逗号
3. _id元数据
  a.代表document的唯一标识,与index和type一起,可以唯一标识和定位一个document 【记录主键】
  b.两种生成方法,第一种手动指定document的id(put /index/type/id),第二种以由es自动为我们创建id(长度为20个字符,URL安全,base64编码,GUID算法,保证分布式系统并行生成时不会发生冲突
4. _source元数据
  a.定制返回的结果,指定_source中,返回哪些field     例:GET /test_index/test_type/1?_source=test_field1,test_field2

12.mapping【结构定义】

1.概述:
自动或手动 为index中的type建立的一种数据结构和相关配置,简称为mapping。
②可以在创建数据之前,手动先创建index和type,以及type对应的mapping,但是不能修改mapping。
③dynamic mapping,自动为我们建立index、type,以及type对应的mapping。
mapping中包含了每个field对应的数据类型,以及如何分词等设置
④不同的数据类型(比如说date和text),可能有的是exact value,有的是full text。
⑤mapping就是index的type的元数据,每个type都有一个自己的mapping,决定了数据类型,建立倒排索引的行为,进行搜索的行为。
exact value,在建立倒排索引的时候,分词的时候,是将整个值一起作为一个关键词建立到倒排索引中的;full text,会经历各种各样的处理,分词,normaliztion(时态转换,同义词转换,大小写转换),才会建立到倒排索引中。

注意: mappings 一旦创建,则无法修改。因为Lucene 生成倒排索引后就不能改了

2.查看mapping
语法:GET /index/_mapping/type
示例:GET /website/_mapping/article
3.创建mapping示例
PUT /website
{
  "mappings": {
    "article":{
      "properties": {
        "authorId":{
          "type": "long"
        },
        "title":{
          "type": "text",
          "fields": {
            "keyword":{
              "type": "keyword",
              "ignore_above": 50
            }
          }
        },
        "postDate":{
          "type": "date"
        }
      }
    }
  }
}
4.mapping的常用字段类型
string(5.0版本后拆分成两种数据类型text和keyword)
byte,short,integer,long
float,double
boolean
date
5.定制dynamic mapping策略
PUT /my_index
{
  "mappings": {
"my_type": {
  "dynamic": "strict",
  "properties": {
"title": {
  "type": "text"
},
"address": {
  "type": "object",
  "dynamic": "true"
}
  }
}
  }
}

一般的, mapping 可以分为  动态映射(dynamic mapping) 和 静态(显示) 映射 (explicit mapping) 和精准(严格) 映射(strict mapping)具体由dynamic 属性控制

true:  (动态映射) 默认,遇到陌生字段,就进行dynamic mapping (能写能查,mapping自动更新)
false:(静态映射) 遇到陌生字段,就忽略 (存储时会存储该字段。  相当于能写 不能 查,新增字段只能当做搜索结果呈现)
strict:(严格模式) 遇到陌生字段,就报错 (写入是报错)

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值