• elasticsearch笔记


    elasticsearch

    基本概念
    Cluster 多个es node组成的集群应用
    Node 一个es server应用
    Index 一类document的集合
    Document es的数据对象,可以用来被索引的基本单元
    Shard 分片
    Rplica 副本

    配置
    JVM配置
    heap size
    修改/etc/elasticsearch/jvm.options配置文件
    或export ES_JAVA_OPTS="$ES_JAVA_OPTS -Xmx2g -Djava.io.tmpdir=/path/to/temp/dir"
    es会从环境变量中获取${ES_JAVA_OPTS}

    安全配置
    bin/elasticsearch-keystore list

    重要配置
    cluster.name 集群名称
    node.name 节点名称
    network.host 网络主机

    集群发现配置
    discovery.zen.ping.unicast.hosts: [NODE_IP1,NODE_IP2,...]
    避免数据丢失,集群最少可用node节点:
    discovery.zen.minimum_master_nodes: (master_eligible_nodes / 2) + 1

    heap size
    ES_JAVA_OPTS="-Xms2g -Xmx2g"
    不要超过50%的物理内存||heap.size<26GB(32GB)

    系统配置
    关闭swapping,避免es的数据被交换出内存
    sudo swapoff -a
    锁定es所使用的内存
    config/elasticsearch.yml中配置bootstrap.memory_lock: true
    虚拟内存,避免OOM
    /etc/security/limits.conf using the as setting to unlimited
    最大map数限制
    sysctl -w vm.max_map_count=262144
    或vm.max_map_count setting in /etc/sysctl.conf
    es使用的线程数量
    ulimit -u 4096 as root before starting Elasticsearch
    或setting nproc to 4096 in /etc/security/limits.conf.
    最大文件大小
    /etc/security/limits.conf using the fsize setting to unlimited
    默认GC CMS collector

    X-pack相关

    调试相关:
    Enable stack traces
    curl -X POST "localhost:9200/twitter/_search?size=surprise_me&error_trace=true"

    读写doc
    路由 routing:
    shard_num = hash(_routing) % num_primary_shards
    写doc
    node接收request,根据id路由确定replication group,转发到当前group的primary shard所在node,由primary shard验证操作并执行,通知其他replica执行。
    错误处理: 
    1. primary shard failed, node暂时保留request,等待master重选primary shard,再执行
    2. replica shard failed, primary shard 通知master移除该replica,primary shard收到移除通知(be acknowledged)后再标记request处理完毕。
    3. primary shard因网络隔离等原因被降级,该过期的primary shard 发出的请求会被其他shard拒绝,该过期primary shard重连master/或其replica后,确认自身被demote。

    读doc
    primary-backup model,基于log的分布式存储,确保所有shard的备份完全一致,从任一(primary/replica)shard读结果一样
    node接收request,根据id路由确定replication group,找到相关shards,从相关shards(primary/replica)查询后组合返回结果

    脏读
    primary shard因网络隔离等原因,导致脏读
    通过定时ping master server(default 1min),没有master拒绝索引操作来减缓。

    Document API

    Index API
    乐观锁,通过_version控制
    verison type:
    internal: given version必须和doc version 一致才能更新
    external or external_gt: given version必须比doc version大才能更新;或doc不存在,以given version作为doc version 新建doc

    Get API:
    realtime, get请求会refresh data确保获取最新数据

    Update API:
    default(detect_noop =true) 默认情况下只有原来的source和新的source存在不同的字段情况下才会重建索引

    Term vectors:
    获取词向量相关信息
    统计信息如df等并不准确,是该term在其所在shard上的统计信息

    optimistic-concurrency-control:
    index操作会被primary赋予一个seq_no和primary_term,从而保证线性更新

    Search API
    suggester:根据text返回相似的terms

    term suggester:根据向量的编辑距离suggest term
    phrase suggester: 在term suggester基础上预选择正确的suggest phrase (基于ngram-language models)
    completion suggester: 补全的suggest term
    context suggester:在completion suggester基础上,满足context上下文条件的suggest term。
    term/phrase提供spell correction or did-you-mean functionality
    completion suggester提供auto-complete/search-as-you-type 

    Mapping
    数据类型:
    text,keyword,binary,date,boolean等
    text 会被analyzer分析,生成term index等,用于全文搜索
    keyword 用于聚合、排序等,只能根据exact value进行搜索

    token_count 接收一个string型数据,统计字符串的中token的个数,生成一个Integer类型数据用于搜索
    percolator 注册一些条件,然后查询一条文档是否满足其中的某些条件。
    join 记录同一个index中doc的父子关系(一个index中只能有一个join field,父子doc必须位于同一个shard)。 使用global ordinals提高性能。
    global ordinals: shard层面的Global Ordinals,对每个不同的token值赋予一个不同的order序号,即映射表。从而查询各segment时可以通过映射表快速查询,在shard层面再将order序号转化成对应的token字符串。
    https://blog.csdn.net/zwgdft/article/details/83215977
    元属性:
    _source: 存储用于生成doc的原始json格式的数据,可以在get/search的时候快速返回。可能导致index占用过多资源。
    参数:
    doc_values: 是否生成正排索引(doc-> field),用于排序、聚合等,在创建索引时生成,存储于disk。如果确认不需要根据该field排序等,可关闭以减少磁盘用量。
    copy_to: 将不同的field组合后生成一个新的field
    fielddata: 开启对text型数据的排序、聚合,很消耗资源。替代方法:针对该field设置一个unanalyzed keyword field用于排序聚合等操作

    Analysis
    analyzer: 分析器,将字符串转变成token流
    character filter:字符转换
    tokenizer:分词
    token filter:token转换

    Module

    HTTP&Network Setting
    es集群配置
    zen discovery:
    配置Node list: discovery.zen.ping.unicast.hosts
    最小可用master候选节点,用以保证选举过程完成:discovery.zen.minimum_master_nodes = (master_eligible_nodes / 2) + 1
    本节点hostname/ip:network.host
    声明节点host,用于其他节点发现本节点,可用于docker(NAT)环境等node自身发现的IP和对外声明IP不同的情况:network.publish_host

    es选举master策略

    当加入一个节点, 如果之前的Elasticsearch集群已经正常的在运行, 那么此时这个节点的加入会选择接受之前的master, 然后自己连接master并加入这个master构成的集群。如果是整个master集群刚开始初始启动的时候,这时候情况就会不同,就会出现选举master的过程。 这时候的选举可能选到了自己作为master, 也有可能是接受其他节点的master。

    选举算法

    对所有可以成为master的节点进行排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个节点,暂且认为它是master节点。
    排序的方式:先根据节点的clusterStateVersion比较,clusterStateVersion越大,优先级越高。clusterStateVersion相同时,进入compareNodes,其内部按照节点的Id比较(Id为节点第一次启动时随机生成),每个节点一个ID,选择ID最小的节点。
    如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举。
    对于brain split问题,需要把候选master节点最小值设置为可以成为master节点数n/2+1(quorum )


    Node
    Master-eligible/data/Ingest/tribe node

    Script

    Snapshot and restore
    增量备份indices,用于恢复es
    register repository,push snapshot to repository, restore from snapshot

    Remote cluster
    通过配置elasticsearch.yml实现Cross-cluster search

    Index Module
    merge过程
    es中的shard都是lucene中的一个index,而lucene index被分成segment存储。segments存储lucene index的数据并且是不可变的。小的segment周期性的merge成大的segment来控制index size和删除操作。
    因为segment是不可变的,es中的delete op是标记删除操作,在进行merge 生成新的segment时删除数据。
    merge过程消耗很多资源,可以自定义schedule

    similarity (scoring / ranking model):定义如何计算matching doc的score

    translog 记录对index的操作,防止已提交未执行的操作丢失

    Ingest Node
    插入index前,在ingest node(接待节点)通过pipeline预处理doc

    Test

    How to

    使用scroll API 来获取all doc
    默认doc size 100mb

    index调优
    使用bulk requests
    用多线程发送数据到es以充分利用集群
    延长index.refresh_interval,允许大segments的写入,减少merge压力
    在大数据量初始导入数据时,暂时关闭refresh和replicas(index.refresh_interval to -1 和index.number_of_replicas to 0)加速写入过程,写入完成后再恢复相关配置
    关闭系统的swapping,避免es数据被从内存中移出
    加大filesystem cache
    加大heap size(512 mb per shard)
    使用auto-generated ids,避免查询前检查doc是否存在

    search speed调优
    search尽量少的field
    pre-index 数据
    尽量避免使用scripts,使用scripts时尽量使用painless和expressions,动态scripts每次重新生成,消耗更多资源,使用script模板
    强制merged read-only indices
    预加载global ordinals (global ordinals 默认懒加载,eager_global_ordinals=true更改)
    预加载index到内存
    设置合适数量的replica提高throughtput
    right number of replicas = max(max_failures, ceil(num_nodes / num_primaries) - 1)
    打开adaptive replica selection,预选取合适的node相应request

    disk usage调优
    Disable不必要的features
    修改shard size (大shard有助于更高效存储)
    disable _source field
    force merge
    shrink index
    使用best_compression压缩
    使用最小数据类型
    Use index sorting to colocate similar documents
    Put fields in the same order in documents


    Refs:
    https://zhuanlan.zhihu.com/p/34830403
    https://www.easyice.cn/archives/164
     

  • 相关阅读:
    SkinSharp用法
    nosql和关系型数据库比较?
    Java实现 蓝桥杯VIP 算法提高 进制转换
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
    Java实现 蓝桥杯VIP 算法提高 去注释
    Java实现 蓝桥杯VIP 算法提高 去注释
  • 原文地址:https://www.cnblogs.com/cnsec/p/13547555.html
Copyright © 2020-2023  润新知