aws es方案_AWS Elasticsearch后模式

aws es方案

碰巧我们在SaaS版本的LogSentinel上遇到了生产问题–我们的Elasticsearch停止了对新数据编制索引。 由于Elasticsearch只是辅助存储,因此没有数据丢失,但这给我们的客户带来了一些问题(他们无法在其仪表板上看到实时数据)。 以下是验尸分析–发生了什么,为什么发生,我们如何处理以及如何防止它。

让我从系统如何运行的背景开始–我们通过RESTful API(或syslog)接受审核跟踪条目(日志),并将其推送到Kafka主题。 然后使用Kafka主题将数据存储在主存储(Cassandra)中并对其进行索引,以便在Elasticsearch中更好地进行可视化和分析。 选择托管的AWS Elasticsearch服务是因为它节省了集群管理的所有开销,并且作为一家启动公司,我们希望最大程度地减少基础架构管理工作。 就像下面将要看到的那样,这是一种祝福和诅咒。

我们在许多元素上启用了警报,包括Elasticsearch存储空间和日志文件中的应用程序错误数。 这使我们能够快速响应问题。 因此触发了“大量应用程序错误”警报。 由于FORBIDDEN/8/index write索引被阻止。 我们有一个启用它的系统调用,因此我尝试运行它,但是不到一分钟后,它再次被阻止。 这意味着我们的Kafka使用者无法处理消息,这很好,因为我们在Kafka中有足够的消息保留期,因此不会丢失任何数据。

我调查了这种阻止的可能原因。 根据Amazon的说法, 有两种 -JVM内存压力增加和磁盘空间不足。 我检查了指标,一切看起来都很好– JVM内存压力几乎没有达到70%(阈值是75%),并且有超过200GiB的免费存储。 Elasticsearch应用程序日志中只有一个WARN(这是“节点故障”,但此后未报告任何问题)

这个问题还有另一个奇怪的方面–节点的数量是配置的两倍。 这通常在升级期间发生,因为AWS正在为Elasticsearch使用蓝/绿部署,但是我们最近没有进行任何升级。 这些额外的节点通常会在短时间内消失(在重新部署/升级准备就绪之后),但是在这种情况下它们不会消失。

无法通过SSH连接到实际计算机,无法通过Elasticsearch手段取消索引编制,无法关闭或重新启动节点,我提出了支持请求。 经过我们几次和几次交流后,问题已经明确并得到解决。

此问题的主要原因是2倍。 首先,我们有一个无法反映集群状态的配置–我们假设有更多的节点,而共享和副本配置意味着我们没有分配副本( 此处和此处的 碎片和副本更多 )。 最佳实践是使节点>副本数,以便每个节点获得一个副本(加上主分片)。 拥有未分配的分片副本本身并不坏,并且有合理的理由。 我们可能被认为是配置错误,但不是立即造成负面影响的一种。 我们之所以选择这些设置,部分原因是创建集群后无法在AWS中更改某些设置。 并且不支持打开和关闭索引。

第二个问题是AWS Elasticsearch逻辑,用于计算其断路器中阻止索引编制的空闲存储。 因此,即使每个现有节点上都有200+ GiB可用空间,AWS Elasticsearch仍认为我们空间不足并阻止了索引编制。 我们无法看到这一点,因为我们只能看到可用的存储,而没有看到AWS认为可用的存储。 因此,计算将获得分片+副本的总数,然后将其乘以每个共享存储。 这意味着未分配副本不会占用实际空间,就好像它们已占用空间一样。 这种逻辑是违反直觉的(如果不是完全错误的话),几乎没有办法预测它。

当发生蓝/绿部署时,将触发此逻辑–因此,在正常操作中,将检查实际的剩余存储空间,但是在升级过程中,将触发基于分片的检查。 那阻塞了整个集群。 但是是什么触发了蓝绿色部署过程?

我们有时需要访问Kibana,由于严格的安全规则,默认情况下任何人都无法访问它。 因此,我们暂时更改了访问策略,以允许从我们的办公室IP进行访问。 预计此更改不会触发新的部署,也永远不会导致这种变化。 但是,AWS文档指出:

