Elasticsearch系统常见问题

Elasticsearch BES

  • 邀测版存储计算分离套餐介绍
  • 功能发布记录
  • 产品描述
    • 基本概念
    • 关键特性
    • 产品介绍
    • 产品性能
      • 4核16GB512GB通用型的3个数据节点实例基准性能指标
      • 8核16GB512GB计算型的3个数据节点实例基准性能测试
      • 16核32GB512GB计算型的3个数据节点实例基准性能指标
      • 4核8GB512GB计算型的3个数据节点实例基准性能测试
      • 8核32GB512GB通用型的3个数据节点实例基准性能指标
      • 16核64GB512GB通用型的3个数据节点实例基准性能指标
      • 概述
  • Python-SDK
    • 实例
    • 异常
    • 日志
    • 节点配置类型
    • 版本更新记录
    • 快速入门
    • 集群
    • BesClient
    • 安装SDK工具包
    • 概述
  • Kibana
    • Kibana使用指南
  • Logstash
    • Logstash使用指南
    • 实例管理
      • 实例详情信息
      • 实例扩缩容
      • 管道管理
      • 创建实例
      • 实例列表
      • 删除实例
  • 开发指南
    • Elasticsearch Restful API
    • 通过其他客户端访问Elasticsearch
    • Elasticsearch Java客户端
      • Low Level REST Client
      • Rest Client操作向量索引示例
      • Java REST Client
      • High Level REST Client
  • Java-SDK
    • 实例
    • 异常
    • 日志
    • 节点配置类型
    • 版本更新记录
    • 快速入门
    • 集群
    • BesClient
    • 安装SDK工具包
    • 概述
  • 向量检索特性
    • 资源规划
    • 关键概念
    • 应用场景
    • 快速入门
    • 算法介绍
    • 能力简介
    • 向量数据库
    • 操作指南
      • 写入和查询数据
      • 训练模型
      • 向量索引缓存管理
      • 创建索引
      • 基于Reciprocal Rank Fusion的融合查询
      • 参数优化
      • 7.4版本兼容说明
    • 最佳实践
      • 调优建议
      • BES RAG 最佳实践:基于LangChain+BES的私域知识的QA问答系统
    • 迁移方案
      • ES dense vector 切换为BES方案
  • ELK
    • 基于ELK构建日志分析系统
  • 增强特性
    • 慢查询隔离
    • 百度NLP中文分词词典动态更新
    • 百度NLP中文分词插件
    • 基于段文件的主从复制
    • 基于BOS的冷热数据分离
  • 快速入门
    • 访问Elasticsearch服务
    • 导入数据并搜索
    • 创建集群
    • 集群资源评估
  • 典型实践
    • 使用BSC将BOS中的数据导入Es
    • 使用BSC将Kafka中的数据导入Es
    • 基于CCR实现多集群跨地域高可用
    • 基于节点磁盘介质的冷热数据分离
  • 服务等级协议SLA
    • 数据迁移服务协议
    • BES服务等级协议SLA(V1.0)
  • 常见问题
    • Spark访问Es常见问题
    • Elasticsearch系统常见问题
    • 常见问题总览
  • 产品定价
    • 预付费
    • 计费说明
    • 配置变更费用说明
    • 后付费
  • API文档
    • 概述
    • 自动续费相关接口
      • 续费列表
      • 查看自动续费
      • 查看自动续费规则列表
      • 续费操作
      • 更新自动续费规则
      • 删除自动续费规则
      • 创建自动续费规则
    • 插件配置接口
      • 上传自定义插件
      • 卸载系统默认插件
      • 上传nlp词典
      • 安装系统默认插件
      • 获取默认和自定义插件列表
      • 卸载自定义插件
      • 安装自定义插件
      • 删除自定义插件
      • 查看nlp词典
    • 日志管理相关接口
      • 查看日志导出任务记录
      • 创建日志导出任务
      • 日志设置
      • 日志查询
    • 标签接口
      • 查询标签列表
      • 批量新增标签
      • 单个集群更新标签
    • 智能巡检接口
      • 查看近7天已完成的巡检任务列表
      • 近七天巡检概况
      • 查看手动巡检任务的配置
      • 集群巡检授权
      • 列举所有可选巡检项
      • 查询是否可以提交巡检任务
      • 最新一次巡检概况
      • 查看集群是否开启自动巡检
      • 修改手动巡检任务的配置
      • 开启或关闭自动巡检
      • 提交手动巡检任务
      • 查询今日已执行完成的手动巡检次数
      • 查看某巡检任务的执行状态和结果
    • 集群相关接口
      • 获取操作历史信息
      • 删除集群
      • 新增节点类型
      • 开启和关闭https
      • 查看集群详情信息
      • 重置密码
      • EIP绑定
      • EIP解绑
      • 是否开启Grafana监控
      • 获取数据量观测数据
      • 查看集群列表
      • 上传NLP分词词典
      • 创建集群
      • 智能评估
      • 集群blb信息
      • 用户可用代金券列表
      • 停止集群
      • 扩容集群
      • 启动集群
      • 重启集群
    • 实例相关接口
      • 批量停止实例
      • 启动实例
      • 查看缩容节点列表
      • 数据迁移
      • 数据迁移系统建议
      • 批量启动实例
      • 数据迁移回滚
      • 停止实例
      • 数据迁移节点列表
      • 删除实例
    • 配置修改相关接口
      • 获取同义词文件列表
      • 查看集群配置
      • 删除同义词配置文件
      • 上传同义词配置文件
      • 配置修改
    • 定时调度
      • 更新定时调度任务
      • 删除定时调度任务
      • 创建和更新定时调度任务
      • 查看定时调度任务
  • API3.0
    • 集群相关接口
      • 删除集群
  • Elasticsearch
    • 用户手册
      • YML参数配置
      • 权限管理
      • 智能巡检
      • 数据迁移
      • 基于BOS的快照与恢复
      • 集群列表
      • 账号使用说明
      • 多可用区部署
      • 定时调度
      • 数据量观测
      • 日志查询
        • 日志查询(旧)
        • 日志查询(新)
        • 日志导出
        • 查询语法
      • 集群配置
        • 配置同义词
      • 插件管理
        • 上传与安装自定义插件
        • Elasticsearch插件列表
        • 系统默认插件
          • analysis-pinyin拼音分词插件
          • IK中文分词插件与动态更新词典
          • compression-zstd插件
          • CCR插件
          • 限流插件
          • 动态同义词插件
          • 简繁体转换插件
          • ingest attachment插件
          • SQL插件
      • 配置变更
        • 节点数据迁移
        • 集群变配说明与建议
        • 集群扩缩容
      • 版本升级
        • 升级版本
        • 内核版本说明
        • 升级检查
      • 集群监控报警
        • 监控查看及指标说明
        • 配置报警
      • 集群管理
        • 集群重启
        • 变更HTTPS协议用户指南
        • 节点启停
        • 查看集群信息
        • 集群创建
        • 公网绑定
        • 修改集群名称
        • 跨可用区迁移集群
        • 集群删除
        • 集群列表
        • 自动续费
        • 密码重置
        • ES服务区域代码
      • 账户管理
        • 多用户访问控制
