专栏首页编程一生Elasticsearch实战-磁盘IO被打满

Elasticsearch实战-磁盘IO被打满

背景

事情是这样的。一天下午4点42分左右。业务反馈我开发的服务在测试环境出现问题,返回资源数据是0。查日志发现是ES访问超时。相当于数据库挂了。持续了20多分钟自己恢复。 咨询了ES团队,最终得到下面的答复:

当前集群现状: 1)当前集群数据IO最高的索引为XXX,数据量很小(100mb) 2)但是读写都很大(读>1000QPS,写>1000QPS) ,使用的是线下环境的机器 3)索引分了10个片,4个副本问题 分析: 1)线下环境的机器之前了解到测试环境硬盘性能本来就很差,这个需要业务SRE一块来确定 2)查询的时候,会一次性查询10个片,这样可能会查10台机器的数据,很容易出现木桶效应,造成集群的性能下降 3)写入的时候,虽然是做了10个分片,看起来能加大写能力,但是机器数少,导致结果是每台机器分布了5个分片,等效于只做了2个分片,完全没有扩大写的能力 建议: 1)升级硬件,换成SSD 2)分片改成2个,这样读能力比以前肯定有提升,写能力等价 3)数据量很小,建议直接换成Redis

我自己做了调查。测试环境ES有十台VM(非本地ESB磁盘)作为服务器。其中一台IO被打满。其他机器负载、IO都很低。对于这个问题,ES团队给出的答复是:

ES的服务负载均衡、发现机制是自己写的,一般不会出现问题, Client仅仅对官方的客户端做了简单的封装, 当然最好是可以对官方的客户端进行改造, 但是我们现在的人力明显不行,只能继续沿用老的客户端使用; 我们预计在10月份左右会出一个自研的客户端, 会尽量避免出现一台机器导致部分查询出现问题, 但是也避免不了, ES内部的服务发现机制,我们改变不了,除非改ES

调查

1.需要换成本地磁盘,测试环境也是我们的正式环境。是否能直接替换成物理机?多少台合适?怎么可以平滑替换?

没有必要换成物理机。因为ES内存最多能用32G。内存多出来的是浪费用不上,有物理机也是隔成VM来用。

原来10台VM是足够的,只需要同等数量替换。

有机器替换功能。替换时原理是先申请机器部署。然后点击机器替换。会一台台的将分片赶到新机器上。一台下完自动下线老机器。

2.我们测试环境有10台服务器,10个分片,4个副本,写/读QPS大概是7:6。究竟几个分片几个索引更合理?

因为每个分片和副本是同步写。写比例大,副本多会对性能有很大影响。分片替换需要重建索引,很难平滑。所以只将副本数减少为一个分片1个。

3.程序方面有没有可以优化的?

在ES上层增加tair缓存。在进行数据更新操作时是单个数据读取。采用tair有更好的事务性,并减少了对ES的压力。ES只处理复杂查询请求。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Elasticsearch的动态索引和索引优化

    实际工作中使用过ES的朋友可能会有和静儿一样的感受。ES存储更新从编码上是很方便。如下,Kubernetes的yaml文件完全可以通过json直接序列化一下,一...

    静儿
  • 自动化管理之禅-新人培养

    静儿
  • 请一定记得升级java虚拟机

    静儿
  • scala数据类型

    Scala 与 Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说scala没有java中的原生类型 Scala数据类型分为两大类 AnyV...

    若与
  • Mongodb分片集群部署

    对于单台数据库服务器,庞大的数据量及高吞吐量的应用程序对它而言无疑是个巨大的挑战。频繁的CRUD操作能够耗尽服务器的CPU资源,快速的数据增长也会让硬盘存储无能...

    拓荒者
  • 《你不知道的JavaScript》:js类型的注意点

    可以使用typeof来查看值的类型,它返回的是类型的字符串值。但有一种类型和它的字符串值并不一一对应:

    前端_AWhile
  • es|路由一个文档到一个分片

    当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当...

    heidsoft
  • 如何在Visual Studio中调试.NET源码

    In order to configure Visual Studio 2013 do the following in the Tools -> Optio...

    卡尔曼和玻尔兹曼谁曼
  • IBASE read buffer

    Function group IB_CRM_API里定义了一个类型为int的全局变量handle, 其作用是作为一个指向internal read / writ...

    Jerry Wang
  • 搭建Ghost 博客详细教程之连接云服务器

    这里注意下,新手在创建好SSH密钥后一定记得要绑定你的云服务器,我就踩过这样的坑。

    Bug生活2048

扫码关注云+社区

领取腾讯云代金券