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