所有文档
menu
没有找到结果,请重新输入

Elasticsearch BES

  • 邀测版存储计算分离套餐介绍
  • 功能发布记录
  • 产品描述
    • 基本概念
    • 关键特性
    • 产品介绍
    • 产品性能
      • 4核16GB512GB通用型的3个数据节点实例基准性能指标
      • 8核16GB512GB计算型的3个数据节点实例基准性能测试
      • 16核32GB512GB计算型的3个数据节点实例基准性能指标
      • 4核8GB512GB计算型的3个数据节点实例基准性能测试
      • 8核32GB512GB通用型的3个数据节点实例基准性能指标
      • 16核64GB512GB通用型的3个数据节点实例基准性能指标
      • 概述
  • Python-SDK
    • 实例
    • 异常
    • 日志
    • 节点配置类型
    • 版本更新记录
    • 快速入门
    • 集群
    • BesClient
    • 安装SDK工具包
    • 概述
  • Kibana
    • Kibana使用指南
  • Logstash
    • Logstash使用指南
    • 实例管理
      • 实例详情信息
      • 实例扩缩容
      • 管道管理
      • 创建实例
      • 实例列表
      • 删除实例
  • 开发指南
    • Elasticsearch Restful API
    • 通过其他客户端访问Elasticsearch
    • Elasticsearch Java客户端
      • Low Level REST Client
      • Rest Client操作向量索引示例
      • Java REST Client
      • High Level REST Client
  • Java-SDK
    • 实例
    • 异常
    • 日志
    • 节点配置类型
    • 版本更新记录
    • 快速入门
    • 集群
    • BesClient
    • 安装SDK工具包
    • 概述
  • 向量检索特性
    • 资源规划
    • 关键概念
    • 应用场景
    • 快速入门
    • 算法介绍
    • 能力简介
    • 向量数据库
    • 操作指南
      • 写入和查询数据
      • 训练模型
      • 向量索引缓存管理
      • 创建索引
      • 基于Reciprocal Rank Fusion的融合查询
      • 参数优化
      • 7.4版本兼容说明
    • 最佳实践
      • 调优建议
      • BES RAG 最佳实践:基于LangChain+BES的私域知识的QA问答系统
    • 迁移方案
      • ES dense vector 切换为BES方案
  • ELK
    • 基于ELK构建日志分析系统
  • 增强特性
    • 慢查询隔离
    • 百度NLP中文分词词典动态更新
    • 百度NLP中文分词插件
    • 基于段文件的主从复制
    • 基于BOS的冷热数据分离
  • 快速入门
    • 访问Elasticsearch服务
    • 导入数据并搜索
    • 创建集群
    • 集群资源评估
  • 典型实践
    • 使用BSC将BOS中的数据导入Es
    • 使用BSC将Kafka中的数据导入Es
    • 基于CCR实现多集群跨地域高可用
    • 基于节点磁盘介质的冷热数据分离
  • 服务等级协议SLA
    • 数据迁移服务协议
    • BES服务等级协议SLA(V1.0)
  • 常见问题
    • Spark访问Es常见问题
    • Elasticsearch系统常见问题
    • 常见问题总览
  • 产品定价
    • 预付费
    • 计费说明
    • 配置变更费用说明
    • 后付费
  • API文档
    • 概述
    • 自动续费相关接口
      • 续费列表
      • 查看自动续费
      • 查看自动续费规则列表
      • 续费操作
      • 更新自动续费规则
      • 删除自动续费规则
      • 创建自动续费规则
    • 插件配置接口
      • 上传自定义插件
      • 卸载系统默认插件
      • 上传nlp词典
      • 安装系统默认插件
      • 获取默认和自定义插件列表
      • 卸载自定义插件
      • 安装自定义插件
      • 删除自定义插件
      • 查看nlp词典
    • 日志管理相关接口
      • 查看日志导出任务记录
      • 创建日志导出任务
      • 日志设置
      • 日志查询
    • 标签接口
      • 查询标签列表
      • 批量新增标签
      • 单个集群更新标签
    • 智能巡检接口
      • 查看近7天已完成的巡检任务列表
      • 近七天巡检概况
      • 查看手动巡检任务的配置
      • 集群巡检授权
      • 列举所有可选巡检项
      • 查询是否可以提交巡检任务
      • 最新一次巡检概况
      • 查看集群是否开启自动巡检
      • 修改手动巡检任务的配置
      • 开启或关闭自动巡检
      • 提交手动巡检任务
      • 查询今日已执行完成的手动巡检次数
      • 查看某巡检任务的执行状态和结果
    • 集群相关接口
      • 获取操作历史信息
      • 删除集群
      • 新增节点类型
      • 开启和关闭https
      • 查看集群详情信息
      • 重置密码
      • EIP绑定
      • EIP解绑
      • 是否开启Grafana监控
      • 获取数据量观测数据
      • 查看集群列表
      • 上传NLP分词词典
      • 创建集群
      • 智能评估
      • 集群blb信息
      • 用户可用代金券列表
      • 停止集群
      • 扩容集群
      • 启动集群
      • 重启集群
    • 实例相关接口
      • 批量停止实例
      • 启动实例
      • 查看缩容节点列表
      • 数据迁移
      • 数据迁移系统建议
      • 批量启动实例
      • 数据迁移回滚
      • 停止实例
      • 数据迁移节点列表
      • 删除实例
    • 配置修改相关接口
      • 获取同义词文件列表
      • 查看集群配置
      • 删除同义词配置文件
      • 上传同义词配置文件
      • 配置修改
    • 定时调度
      • 更新定时调度任务
      • 删除定时调度任务
      • 创建和更新定时调度任务
      • 查看定时调度任务
  • API3.0
    • 集群相关接口
      • 删除集群
  • Elasticsearch
    • 用户手册
      • YML参数配置
      • 权限管理
      • 智能巡检
      • 数据迁移
      • 基于BOS的快照与恢复
      • 集群列表
      • 账号使用说明
      • 多可用区部署
      • 定时调度
      • 数据量观测
      • 日志查询
        • 日志查询(旧)
        • 日志查询(新)
        • 日志导出
        • 查询语法
      • 集群配置
        • 配置同义词
      • 插件管理
        • 上传与安装自定义插件
        • Elasticsearch插件列表
        • 系统默认插件
          • analysis-pinyin拼音分词插件
          • IK中文分词插件与动态更新词典
          • compression-zstd插件
          • CCR插件
          • 限流插件
          • 动态同义词插件
          • 简繁体转换插件
          • ingest attachment插件
          • SQL插件
      • 配置变更
        • 节点数据迁移
        • 集群变配说明与建议
        • 集群扩缩容
      • 版本升级
        • 升级版本
        • 内核版本说明
        • 升级检查
      • 集群监控报警
        • 监控查看及指标说明
        • 配置报警
      • 集群管理
        • 集群重启
        • 变更HTTPS协议用户指南
        • 节点启停
        • 查看集群信息
        • 集群创建
        • 公网绑定
        • 修改集群名称
        • 跨可用区迁移集群
        • 集群删除
        • 集群列表
        • 自动续费
        • 密码重置
        • ES服务区域代码
      • 账户管理
        • 多用户访问控制
  • 文档中心
  • arrow
  • ElasticsearchBES
  • arrow
  • 常见问题
  • arrow
  • Elasticsearch系统常见问题
