热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

笔记六十一:提升集群写性能

提高写入性能的方法写性能优化的目标:增大写吞吐量(EventsPerSecond),越高越好客户端:多线程,批量写可以通过性能测试,确定最佳文档数量多线程:需要观察是否有HTTP4











提高写入性能的方法
  • 写性能优化的目标:增大写吞吐量(Events Per Second),越高越好
  • 客户端:多线程,批量写
    • 可以通过性能测试,确定最佳文档数量
    • 多线程:需要观察是否有 HTTP 429 返回,实现 Retry 以及线程数量的自动调节
  • 服务器端:单个性能问题,往往是多个因素造成的。需要先分解问题,在单个节点上进行调整并 且结合测试,尽可能压榨硬件资源,以达到最高吞吐量
    • 使用更好的硬件。观察 CPU / IO Block
    • 线程切换 / 堆栈状况

服务器端优化写入性能的一些手段
  • 降低 IO 操作
    • 使用 ES 自动生成的文档 Id / 一些相关的 ES 配置,如 Refresh Interval
  • 降低 CPU 和存储开销
    • 减少不必要分词 / 避免不需要的 doc_values /文档的字段尽量保证相同的顺序,可以提高文档的压缩率
  • 尽可能做到写入和分片的均衡负载,实现水平扩展
    • Shard Filtering / Write Load Balancer
  • 调整 Bulk 线程池和队列

优化写入性能
  • ES 的默认设置,已经综合考虑了数据可靠性,搜索的实时性质,写入速度,一般不要盲目修改
  • 一切优化,都要基于高质量的数据建模

关闭无关的功能
  • 只需要聚合不需要搜索, Index 设置成 false
  • 不需要算分, Norms 设置成 false
  • 不要对字符串使用默认的 dynamic mapping。字段 数量过多,会对性能产生比较大的影响
  • Index_options 控制在创建倒排索引时,哪些内容 会被添加到倒排索引中。优化这些设置,一定程度 可以节约 CPU
  • 关闭 _source,减少 IO 操作;(适合指标型数据)

集群写性能优化


针对性能的取舍
  • 如果需要追求极致的写入速度,可以牺牲数据可靠性及搜索实时性以换取性能
    • 牺牲可靠性:将副本分片设置为 0,写入完毕再调整回去
    • 牺牲搜索实时性:增加 Refresh Interval 的时间
    • 牺牲可靠性:修改 Translog 的配置

数据写入的过程
  • Refresh
    • 将文档先保存在 Index buffer 中, 以 refresh_interval 为间隔时间,定期清空 buffer,生成 segment,借助文件系统缓存的特性,先将segment 放在文件系统缓存中,并开放查询,以提升搜索的实时性
  • Translog
    • Segment 没有写入磁盘,即便发生了当机,重启后,数据也能恢复,默认配置是每次请求都会落盘
  • Flush
    • 删除旧的 translog 文件
    • 生成 Segment 并写入磁盘 / 更新 commit point 并写入磁盘。 ES 自动完成,可优化点不多

Refresh Interval
  • 降低 Refresh 的频率
    • 增加 refresh_interval 的数值。默认为 1s ,如果设置成 -1 ,会禁止自动 refresh
      • 避免过于频繁的 refresh,而生成过多的 segment 文件
      • 但是会降低搜索的实时性
    • 增大静态配置参数 indices.memory.index_buffer_size
      • 默认是 10%, 会导致自动触发 refresh

Translog
  • 降低写磁盘的频率,但是会降低容灾能力

    - `Index.translog.durability`:默认是 request,每个请求都落盘。设置成 async,异步写入
    - `Index.translog.sync_interval` 设置为 60s,每分钟执行一次
    - `Index.translog.flush_threshod_size`: 默认 512 mb,可以适当调大。 当 translog 超过该值,会触发 flush


分片设定
  • 副本在写入时设为 0,完成后再增加
  • 合理设置主分片数,确保均匀分配在所有数据节点上
    • Index.routing.allocation.total_share_per_node: 限定每个索引在每个节点上可分配的分片数(replicas and primaries)
    • 5 个节点的集群。 索引有 5 个主分片,1 个副本,应该如何设置?
      • (5+5) / 5 = 2
      • 生产环境中要适当调大这个数字,避免有节点下线时,分片无法正常迁移

Bulk,线程池和队列大小
  • 客户端

    - 单个 bulk 请求体的数据量不要太大,官方建议大约5-15mb
    - 写入端的 bulk 请求超时需要足够长,建议60s 以上
    - 写入端尽量将数据轮询打到不同节点。

  • 服务器端
    • 索引创建属于计算密集型任务,应该使用固定大小的线程池来配置。来不及处理的放入队列,线程数应该 配置成 CPU 核心数 +1 ,避免过多的上下文切换
    • 队列大小可以适当增加,不要过大,否则占用的内存会成为 GC 的负担

一个索引设定的例子

集群写性能优化




推荐阅读
  • 人人租机作为国内领先的信用免押租赁平台,为企业和个人提供全方位的新租赁服务。通过接入支付宝小程序功能,该平台实现了从零到百的迅猛增长,成为全国首家推出“新租赁小程序”开发服务的阿里巴巴小程序服务商(ISV)。这一创新举措不仅提升了用户体验,还显著增强了平台的市场竞争力。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 本文详细记录了 MIT 6.824 课程中 MapReduce 实验的开发过程,包括环境搭建、实验步骤和具体实现方法。 ... [详细]
  • c#  项目文件,C#viual studio使用方法
    一、项目文件1)Properties节点下主要存放的是当前程序集相关的信息,如版本号、标题等。双击”Properties“,打开如下项目属 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 在开发板的启动选项中看到如下两行:7:LoadBootLoadercodethenwritetoFlashviaSerial.9:LoadBootLoadercodethenwri ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • PHP 各版本对比:标准版与最新顶级版的详细分析 ... [详细]
  • 体积小巧的vsftpd与pureftpd Docker镜像在Unraid系统中的详细配置指南:支持TLS加密及IPv6协议
    本文详细介绍了如何在Unraid系统中配置体积小巧的vsftpd和Pure-FTPd Docker镜像,以支持TLS加密和IPv6协议。通过这些配置,用户可以实现安全、高效的文件传输服务,适用于各种网络环境。配置过程包括镜像的选择、环境变量的设置以及必要的安全措施,确保了系统的稳定性和数据的安全性。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 本书《.NET Core 2.* 开发者指南》是面向开发者的全面学习与实践手册,涵盖了从基础到高级的各个层面。书中详细解析了 .NET Core 的核心概念,包括如何创建 .NET Core 网站,并通过视频教程直观展示操作过程。此外,还深入探讨了 Startup 类的作用、项目目录结构的组织方式以及如何在应用中使用静态文件等内容。对于希望深入了解 .NET Core 架构和开发技巧的开发者来说,本书提供了丰富的实践案例和详尽的技术指导。 ... [详细]
author-avatar
苏小明2602896955
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有