在大多数情况下,以下操作不会导致蓝绿色部署:更改访问策略,更改自动快照时间,如果您的域具有专用主节点,则更改数据实例计数。
有一些例外。 例如,如果自从三个可用区支持启动以来您尚未重新配置域,则Amazon ES可能会执行一次蓝/绿部署,以在可用区中重新分配专用主节点。

显然还有其他例外,其中之一发生在我们身上。 这就导致了蓝/绿部署,由于我们的配置有缺陷,因此又部署了蓝/绿,这触发了基于奇数逻辑的索引块,以假定未分配的副本占用了存储空间。

我们如何修复它-我们用较少的副本数创建了索引,并开始了重新索引(它从主要来源获取数据并成批索引)。 这减少了占用的空间,AWS手动干预以“取消”蓝色/绿色部署。 一旦知道了问题,修复就很容易了(由于其他索引配置的更改,我们仍然必须重新创建索引)。 (再次)说一下在解决问题和沟通方面,AWS支持有多好是合适的。

正如我在开始时所说,这并不意味着数据丢失,因为我们让Kafka保留了足够长的时间。 但是,一旦索引可写,我们就希望使用者继续使用上一条成功的消息–我们专门编写了交易行为,该行为仅在成功存储到主存储中并成功建立索引之后才提交偏移量。 不幸的是,我们正在使用的kafka客户端打开了我们忽略的自动提交功能。 因此,消费者跳过了失败的消息。 它们仍然在Kafka中,我们正在使用单独的工具对其进行处理,但这向我们表明了我们的假设是错误的,并且代码调用了“ commit”这一事实,但这实际上并不意味着什么。

因此,故事的寓意是:

  • 监视一切。 发生坏事,快速了解它们是一件好事。
  • 检查您的生产配置,并确保它足以满足当前需求。 它是副本,JVM大小,磁盘空间,重试次数,自动缩放规则等。
  • 请注意托管云服务。 他们节省了很多精力,但也使您失去了控制权。 而且,他们可能遇到的问题是您唯一的选择就是联系支持部门。
  • 如果提供托管服务,请确保显示有关潜在边缘情况的足够信息。 错误控制台,活动控制台或诸如此类,使客户可以了解发生了什么。
  • 验证关于库默认设置的假设。 (理想情况下,如果您在当前的配置状态下执行了某些意外操作,则库应该警告您)
  • 确保您的应用程序是容错的,即,一个组件中的故障不会停止整个世界,也不会导致数据丢失。

因此,总的来说,一个罕见的事件意外触发了蓝绿色部署,其中有缺陷的配置和有缺陷的可用空间计算的结合导致了不可写的集群。 幸运的是,没有数据丢失,至少我学到了一些东西。

翻译自: https://www.javacodegeeks.com/2020/03/an-aws-elasticsearch-post-mortem.html

aws es方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java注解总结

【0】README 0.1)本文主要对 java 注解做总结; 【1】处理注解的级别 level1) 在运行期级别处理注解: http://blog.csdn.net/pacosonswjtu/article/details/50719361level2)在源码级别处理注解: http://b…

Java 类加载总结

一、类加载过程 装载链接验证准备解析初始化二、类初始化情况 1)创建类的实例,也就是new一个对象 2)访问某个类或接口的静态变量,或者对该静态变量赋值 3)调用类的静态方法 4)反射(Class.…

maven依赖管理_依赖管理和Maven

maven依赖管理Maven伟大而成熟。 几乎所有事物都总有解决方案。 您可能在组织项目上遇到的主要情况是依赖管理。 而不是每个项目都具有自己的依赖关系,您需要一种集中的方式来继承那些依赖关系。 在这种情况下,您可以在父舞会上声明托管依赖项。 在我的…

JavaBean 持久化

【0】README 0.1)本文文字描述转自 core java volume 2,旨在学习 JavaBean 持久化 的基础知识; 0.2)本文所有源代码荔枝均为原创; 0.3) for complete souce code, please visit https://github.com/pa…

apache kafka_Apache Kafka消费者再平衡

apache kafka消费者重新平衡决定哪个消费者负责某个主题的所有可用分区的哪个子集。 例如,您可能有一个包含20个分区和10个使用者的主题。 在重新平衡结束时,您可能希望每个使用者都从2个分区中读取数据。 如果关闭了这些使用者中的10个,则可…