本页目录
  • 如何查看Es安装了哪些插件
  • 线程池队列满导致错误
  • Too Many Open Files的错误
  • Es 中一个分片一般设置多大
  • 当集群为red或者yellow的时候怎么办
  • 如何cancel掉慢查询
  • PageCache 在查询中的作用很大
  • 禁用权限验证
  • 支持的Client的类型
  • Es是否支持Spark和Hadoop来写入或者读取数据
  • JVM FULL GC 的几种情形
  • 如何提升导入性能
  • 集群配置问题
  • 集群重启问题
  • 禁用_field_names
  • 导入数据发现越来越慢的几种情形
  • 控制index在节点上的数量
  • 控制索引的分片数量和副本数量
  • 当集群处于恢复状态的时候,恢复速度可能会比较慢
  • 磁盘满了之后如何恢复

Elasticsearch系统常见问题

更新时间:2025-08-20

本文档主要目的:

  1. 用来积累用户常见的问题。
  2. 文档中的操作可通过 Kibana 或在chrome浏览器中安装sense插件完成。用户也可以通过curl的方式自行实现。

如何查看Es安装了哪些插件

可以使用下面这个API,会列出每个节点安装的插件列表。

Plain Text
1GET /_cat/plugins

线程池队列满导致错误

在这种场景下ES抛出的异常是

