ES集群调整搜索速度
一、内存文件系统足够的缓存
Elasticsearch严重依赖于文件系统缓存,以加快搜索速度。通常,您应确保至少有一半的可用内存分配给文件系统缓存,以便Elasticsearch可以将索引的热区保留在物理内存中。
二、使用更快的硬件
如果搜索是受CPU限制的,那就加大CPU。ES对CPU的要求,使用多核CPU优于单核CPU。
如果搜索是在I/O上受限制的话,就需要提供更多的内存和更快的硬盘。SSD硬盘性能优于机械硬盘,本地硬盘性能优于远程虚拟硬盘。
三、文档建模设计
文档应该建模设计,是搜索尽可能的快。避免使用 nested(慢几倍)和父子关系(慢百倍),可以通过对文档进行非规范化的建模设计来达到相同的目的,解决问题。
四、搜索尽可能少的字段
query_string或 multi_match查询目标的字段越多,它的速度就越慢。
五、预索引数据
您应该利用查询中的模式来优化数据索引的方式。例如:你有一个类型的文档所有文档都包含一个字段 price,并且你大多数查询的时候都是使用比较固定的大小范围查询或者聚合,此时如果把这个时间分为预索引到文档中,并且使用terms聚合查询会更快。
例如,你有一类型的数据如下
PUT index/_doc/1
{
"designation": "spoon",
"price": 13
}
并且你搜索的时候经常使用以下范围查询
GET index/_search
{
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 10 },
{ "from": 10, "to": 100 },
{ "from": 100 }
]
}
}
}
}
此时你就应该在文档索引时添加一个price_range字段,并且映射成keyword类型的
PUT index
{
"mappings": {
"_doc": {
"properties": {
"price_range": {
"type": "keyword"
}
}
}
}
}
PUT index/_doc/1
{
"designation": "spoon",
"price": 13,
"price_range": "10-100"
}
然后查询、聚合的时候就使用这个新的字段来代替price的range聚合
GET index/_search
{
"aggs": {
"price_ranges": {
"terms": {
"field": "price_range"
}
}
}
}
六、将标识符映射为keyword类型
有些字段虽然是数字类型的,但是实际上并不是都要映射为数字类型。ES能够通过数字类型优化range查询,但是terms查询使用keyword更适合。一般的像ISBN(国际标准书号)这样的标识符(ID)都是适合映射为keyword而不是数字的。
七、避免使用脚本
通常,应避免使用脚本。如果绝对需要它们,则应首选painless和expressions引擎。
八、搜索舍入日期
对日期字段的查询now通常是不可缓存的,因为匹配一直是在变化的。但是,就用户体验而言,切换到舍入日期通常是可以接受的,并且具有更好地利用查询缓存的好处。
例如下面的查询
PUT index/_doc/1
{
"my_date": "2016-05-11T16:30:55.328Z"
}
GET index/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"my_date": {
"gte": "now-1h",
"lte": "now"
}
}
}
}
}
}
可以使用下面的查询代替
GET index/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"my_date": {
"gte": "now-1h/m",
"lte": "now/m"
}
}
}
}
}
}
在这种情况下,我们四舍五入为分钟,因此,如果当前时间为16:31:29,则范围查询将匹配my_date字段值介于15:31:00和16:31:59之间的所有内容。而且,如果多个用户在同一分钟内运行包含此范围的查询,则查询缓存可以帮助加快速度。用于舍入的时间间隔越长,查询缓存可以提供的帮助越多,但是请注意,过于激进的舍入也会损害用户体验。
九、强制合并只读索引
只读的索引将从合并到单个段中受益 。对于基于时间的索引,通常是这种情况:只有当前时间范围的索引才能获取新文档,而较旧的索引则为只读。
提示
不要合并正在写入的索引。
十、预热全局序数词
全局序数词是一种数据结构,用于在keyword字段上运行terms聚合 。它们被延迟加载到内存中,因为Elasticsearch不知道terms聚合中将使用哪些字段,而哪些字段则不会。您可以通过如下所述配置映射,让Elasticsearch在刷新时紧急加载全局序数词:
PUT index
{
"mappings": {
"_doc": {
"properties": {
"foo": {
"type": "keyword",
"eager_global_ordinals": true
}
}
}
}
}
十一、预热文件缓存系统
如果重新启动运行Elasticsearch的计算机,则文件系统缓存将为空,因此,操作系统需要一些时间才能将索引的热区加载到内存中,以便快速进行搜索操作。您可以使用该index.store.preload设置明确告诉操作系统哪些文件应该急切地加载到内存中,具体取决于文件扩展名 。
十二、使用索引排序来加快连接的
索引排序可能有用,以便使连接更快,但以稍微慢一些的索引为代价。在索引排序文档中阅读有关它的更多信息。
十三、使用preference以优化缓存利用率
有多个可以帮助提高搜索性能的缓存,例如 文件系统缓存, 请求缓存或查询缓存。但是所有这些缓存都在节点级别维护,这意味着如果您连续两次运行相同的请求,具有一个或多个副本,并使用默认路由算法round-robin,则这两个请求将转到不同的分片副本,从而阻止了节点级缓存的帮助。
由于搜索应用程序的用户通常会依次运行类似的请求(例如为了分析索引的较窄子集),因此使用标识当前用户或会话的首选项值可以帮助优化缓存的使用。
十四、副本可能有助于提高吞吐量,但并非总是可以
除了提高弹性之外,副本还可以帮助提高吞吐量。例如,如果您有一个单碎片索引和三个节点,则需要将副本数设置为2,以便总共拥有3个碎片副本,以便利用所有节点。
现在,假设您有一个2碎片索引和两个节点。在一种情况下,副本数为0,这意味着每个节点都拥有一个分片。在第二种情况下,副本数为1,这意味着每个节点都有两个分片。哪种设置在搜索效果方面效果最好?通常,每个节点的分片总数较少的设置会更好地执行。这样做的原因是,它为每个分片提供了更多的可用文件系统缓存份额,并且文件系统缓存可能是Elasticsearch的第一性能因素。同时,请注意,在单节点故障的情况下,没有副本的安装会失败,因此在吞吐量和可用性之间要进行权衡。
那么正确的副本数是多少?如果您的集群中有num_nodes节点,则总共有 num_primaries主要分片,并且如果您希望max_failures一次最多能处理节点故障,那么适合您的副本数是 max(max_failures, ceil(num_nodes / num_primaries) - 1)。
十五、打开自适应副本选择
当存在多个数据副本时,elasticsearch可以使用一组称为自适应副本选择的条件来根据响应时间,服务时间和包含每个碎片副本的节点的队列大小来选择最佳数据副本。这可以提高查询吞吐量并减少大量搜索应用程序的延迟。
ES集群调整搜索速度的更多相关文章
- ES 集群调整、升级 最佳实践
日常应用中我们会经常对es 集群做一些参数调整或者升级版本,但是每次关闭节点再打开 其中的数据同步的痛苦估计有很多人领悟过(有可能出现IO或者网络拥堵导致恶性循环)官网有套方案可以尝试一下: 1.关掉 ...
- elasticsearch系列八:ES 集群管理(集群规划、集群搭建、集群管理)
一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...
- ES 集群管理(集群规划、集群搭建、集群管理)
一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...
- ES集群
1. ElasticSerach集群安装 修改配置文件elasticserach.yml [elk@localhost config]$ vi elasticsearch.yml # ------- ...
- 教你在Kubernetes中快速部署ES集群
摘要:ES集群是进行大数据存储和分析,快速检索的利器,本文简述了ES的集群架构,并提供了在Kubernetes中快速部署ES集群的样例:对ES集群的监控运维工具进行了介绍,并提供了部分问题定位经验,最 ...
- ES 集群上,业务单点如何优化升级?
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! ES 基础 ES 集群 ES 集群上业务优化 一.ES 基础 ...
- es集群数据库~运维相关
一 数据同步方案 1 ES-JDBC 不能实现删除同步操作.MYSQL如果删除,ES不会删除 2 logstash-input-jdbc 能实现insert update,但是仍然不能实现删除 ...
- ES集群7.3.0设置快照,存储库进行索引备份和恢复等
说明:三台ES节点组成ES集群,一台kibana主机,版本均是7.3.0,白金试用版 官方地址:https://www.elastic.co/guide/en/elasticsearch/refere ...
- 磁盘空间引起ES集群shard unassigned的处理过程
1.问题描述 早上醒来发现手机有很多ES状态为red的告警,集群就前几天加了几个每天有十多亿记录的业务,当时估算过磁盘容量,应该是没有问题的,但是现在集群状态突然变成red了,这就有点懵逼了. 2.查 ...
随机推荐
- Android教程2020 - RecyclerView实际使用
示例,用RecyclerView的item做出一个列表. Android教程2020 - 系列总览 本文链接 前面我们已经知道如何用RecyclerView显示一列数据.这里我们做出一个具体的例子.尽 ...
- Linux 常用工具openssh之ssh-add
前言 ssh-add命令是把专用密钥添加到ssh-agent的高速缓存中,从而提高ssh的认证速度 语法 ssh-add [-cDdLlXx] [-t life] [file ...] 选项 -D:删 ...
- python基础[1]——python运算符&python数据类型之数值型
python常用运算符&数字&布尔值 上节回顾 一.变量名和标识符 变量名的命名规范 (1)只能包含数字,字母和下划线 (2)只能以字母和下划线开头(不能以数字开头) (3)标识符是区 ...
- 从头学pytorch(二十二):全连接网络dense net
DenseNet 论文传送门,这篇论文是CVPR 2017的最佳论文. resnet一文里说了,resnet是具有里程碑意义的.densenet就是受resnet的启发提出的模型. resnet中是把 ...
- sys model 常见用法
import sys #与python解释器 交互 print(sys.argv) #是一个列表 解释器执行文件名后面可以增加字符串 以列表元素形式添加进去def foo(): print('ok') ...
- Visual Studio Code | 报错 command 'markdown.extension.onBackspaceKey' not found
背景 今天使用Visual Strudio Code想用键盘Back去删除一些字符,发现报如下错误: command 'markdown.extension.onBackspaceKey' not f ...
- 面试总结 | Linux后台开发不得不看的知识点(给进军bat的你!)
目录 一 自我介绍 二 面试情况 三 相关知识点汇总 1 c/c++相关 2 计算机网络 3 数据结构相关 4 数据库相关 5 操作系统 6 Linux基础知识及应用编程(后台必备!) 7 大数问题 ...
- WSGI接口
web server gateway interface:将http请求,响应格式封装起来,让我们可以专心的用python编写web业务. WSGI接口定义的非常简单,它只要求开发者实现一个函数,就可 ...
- One Stage目标检测
在计算机视觉中,目标检测是一个难题.在大型项目中,首先需要先进行目标检测,得到对应类别和坐标后,才进行之后的各种分析.如人脸识别,通常是首先人脸检测,得到人脸的目标框,再对此目标框进行人脸识别.如果该 ...
- php curl 检测网页是否被百度收录
<?php /* * 检测百度是否收录网页 curl模式 * @ param string $url传入的url* return int (1 收录 0 不收录) */ function che ...