Java 注解总结

一、注解定义 注解早在J2SE1.5就被引入到Java中,主要提供一种机制,这种机制允许程序员在编写代码的同时可以直接编写元数据。 二、元注解 Target 说明了被修饰的注解的应用范围,也就是被修饰的注解可以用来注解哪些程序元…

编译原理三大经典书籍(龙书 虎书 鲸书)

以下内容转自: http://blog.csdn.net/skymingst/article/details/7436892 1、龙书(Dragon book) 英文名:Compilers: Principles,Techniques,and Tools 作者:Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman 中文名&…

两个时间之间是多少小时_那是两个小时我不会回来

两个时间之间是多少小时正如我之前关于linting主题所说的 ,花时间修改代码的好处很有限,因为自动工具告诉您这样做。 更糟糕的是,这些工具并非万无一失。 例如,我们一直在针对完美无害的try-with-resources构造周围的SpotBugs警告…

java的类载入器

【0】README 0.1)本文文字转自: 深入剖析tomcat, 旨在 理解 jvm 的类载入器; 【1】 jvm的类载入器相关 1)jvm 使用了3种类载入器来载入所需要的类:分别是引导类载入器(bootstrap class load…

Java 代理总结

一、代理 为其他对象提供一种代理以便控制对这个对象的访问。 (1)静态代理 (2)动态代理 1)JDK自带的动态代理 2)javaassist字节码操作库实现 3)CGLIB 4) ASM(底层…

分解因数 递归_递归分解WAR文件

分解因数 递归抽象 是否曾经需要分解WAR文件以及分解WAR文件中的所有JAR文件? 是的,我也是! 我写了ferris-war-exploder来爆炸: 一个JAR文件 一个WAR文件,它找到的每个JAR文件也会爆炸。 包含每个JAR文件&#xff…

jvm(2)-java内存区域

【0】README 0.1)本文转自 深入理解jvm, 旨在学习 java内存区域 的基础知识; 【1】运行时数据区域 1)jvm 所管理的内存将会包括以下几个运行时数据区域 1.1)方法区;(线程共享) 1.2&…

Java Socket编程总结

一、网络API InetAddress     用于标识网络上的硬件资源,主要是IP地址 URL         统一资源定位符,通过URL可以直接读取或写入网络上的数据Sockets      使用TCP协议实现的网络通信Socket相关的类Datagram     使用UDP协议&am…

java插入排序_Java程序要插入排序

java插入排序Java程序插入示例的排序。 显示了示例仿真以及时间复杂度。 插入排序是一种简单的排序算法,可以一次构建一个最终的排序数组(或列表)。 它比冒泡排序有效得多,并且在大型列表上的效率比快速排序 ,堆排序或…

jvm(2)-JVM内存的设置(解决eclipse下out of memory问题)

【0】README 0.1)本文转自: http://blog.csdn.net/sjf0115/article/details/8889201 一、JVM内存的设置的原理 默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。 设置jvm内存的方…

Java Servlet总结

一、Servlet简介 Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实…

java oca_OCA第1部分中的Java难题

java oca我在业余时间正在阅读Mala Gupta的Oracle认证Java SE程序员助理书,我对所学到的一些新知识感到惊讶。 有时候他们真的没有道理,有时候他们说得通,但真的让人惊讶。 因此,在本系列文章中,我想将它们共享为“ Ja…

jvm(1)-走进java

【0】README0.1)本文转自 深入理解 jvm,旨在了解 java 体系结构;【1】java技术体系1) Sun 官方所定义的java 技术系统包括以下几个组成部分: java 程序设计语言;各种硬件平台上的java 虚拟机;Cl…

Java 高并发下的实践

一、使用的技术HashMap ConcurrentHashMap Lock ReadWriteLock synchronized 二、一百万并发下的组合 ConcurrentLockMap /** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* …

java oca_OCA第2部分中的Java难题

java oca欢迎使用OCA的Java Puzzlers的第二部分。 在这一部分中,我们将看到一个有趣的案例,涉及Java 7附带的数字文字中的下划线分隔符。 在下面的类中,您可以在十进制文字中看到分隔符下划线。 还请注意,该类现在可以正常编译。…