Plain Text
1rejected execution of org.elasticsearch.transport.TransportService$4@c8998f4 
2on EsThreadPoolExecutor[bulk, queue capacity = 50, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@553aee29
3[Running, pool size = 4, active threads = 4, queued tasks = 50, completed tasks = 0]]

ES内部有很多线程池,比如index,search,bulk是我们能够看到的3个典型的线程池,如果系统的压力特别大,后台线程处理不过来的时候,用户发起的任务会在线程池的队列里堆积,如果达到队列的上限就会抛出对应的异常,遇到这种错误需要做以下两步:

  • 检查系统的CPU和IO的利用情况,如果系统的IO和CPU的利用率比较高,这说明系统遇到资源瓶颈了,已经不能通过优化系统的参数来避免这种错误发生了,云上的用户可以在ES的控制台查看ES的CPU利用率,也可以通过ES自带的命令来查看,通过下面这个命令可以看到ES各个节点的CPU利用率以及负载: GET /_cat/nodes?v
  • 如果资源没有问题,那么检查当先线程池的配置,比如上面这个错误就需要检查bulk的线程池的配置,在sense里执行以下命令: GET /_cluster/settings

    结果如下

    Plain Text
    1		"thread_pool": {
    2       "bulk": {
    3          "type": "fixed",
    4          "size": "4",
    5          "queue_size": "50"
    6       }
    7    }

    这个结果表示处理bulk任务的线程池有4个执行线程,队列数为50. 根据我们的经验看,这个值还是比较小的,所以可以直接用以下操作处理:

