查看原文
其他

记一次中台数据传输同步Elasticsearch失败的车祸现场

犬小哈 小哈学Java 2019-06-05

点击蓝色“小哈学Java”关注我哟

加个“星标”,第一时间获取小哈推送的文章哦!

目录

  • 一、背景

  • 二、题外话

  • 三、开始排查

  • 四、为什么索引处于只读状态呢?

  • 五、如何解决

一、背景

前几天小哈在钉钉群里收到重庆业务线反馈,说是中台数据传输中间件在同步 Mysql 增量数据到 Elasticsearch 总是失败。

二、题外话

你说的这个数据传输和阿里云提供的数据传输DTS是一个东西吗?

不是!上面说的数据传输是小哈所在的中台研发部自主研发的中间件,目的是为了取代各业务线对阿里DTS同步功能的依赖!

目前来说,数据传输还是要依赖于阿里开源 Canal, 或者阿里 DTS,依赖的目的是实现对 Mysql 数据库 binlog 增量订阅。

以上网络架构示例图中,中台数据传输充当一个 binlog 事件消费者的角色,通过自定义规则映射,数据加工,分发并最终同步到目标源 Elasticsearch 中。

三、开始排查

回归正题,出了问题,立马赶紧通过跳板机连上数据传输所在的服务器,开始查看日志:

看到日志中存在大量的 [FORBIDDEN/12/index read-only/allowdelete(api)] 错误!!

提示错误也很明显:ES 索引处于只读状态!!在和业务组沟通以后,发现需要同步的目标索引有两个,一个商品索引(充当主表),一个商品属性索引(充当商品从表),从表同步是 ok 的,也就是说商品属性索引非只读状态,写入正常,仅仅是商品索引处于只读状态,最终未能正常同步数据。

四、为什么索引处于只读状态呢?

什么原因导致的索引只读的?小哈开始翻阅 Elasticsearch 官方文档, 原文如下:

Elasticsearch considers the available disk space on a node before deciding whether to allocate new shards to that node or to actively relocate shards away from that node.

Elasticsearch 在决定是否分配新分片给该节点,或对该节点重新定位分片之前,会先判断该节点存储空间是否足够,如果说磁盘空间的使用率已经超过 95%,ES 会自动将索引 index 置为 read-only 状态。

于是,让运维看下 ES 机器的磁盘空间是否足够,运维反馈说:前两天就是因为磁盘不足告警,刚刚扩的容,肯定是够的!

真相大白了!

前两天磁盘空间不足,那个时候,商品索引刚好有写入的操作,由于 ES 的保护机制,将该索引置为了只读状态。

五、如何解决

原因找到了!要如何解决呢?

处于只读状态的索引,只能被查询或者删除。而 ES 还不会自动将索引状态切换回来,就需要我们手动切换了:

  1. PUT /<yourindex>/_settings

  2. {

  3. "index.blocks.read_only_allow_delete": null

  4. }

对商品索引执行如上命令后。让业务组再次同步数据,一切正常了。

免费无套路分享 | 面试&学习福利资源

最近在网上发现一个不错的 PDF 资源《Java 核心知识&面试.pdf》,内容覆盖很广,Java 核心基础、Java 多线程、高并发、Spring、微服务、Netty 与 RPC、Zookeeper、Kafka、RabbitMQ、Habase、设计模式、负载均衡、分布式缓存、Hadoop、Spark、Storm、云计算等

获取方式: 关注本公众号: 小哈学Java, 后台回复资源,既可免费无套路获取资源链接


更多推荐内容

↓↓↓

针对代码级别的性能测试工具 JMH, 了解一下吧!

一文教您通过 Docker 快速搭建各种测试环境(Mysql, Redis, ES, MongoDB) | 建议收藏

CPU 100% 异常排查实践与总结

阿里云OSS被盗链?上个月图床流量耗费50G+,请求次数10W+,什么鬼?

一台Java服务器跑多少个线程,性能最佳呢?

干货 | 关于 Mybatis 缓存,面试官都未必知道的这么详细

惊了!7 行代码优雅地实现 Excel 文件导出功能?

技术经理:求求你,别再乱改数据库连接池的大小了!


如果你喜欢本文

请长按二维码,关注小哈学Java

转发朋友圈,是对我最大的支持哟


如果你喜欢这篇文章,在看,转发吧。

相信明天更加美好 (*^__^*) 


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存