回顾

之前分享了一篇文章 广告倒排索引架构与优化,介绍我们的ES广告倒排索引的架构与优化,我就不介绍了,建议先去看下这篇文章,再回来看这篇,下面只放下之前的架构图

ES倒排索引

演进

采用 canal 监听 binlog 变更

原有架构是在代码中写 MQ 消息,然后 index_builder 消费消息,写入到两个索引中。但这种方式有个不足是不能覆盖所有的订单或创意变更,所以倒排索引中的数据有的时候和 DB 中是不一致的。同时代码维护起来也比较麻烦。后面我们就引入了阿里开源的框架 canal ,它可以监听 MySQL 的 binlog 的变更,然后把日志发到 Kafka 中,这样我们只需要在 index_builder 这个工程中消费 Kafka 的消息就行了,省去了在 dsp_adinfo 中发消息。而且 binlog 的变更可以覆盖所有的变更操作。

项目由物理机迁移到云平台

之前 index_builder 部署在物理机上,且 builder 采用主备部署,通过争抢用 zookeeper 实现的分布式锁来决定谁是主,迁移到云平台后,就去掉了这种对主备部署的方式,因为云平台有自动修复的策略。

注意

我们部署的两个 builder 一个为 m 索引,一个为 f 索引,通过环境变量 dsp_index_name 区分是 m 索引 还是 f 索引。同时因为这两个 builder 都要消费 Kafka 的消息,但我们知道 Kafka 处于同一个消费组的消费者只有一个能消费消息,所以要把两个 builder 放到不同的消费组中,即设置不同的 group_id,同样也是通过环境变量区分

增加检查数据一致性的定时任务

增加了检查 DB 和 ES倒排索引中的数据一致性的定时任务,每 10 分钟执行一次,如果发现不一致会发短信通知,正常情况下数据都是一致的

通过上面的一点点演进,整体架构如下所示

调整前架构图

一次线上问题

因为我们只部署了一套 ES 集群,两个索引都在上面,只是通过别名访问,完成索引的切换,这就存在单点问题,一旦集群出现问题,后果不堪设想。

就像墨菲定律所言

如果事情有变坏的可能,不管这种可能有多小,它总会发生

我们的场景是读多写少,且索引占用内存比较小,所以设置的主分片是 1 ,副本分片是 节点数-1,这样就可以保证每个节点都保存所有数据,可以减少在路由分片或节点的网络消耗。

但在一次上线过程中,忘记修改副本数了,所以副本数默认是 1,然后切换到该索引后,短时间(大约几十秒)内就导致 ES 集群瘫痪,节点内存爆满且不响应任何请求,因为主备索引都在一个 ES 集群中,所以想切回主索引也切不回去了,导致我们一段时间检索不出来广告,从而影响出价。最后没有办法只能在入口处把流量暂停,然后重启 ES,很尴尬的是,我们没有准备批量重启 ES 集群的脚本,只能挨个节点登录重启,也浪费了一些时间。ES 集群重启完后,重新构建索引并正确设置副本数,再打开流量,才恢复了正常,当时真的心惊肉跳,至今记忆犹新。

为何副本是 1 最后导致了整个集群瘫痪?

我们一个 ES 集群部署了 35 个节点,设置的主分片是 1,副本分片是节点数-1,即 34,这样做的好处是每个节点都有完整的数据,当请求到该节点后,直接查询数据就可以返回了,省去了路由到其他节点带来的网络消耗

而忘记修改副本数,即默认的是 1,这样出现的情况是,整个 ES 集群 35 个节点,只有 2 个节点有数据,其他节点是没有数据的,但是每个节点都是均匀的接收请求,但是这些没有数据的节点会把请求转发到有数据的两个节点,也就是这两个节点要承担其他没有数据的 33 个节点的请求压力,所以最后撑爆了整个集群

反思