ES 5.5.0 版本:

Plain Text
1PUT /_cluster/settings
2{
3	"persistent": {
4		"thread_pool.bulk.size": 32,
5		"thread_pool.bulk.queue_size": 300
6	}
7}

ES 6.5.3+ 集群:

Plain Text
1PUT /_cluster/settings
2{
3	"persistent": {
4		"thread_pool.write.size": 32,
5		"thread_pool.write.queue_size": 300
6	}
7}

Too Many Open Files的错误

在es的日志中如果出现这个错误,一般都是打开的文件太多了,ES 建议文件句柄的限制至少为65536个,用户可以通过修改 /etc/security/limits.conf来修改,或者用ulimit这个命令来修改。 es里每个shard都是一个单独的lucene index writer,每个shard由多个segment组成,每个segment有多个文件,所以打开的文件的数目= shard数目 segment数目 每个segment包含的文件数量,所以我们建议一个物理机节点上shard的数目在1000个左右,不建议有太多的shard。另外lucene使用compound file格式也能有效的减少每个segment里的文件的数量。

Es 中一个分片一般设置多大

ES 的每个分片(shard)都是lucene的一个index,而lucene的一个index只能存储20亿个文档,所以一个分片也只能最多存储20亿个文档。 另外,我们也建议一个分片的大小在10G-50G之间,太大的话查询时会比较慢,另外在做副本修复的时,耗时比较多;分片太小的话,会导致一个索引的分片数目很多,查询时带来的 fanout 太大。

当集群为red或者yellow的时候怎么办

集群为RED表示集群中有primary shard没有分配,yellow表示有replica没有分配,我们建议你用下面这个API来看shard为什么没有被分配到某个节点上。 GET _cluster/allocation/explain

根据我们的使用经验,有以下几种情况导致shard没有被分配:

  • 没有节点上有存储空间能够放下这个shard。
  • 如果shard是replica,那么可能是primary shard未分配或者处于initializing状态。

分片长时间处于未分配状态 ES内部会对一个unassigned 分片尝试5次进行分配,失败后不再尝试进行分配,这时候需要调用进行手动控制集群处理 unassigned 分片:

Plain Text
1POST /_cluster/reroute?retry_failed=true

如何cancel掉慢查询

用户发送一个查询可能导致一个集群非常慢,CPU利用率非常高,所以用户有的时候想把占用资源非常多的查询cancel 掉。在ES 5.0之后es提供了cancel查询的命令。 es内部把所有的执行任务都封装成了task,可以通过task api来查看一个节点在执行的task任务列表,也可以使用task api来取消task。比如我们要查询所有在执行search类型的task,可以使用如下API: GET /_tasks?actions=*search

取消所有在执行的search任务:

Plain Text
1POST _tasks/_cancel?actions=*search

更多的使用方式可以参考官方网站的介绍。

PageCache 在查询中的作用很大

我们建议如果条件可以的话应该给ES留尽量多的pagecache,这能极大的优化我们的查询速度,如果pagecache不足够多,那么ES每次查询【fetch 文档,拿posting list】都会读取磁盘,此时系统就会变慢。 用户可以使用iostat 来查看一下系统的IO 信息,也可在 GET _nodes/state 返回的信息里搜索 "io_stats"查看。如果iops比较高的话,说明系统的io比较高了,可能就是pagecache小的原因。

禁用权限验证

有的时候业务系统原有的ES服务没有权限验证,但是云上的ES服务是有权限验证的,当业务系统迁移的时候不希望改代码,那么可以先把权限验证关掉,这样就能平滑迁移了。操作的方式是:

