• ES常见问题


    参考:

    https://developer.aliyun.com/article/879525(10道不得不会的ElasticSearch面试题)

    https://blog.csdn.net/QLCZ0809/article/details/124821823(30道你不得不会的Elasticsearch面试题)

    ES调优手段

    设计调优

    根据业务增量需求,采取基于日期模板创建索引,通过 rollover API 滚动索引;
    使用别名进行索引管理;(es的索引名不能改变,提供的别名机制使用非常广泛。)
    每天凌晨定时对索引做force_merge操作,以释放空间;
    采取冷热分离机制,热数据存储到SSD,提高检索效率;冷数据定期进行shrink操作,以缩减存储;
    取curator进行索引的生命周期管理;
    f仅针对需要分词的字段,合理的设置分词器; 
    Mapping阶段充分结合各个字段的属性,是否需要检索、是否需要存储等。

    写入调优

    写入前副本数设置为0;
    写入前关闭refresh_interval设置为-1,禁用刷新机制;
    写入过程中:采取bulk批量写入;
    写入后恢复副本数和刷新间隔;
    尽量使用自动生成的id。

    查询调优

    禁用wildcard;(通配符模式,类似于%like%)
    禁用批量terms(成百上千的场景);
    充分利用倒排索引机制,能keyword类型尽量keyword;

    ES部署时Linux系统设置调优

    1,关闭swap
    2,设置最大文件句柄数
    3,堆内存设置:节点内存/2

    ES怎样进行master选举

    1,Elasticsearch 的选主是 ZenDiscovery 模块负责的,主要包含 Ping(节点之间通过这个 RPC 来发 现彼此)和 Unicast(单播模块包含一个主机列表)这两部分;

    2,对所有可以成为 master 的节点(node.master: true)根据 nodeId 字典排序,每次选举每个节 点都把自己所知道节点排一次序,然后选出第一个(第 0 位)节点,暂且认为它是 master 节点。

    3,如果对某个节点的投票数达到一定的值(可以成为 master 节点数 n/2+1)并且该节点自己也选 举自己,那这个节点就是 master。否则重新选举一直到满足上述条件。

    避免脑裂

    1,当集群 master 候选数量不小于 3 个时,可以通过设置最少投票通过数量(discovery.zen.minimum_master_nodes)超过所有候选节点一半以上来解决脑裂问题;

    2,当候选数量为两个时,只能修改为唯一的一个 master 候选,其他作为 data节点,避免脑裂问题。

    对于 GC 方面,在使用 Elasticsearch 时要注意什么?

    1,倒排词典的索引需要常驻内存,无法 GC,需要监控 data node 上 segmentmemory 增长趋势

    2,各类缓存:indexing cache, bulk queue 等等,要设置合理的大小

    3,避免返回大量结果集的搜索与聚合。确实需要大量拉取数据的场景,可以采用scan & scroll api来实现

    在并发情况下,Elasticsearch 如果保证读写一致

    1,可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用层来处理具体的冲突;

    2,另外对于写操作,一致性级别支持 quorum/one/all设置为quorum(默认),即只有当大多数分片可用时才允许写操作。但即使大多数可用,也可能存在因为网络等原因导致写入副本失败,这样该副本被认为故障,分片将会在一个不同的节点上重建。

    3,对于读操作,可以设置 replication 为 sync(默认),这使得操作在主分片和副本分片都完成后才会返回;

    拼写纠错是如何实现的

    拼写纠错是基于编辑距离来实现

    如何监控 Elasticsearch 集群状态

    通过 Kibana 监控 Elasticsearch

    Lucene 的segment

    1,Lucene 索引是由多个段组成,段本身是一个功能齐全的倒排索引。

    2,段是不可变的,允许 Lucene 将新的文档增量地添加到索引中,而不用从头重建索引。

    3,对于每一个搜索请求而言,索引中的所有段都会被搜索,并且每个段会消耗CPU 的时钟周、文件句柄和内存。这意味着段的数量越多,搜索性能会越低。

    4,为了解决这个问题,Elasticsearch 会合并小段到一个较大的段,提交新的合并段到磁盘,并删除那些旧的小段。

    什么是段合并?段合并的时候会将那些旧的已删除文档从文件系统中清除。

    1,由于自动刷新流程每秒会创建一个新的段(由动态配置参数:refresh_interval 决定),这样会导致短时间内的段数量暴增。Elasticsearch 通过在后台进行段合并来解决这个问题。小的段被合并到大的段,然后这些大的段再被合并到更大的段。

    3,启动段合并不需要你做任何事。进行索引和搜索时会自动进行。

    force_merge的api操作

    参考:https://blog.csdn.net/vincent_duan/article/details/109318299

    查看某个index的forceMerge情况 
    GET /_cat/segments/myindex?v&s=prirep,shard
    
    首先查看我们的index(可以使用正则匹配)当前有多少个segment:
    GET _cat/segments/myindex?v&h=shard,segment,size,size.memory
    
    执行forcemerge:
    POST myindex/_forcemerge?max_num_segments=1 //这个过程可能执行的时间比较久。

    集群,节点,索引,分片,段的关系

    一个集群包含1个或多个节点;

    一个节点包含1个或多个索引;

    每个索引类似 Mysql 中的数据库,又由一个或多个分片组成;

    每个分片都是一个 Lucene 索引实例,您可以将其视作一个独立的搜索引擎,它能够对 Elasticsearch 集群中的数据子集进行索引并处理相关查询;

    每个分片包含多个segment(段),每一个segment都是一个倒排索引。

    索引翻滚 Rollover Index

    参考:https://blog.csdn.net/weixin_43820556/article/details/122072407

    分词器:

    参考:https://www.jianshu.com/p/65bcac286012(ES内置分词器)

    分词器是ES中专门处理分词的组件,英文为Analyzer,它的组成如下:

    Character Filters:针对原始文本进行处理,比如去除html标签
    Tokenizer:将原始文本按照一定规则切分为单词
    Token Filters:针对Tokenizer处理的单词进行再加工,比如转小写、删除或增新等处理

    内置分词器

    Standard Analyzer:默认
    Whitespace Analyzer:空白分隔符
    Keyword Analyzer:不分词
    Language Analyzers:语言分词
    
    eg
    POST _analyze
    {
      "analyzer": "standard",//修改分词器类型
      "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
    }

    中文分词器:

    使用较多的中文分词器是 elasticsearch-analysis-ik,这个是 es 的一个第三方插件,代码托管在 GitHub 上

  • 相关阅读:
    php7垃圾回收机制
    PHP-FPM
    go main.main之前的准备
    ElementUI MessageBox 弹框
    ElementUI table 样式修改
    ElementUI Dropdown 下拉菜单
    vue+django实现下载文件
    ElementUI 点击展开/隐藏
    vue+django实现websocket连接
    ElementUI 上传文件以及限制
  • 原文地址:https://www.cnblogs.com/tkzc2013/p/16487813.html
Copyright © 2020-2023  润新知