这次线上问题后,我们做了反思,也需要采用一些对策来避免类似的情况发生

  1. 主备索引部署在同一个 ES 集群上,存在单点问题,所以需要再部署一个 ES 集群,实现物理隔离

  2. 提供重启整个 ES 集群的脚本,以备在出现问题时可以快速重启集群

  3. 通过别名方式切换索引是 100% 流量切换,也容易出现问题,所以需要一个灰度慢慢切换的方式

  4. 切换索引时要增加必要的检查项

  5. 调用 ES 增加熔断机制,当 ES 集群出现故障时触发熔断,保护 ES 集群和服务

架构调整

首先就是重新部署了一套 ES 集群,实现物理隔离,避免一个 ES 集群出问题,影响到另一个集群

其次在作业平台中增加重启 ES 的脚本

然后就是通过引入 Nacos 配置中心,配置流量分配比例,从而实现灰度切换流量。同时支持配置变更通知

调整后的架构如下所示

调整后的架构

这个方案上线后,先采用了主备两套 ES 集群流量比为 1:1,然后观察效果,发现查询 ES 的 t99 由之前的 10ms 下降到 5ms,下降大约 50%,在 Prometheus 中埋点展示如下

ES双集群上线后效果

mapping 优化

我们对 ES 的读取还是有待优化的地方,在 kibana 中通过观察 Search Profiler 发现 build_scorer 占用了大部分时间,接近 80%,如下所示

Search Profiler

通过查询资料,发现可以把 mapping 文件中为 Integer 类型的映射字段改为 keyword 后可以提高性能,因为这些字段只有有限个值,并且查询时是通过 terms 精确匹配,所以定义为 keyword 后性能高些,至于性能高的根本原因还是需要深入源码分析的,需要抽时间深入研究。

然后我们就改变 mapping 文件开始验证,上线后的效果对比图如下所示

tp90对比

tp99对比

可见上线后,效果还是比较明显的

总结

因为对 ES 底层不够了解,也只能通过问题驱动来一点点的优化,后面会深入学习下 ES,再找可以优化的点

学无止境,如果文中哪里有问题,欢迎大佬批评指正,同时如果你有对 ES 优化有经验,也欢迎分享给我

参考资料

https://www.jianshu.com/p/9830413f62eb

https://elasticsearch.cn/article/446

https://elasticsearch.cn/question/3253

https://www.elastic.co/cn/blog/searching-numb3rs-in-5.0

https://www.elastic.co/cn/blog/better-query-planning-for-range-queries-in-elasticsearch

历史文章推荐

广告倒排索引架构与优化

cpu使用率过高和jvm old占用过高排查过程

频繁FGC的真凶原来是它

老年代又占用100%了,顺便发现了vertx-redis-client 的bug

KafkaProducer源码分析

Kafka服务端之网络层源码分析

Redis 的过期策略是如何实现的?

原创|如果懂了HashMap这两点,面试就没问题了

原创|面试官:Java对象一定分配在堆上吗?

原创|这道面试题,大部分人都答错了