Plain Text
1PUT /_cluster/settings
2{
3    "persistent": {
4        "simpleauth.enable":false
5    }
6}

支持的Client的类型

目前我们云上的产品只支持基于http 的restful api,不支持基于tcp的transport client这种api。 这个设置主要原因是transport client跟集群运行的版本深度绑定,当集群升级的时候需要前端业务也跟着升级才可以。

Es是否支持Spark和Hadoop来写入或者读取数据

支持,需要到es官方网站下载es-hadoop包放到spark或者hadoop中就可以用spark或者hadoop读写es了。

JVM FULL GC 的几种情形

Scroll 导致FullGC

一些用户使用scroll做分页查询或者用scroll导出数据的时候,经常把scroll的超时时间设置的比较长,比如设置为1天,在这种情况下es后端会为这个scroll一直保存对应的search context,每个search context都对应了lucene的searcher,此时searcher一直不释放导致lucene merge完的文件也不删除,一些leafreader, fst等都长期在JVM 里导致最终随着search context越来越多导致了FullGC。用户可以使用以下2个API 来查看和清除这些Context。

Plain Text
1GET /_nodes/stats/indices/search
2DELETE /_search/scroll/_all

查询导致FullGC

用户在查询时将结果集的from+size设置的太大,比如size=Integer.MAX_VALUE导致的,目前ES会根据设置的这个from+size开辟一个priority queue,当并发量大时,内存会分配不过来这么多非常大的queue,导致FULL GC,甚至OOM。

aggregation导致FullGC

用户在执行类似terms agg时,如果不同的值非常多,最终会导致产生很多bucket,比如几千万个bucket,这些bucket也会在内存里,最终导致fullgc。

如何提升导入性能

减少副本数,增加refresh间隔

Plain Text
1PUT /index_name/_settings
2{
3  	"index.number_of_replicas": 0,
4 		"index.refresh_interval": "10s"
5}
6	

ES 的多副本机制在写入时会向多个副本都发送原始的json文档,然后在多个副本上分别进行分词,建立索引等操作。由于导入是CPU密集型操作,所以把replica数目改成0,可以减少CPU使用率,当导入完毕后,把replica数目改回,这样就是直接拷贝物理文件了,速度会比较快。

refresh interal是用来控制多久把内存里的数据刷出segment的,es会对刷出的segment进行merge,如果merge不过来es会阻止写入。所以把refresh interval调大,也可以把刷出的segment变大,降低merge的频率,提升导入性能。 增大index的导入速度限制

Plain Text
1PUT /_cluster/settings
2{
3      "persistent" : {
4             "indices.store.throttle.max_bytes_per_sec" : "200mb"
5      }
6}

ES 在写入数据的时候会有速度的限制,防止占用过多的磁盘IO,如果集群的导入比较大而查询比较少,那么可以把这个速度限制调大。

集群配置问题

  • 需要使用 oracle JDK 1.8 以上版本。
  • 设置最大文件数:

    Plain Text
    1  修改 /etc/security/limits.conf : 
    2
    3  *  soft  nofile  65536
    4
    5  *  hard  nofile  65536
  • 增加 mmap counts : 修改 /etc/sysctl.conf :

    Plain Text
    1		vm.max_map_count=262144
    2	
    3		然后执行: sysctl -p

集群重启问题

在一些情况下(比如修改配置文件),我们希望重启集群,重启集群可以是一台台的重启,也可以是整个集群重启,重启Es的时候,可能会引起数据的重分布,下面就这两种情况分别介绍如何重启服务。

整个集群重启

  • 把整个集群设置为只读状态

    Plain Text
    1		PUT /_cluster/settings
    2		{
    3		    "persistent": {
    4		        "cluster.blocks.read_only":true
    5		    }
    6		}
    7		```	
  • 把节点内存的数据全部flush到硬盘上

    Plain Text
    1		POST /_flush/synced
  • 把所有的es节点重启
  • 当集群green之后,把集群修改为可写入状态

    Plain Text
    1	PUT /_cluster/settings
    2	{
    3	    "persistent": {
    4	        "cluster.blocks.read_only":false
    5	    }
    6	}

    一台台重启

这种方式重启服务不会中断,适用于线上服务。

  • 禁止分片分配,这样我们关闭一台Es服务的时候,分片不会重分布。 PUT /_cluster/settings { "transient" : { "cluster.routing.allocation.enable" : "none" } }
  • 关闭单个节点,修改配置或者替换jar包,启动节点
  • 开启分片重分布

    Plain Text
    1	PUT /_cluster/settings
    2	{
    3    	"transient" : {
    4        	"cluster.routing.allocation.enable" : "all"
    5    	}
    6	}
    7		```	
  • 等待集群green后,重复执行1-3 步,直到所有的节点都修改完配置为止。

