ES

112次阅读

共计 2232 个字符,预计需要花费 6 分钟才能阅读完成。

搜索引擎和 NoSQL 数据库功能,用于全文搜索,结构化搜索,近实时分析
指南:https://es.xiaoleilu.com/020_…
常用:E(存储和索引)L(数据转换和解析 Beat 采集过来)K(可视化)


Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch
Local FileSystem 等。索引信息,集群内信息,mapping,transaction log
lucene directory lucene 不同存储层服务发现的抽象,FSDirectory,RAWDirectory 控制索引文件的位置
discovery Zen 服务发现 + 选主
driver:数据源 racketmq 等
memcached 协议:get/set/delete/quit

  • 高可用和可扩展
    1。集群发现与故障处理:
    服务发现 + 选主,ping,rsp 包含节点基本信息和该节点认为的 master 节点,支持非奇数,信息不对等时会有脑裂,要求
    ping 所有节点。返回其他节点认为的主节点,也返回候选主节点(配置中 master!=false)。如果第一个不为空,直接选节点最小的,若为空,候选节点 >discovery.zen.minimum_master_nodes 则选一个状态 +nodeid 最小的,否则失败。思想就是有旧的 master 活着尽量用。
    主节点是群集中唯一可以更改群集状态的节点。主节点一次处理一个群集状态更新,应用所需的更改并将更新的群集状态发布到群集中的所有其他节点。每个节点接收发布消息,承认它,但它不是还没有应用它。如果主服务器 discovery.zen.minimum_master_nodes 在一定时间内没有从至少节点收到确认(由 discovery.zen.commit_timeout 设置控制并默认为 30 秒),则拒绝集群状态更改,重新选主。
    无主时默认不能写
    2. 负载均衡: 轮询
    3. 分片机制:索引键值 hash% 分片数量。主分片 + 副本分片
    水平扩展(分片数量不能改变,只能改变每个节点有几个分片,每个分片副本分散到哪些节点)
    单节点存储瓶颈等时扩展:


    处理瓶颈时扩展:

    master 和节点统一。master 只负责索引的创建和删除

  • 数据处理过程
    节点对等写入和读取。写入只能在 P 分片然后同步复制到 R 分片,读写转发到主节点或副本节点
    1. 更新过程:

    2. 搜索:需要先查询排序再取回排序中想要的数据

    其中查询:1).node3 创建 from+size 优先队列
    2). 请求转发个每个分片,每个分片自己获取 from+size 本地优先队列
    3). 返回给 node3 合并产生全局排序
    搜索有两种:基于短语的、全文索引
    1)基于短语的:低级查询,没有分析,精确查找(加 not_analyzed)
    2)match,query_string 这种高级查询,会产生短语列表和低级查询结合,得到文档相关度。

    Elasticsearch 通过下面的步骤执行 match 查询:检查 field 类型
    title 字段是一个字符串(analyzed),所以该查询字符串也需要被分析(analyzed)
    分析查询字符串
    查询词 QUICK! 经过标准分析器的分析后变成单词 quick。因为我们只有一个查询词,因此 match 查询可以以一种低级别 term 查询的方式执行。找到匹配的文档
    term 查询在倒排索引中搜索 quick,并且返回包含该词的文档。为每个文档打分
    term 查询综合考虑词频(每篇文档 title 字段包含 quick 的次数)、逆文档频率(在全部文档中 title 字段包含 quick 的次数)、包含 quick 的字段长度(长度越短越相关)来计算每篇文档的相关性得分_score。(更多请见相关性介绍)因为 match 查询需要查询两个关键词:"brown" 和 "dog",在内部会执行两个 term 查询并综合二者的结果得到最终的结果。match 的实现方式是将两个 term 查询放入一个 bool 查询
  • 数据组织
    关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列 (Columns)
    Elasticsearch ⇒ 索引(=》分片 =》segment) ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)
    索引只是一个用来指向一个或多个分片 (shards) 的“逻辑命名空间 (logical namespace)”.
    分片就是一个 Lucene 实例,文档存储在分片中,并且在分片中被索引
    每个分片上包含此分片的所有数据索引和数据,我们的 elk,每天都是一个新库(index),为其建立 traceid,urlkey 索引的含义只是创建索引,并不对所有词都建立倒排索引,虽然本身 es 每个词都可搜索

    词 =》倒排索引,包含每个 filed(term)在每个文档中的值
    写入磁盘的倒排索引是不可变的. 不需要加锁,不需要重建任何缓存,可以压缩数据
    动态索引、近实时索引:

    Luence per-segment search 索引:段的集合 + 提交点(包含所有段的文件)

    1. 当一个文档被索引,它被加入到内存缓存,同时加到事务日志。2.refresh 使得分片的进入如下图描述的状态。每秒分片都进行 refeash:内存缓冲区的文档写入到段中,但没有 fsync。段被打开,使得新的文档可以搜索。缓存被清除
    3. 随着更多的文档加入到缓存区,写入日志,这个过程会继续
    4. 不时地,比如日志很大了,新的日志会创建,会进行一次全提交:内存缓存区的所有文档会写入到新段中。清除缓存
    一个提交点写入硬盘
    文件系统缓存通过 fsync 操作 flush 到硬盘
    事务日志被清除
    
    

正文完
 0