es的分片和副本_原创|ES广告倒排索引架构演进与优化相关推荐

  1. es的分片和副本_Elasticsearch的分布式存储与分片内部原理

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

  2. es的分片和副本_Elasticsearch 集群分配多少分片合理

    Elasticsearch 是一个非常通用的平台,支持各种用户实例,并为组织数据和复制策略提供了极大的灵活性.但是,这种灵活性有时会使我们很难在早期确定如何很好地将数据组织成索引和分片,尤其是不熟悉 ...

  3. es的分片和副本_Elasticsearch 索引分片与副本设置技巧

    Elasticsearch虽然搜索很快,但如果分片设置不当,当数据量达到一个量级后,查询速度也会直线下降. 如果一个索引具有很大的数据量,它的数据量可能会超出单个节点的容量限制(硬盘容量),而且单个节 ...

  4. es分片多少合理_【ES】ElasticSearch 深入分片

    @[toc] 一.分片介绍 分片是 Elasticsearch 在集群中分发数据的关键. 把分片想象成数据的容器.文档存储在分片中,然后分片分配到集群中的节点上.当集群扩容或缩小,Elasticsea ...

  5. es数据库主要干什么用_初识ES数据库

    一.什么是Elasticsearch 1.概念以及特点 1.Elasticsearch和MongoDB/Redis/Memcache一样,是非关系型数据库. 是一个接近实时的搜索平台,从索引这个文档到 ...

  6. adg oracle 架构_云化双活的架构演进,宁夏银行新核心搭载Oracle 19c投产上线

    云和恩墨顺利完成宁夏银行新数据中心数据库平台的建设,包括新数据中心RAC搭建.DG搭建.旧数据中心到新数据中心的数据迁移,以及在整个项目生命周期中的实施规范.性能测试保障.压力测试等.6月12日,宁夏 ...

  7. 话费充值折扣数据库_《京东话费充值系统架构演进实践》--阅读

    京东话费充值业务线的订单量'水涨船高 ',同时对系统的各项运行指标要求更高,老的系统架构不足以支撑新的业务量,需要对系统进行升级.升级方案从以下几个层面进行. 1.应用层面 引入缓存 在应用层和数据库 ...

  8. react在线文件_在线教育大前端架构演进之路

    前段时间,本人有幸于在深圳GMTC大前端架构演进专场进行分享.其后应叶冉编辑邀请,总结了此次分享的演讲稿<腾讯在线教育大前端架构演进之路>.首先做一下自我介绍.我是来自腾讯的工程师 hai ...

  9. es中主分片和副本分片

    我们知道es中保存数据的时候是有主分片和副本分片的,那么副本分片的作用有哪些呢? 1.作为备份,防止主分片崩溃 2.分担查询请求,请求会在主分片和副本分片之间均匀分布 第一点:主副本之前角色的切换如何 ...

  10. es动态分配分片_解决ES索引分片均衡问题

    运行了两年的ES集群,今天索引节点突然不均衡,新建索引分片都集中到一个节点上了,如下图: 同时还有部分节点分片在恢复,如上图,有432个待恢复分片,而且只有两个分片在同时恢复,网络吞吐也很小,这要等到 ...

最新文章

  1. Azure编配器简化有状态无服务器工作流的创建
  2. 首个中文多项选择阅读理解数据集:BERT最好成绩只有68%
  3. Golang 随机获取本机可用端口
  4. python中 yield的用法和生成器generator的说明
  5. redis的五种数据类型及常见操作
  6. 基于Spring boot + Mybatis +Netty 实现前后端分离的聊天App,部署到阿里云线上服务器...
  7. solaris安装java_Solaris是出色的Java开发平台的原因
  8. 推荐笔记本用户使用的硬盘。。。2.5”战胜台式机硬盘 日立7K320-250GB
  9. dp、px之间单位转换Util
  10. 找出数组中两数之和为指定值的所有整数对
  11. Python3 列表
  12. android 免root自动滑动,无需root自动点击屏幕软件
  13. 小爱音箱mini系统故障怎么办_小编处理win7系统连接小爱音箱mini的解决教程
  14. Fortran:if语句
  15. Visual Studio下载太慢的解决方法
  16. WiFi 破解连接方式
  17. Altium Designer18中DDR3的数据和地址线如何分别布等长线,走蛇形线
  18. 给服务器安装BBR加速网络传输速度
  19. 有源滤波器空间矢量不定频滞环控制matlab仿真
  20. 一个葫芦娃的小程序,爷青回!

热门文章

  1. javascript 组成
  2. DBCS和UCS编码相关
  3. 【Sarah】第一周
  4. 试用期要盯紧你的“四金”
  5. ASP.NET 控制页概览
  6. PIL 图片压缩处理
  7. XML解析模型(完整版)
  8. -bash:ls:command not found,执行命令总是报找不到
  9. Layui 数据表格开启合计行
  10. PHP array(递归)转xml,xml转array