禁用_field_names

_field_names字段是Elasticsearch的内部的一个元数据字段。该字段会索引文档内的每个字段的名字(除了字段值为null的字段名字);这个字段存在的意义主要是执行Elasticsarech exists query,Elasticsearch对该字段只做了索引处理,没有存储该字段,6.3版本以后该字段只会索引没有禁掉doc_value和norms的字段,建议业务不使用exists 查询的情况下disable该字段,能够少量的减少倒排表的占用的存储空间,可能会适当增强pagecache的利用

Plain Text
1 PUT index
2 {
3   "mappings": {
4     "_doc": {
5       "_field_names": {
6         "enabled": false
7       }
8     }
9   }
10 }

导入数据发现越来越慢的几种情形

导入数据中包含update

Es的update实际上是先读取数据然后更改后,再写入的,当写入的数据越来越多的时候,读取数据就会比较慢,写入也就逐渐变慢了。

控制index在节点上的数量

默认情况下,ES集群会尽可能将所有节点上的index和shard的数量进行balance,但是一些特殊情况下,可能会造成某一个index的shard过多的集中在少量的节点上,这时候可以通过设置集群中每个节点存放index shard的个数:

Plain Text
1PUT {index名字}/_settings
2{
3   "index.routing.allocation.total_shards_per_node": 10
4}

控制索引的分片数量和副本数量

不修改参数的情况下,一个index 一共有5个分片,2个副本(包括主分片),可以通过修改index的参数来控制:

Plain Text
1PUT /{index名字}
2{
3    "settings": {
4        "number_of_shards": 20,
5        "number_of_replicas": 2
6    }
7}
Plain Text
1number_of_shards: 分片个数,创建完index后不可修改,需在创建的时候指定
2number_of_replicas: 副本个数,不包括主分片

当集群处于恢复状态的时候,恢复速度可能会比较慢

当前正在恢复的索引分片可以通过

Plain Text
1GET /_recovery?active_only=true 

查看,默认情况一个节点同时恢复的个数为4,包括2个作为source节点,2个作为target节点,当分片个数非常多的时候可能会恢复的很慢,恢复的时候默认是有限速的最大40mb,这时候可以通过设置集群参数:

Plain Text
1curl -XPUT "host:port/_cluster/settings" -d'
2{
3    "transient": {
4        "cluster.routing.allocation.node_concurrent_recoveries": 8,
5        "indices.recovery.max_bytes_per_sec": "120mb"
6    }
7}'
Plain Text
1indices.recovery.max_bytes_per_sec: 节点恢复的最大带宽,这个设置应该小于当前网络带宽,避免影响其他网络服务
2cluster.routing.allocation.node_concurrent_recoveries: 节点作为source node或target node同时恢复的最大个数

磁盘满了之后如何恢复

当Es的DataNode的磁盘使用率达到一定的阈值(95%)之后,Es会阻止继续写入,Es会在所有的Index上加一个block,当用户继续写入的时候会收到以下错误

Plain Text
1cluster_block_exception [FORBIDDEN/12/index read-only / allow delete (api)];

此时用户必须释放磁盘空间才能解决问题,释放磁盘空间有2种办法:

  • 删除不用的Index
  • 降低Index的副本的数目,比如把replica数目从2降到1.

当释放完毕磁盘空间之后,Es并不会自动把block去掉,此时用户仍然无法写入数据,需要执行以下命令:

Plain Text
1curl -XPUT "host:port/_all/_settings" -d '
2{
3    "index.blocks.read_only_allow_delete": null
4}'

上一篇
Spark访问Es常见问题
下一篇
常见问题总览