当前位置: 首页 > news >正文

【转】ES, 广告索引

思考:
1)直接把别名切换到上一个版本索引 --解决问题

2)广告层级索引如何解决? -routing、join

3)查询的过程:query and fetch, 优化掉fetch

4)segment合并策略

5)全量写入时副本数为1

6)消息乱序,保证广告的正确: 版本号

7) 查询sql优化: script脚本

---------------------------------以下是转载内容--------------------------------------------------------------------
回顾

之前分享了一篇文章 广告倒排索引架构与优化,介绍我们的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, 广告索引

思考: 1)直接把别名切换到上一个版本索引 --解决问题 2)广告层级索引如何解决? -routing、join 3)查询的过程:query and fetch, 优化掉fetch 4)segment合并策略 5)全量写入时副…...

Unity学习要点

前言 学习Unity作为游戏开发的强大工具,对于初学者来说,掌握一些基础而实用的技巧是非常重要的。这不仅能帮助你更快地上手,还能在项目开发过程中提高效率。以下是一些Unity初学者的使用技巧,希望能为你的学习之旅提供帮助。 ##…...

简单使用phpqrcode 生成二维码图片

$path ROOT_PATH; //tp项目根路径 require_once $path.vendor/phpqrcode/phpqrcode.php; //加载phpqrcode库 $url http://.$_SERVER[HTTP_HOST]./home/index/detail?id.$param[id]; $value $url; //二维码内容 $errorCorrectionLevel L; //容错级别 $mat…...

软考架构-计算机网络考点

会超纲,3-5分 网络分类 按分布范围划分 局域网 LAN 10m-1000m左右 房间、楼宇、校园 传输速率高 城域网 MAN 10km 城市 广域网 WAN 100km以上 国家或全球(英特网) 按拓扑结构划分 总线型:利用率低、干…...

渗透测试之内核安全系列课程:Rootkit技术初探(三)

今天,我们来讲一下内核安全! 本文章仅提供学习,切勿将其用于不法手段! 目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。在…...

大模型日报2024-06-08

大模型日报 2024-06-08 大模型资讯 AI研究:通过消除矩阵乘法实现高效的大语言模型 摘要: 该AI研究探讨了通过消除矩阵乘法来实现高效且可扩展的大语言模型(LLMs)。此方法旨在提升模型性能,提供更快速和高效的计算方案。 AWS大力投…...

leetcode 1631.最小体力消耗路径

思路:BFS二分 这道题和洛谷上的那个“汽车拉力赛”那道题很相似,但是这道题相较于洛谷那个来说会简单一些。 这里作者一开始写的时候思路堵在了怎么在BFS中用二分,先入为主的以为需要先写出来搜索函数然后再去处理二分的事,但是…...

【ARM64 常见汇编指令学习 19.2 -- ARM64 地址加载指令 ADR 详细介绍】

文章目录 地址加载指令 ADRADR 指令使用场景例子注意事项 地址加载指令 ADR ARMv8 架构引入了一系列的改进和扩展,包括对汇编指令集的更新。在这之中,ADR 指令是一个重要的组成部分,它用于计算并加载一个地址到寄存器。 ADR 指令 ADR 指令…...

vscode输出控制台中文显示乱码最有效解决办法

当VSCode的输出控制台中文显示乱码时,一个有效的解决办法是通过设置环境变量来确保编码的正确性。以下是解决方式: 首先,设置环境变量以修正乱码问题: 如果上述方法没有解决乱码问题,请继续以下步骤: 右键…...

springboot + Vue前后端项目(第十五记)

项目实战第十五记 写在前面1.后端接口实现1.1 用户表添加角色字段1.2 角色表增加唯一标识字段1.3 UserDTO1.4 UserServiceImpl1.5 MenuServiceImpl 2. 前端实现2.1 User.vue2.2 动态菜单设计2.2.1 Login.vue2.2.2 Aside.vue 2.3 动态路由设计2.3.1 菜单表新增字段page_path2.3.…...

如何在Windows 11中恢复丢失的快速访问菜单?这里提供解决办法

序言 在电脑的“快速访问”菜单中找不到固定的项目?或者,整个菜单对你来说已经消失了吗?无论哪种方式,你都可以强制你的电脑恢复菜单并显示其中的所有项目。以下是如何在你的Windows 11电脑上做到这一点。 将文件资源管理器设置为打开到主页 当你在文件资源管理器的左侧…...

变声器软件免费版有哪些?国内外12大热门变声器大盘点!(新)

变声软件是一种人工智能AI音频处理工具,允许用户实时修改自己的声音或改变预先录制的音频。这些软件解决方案可提供不同的效果,如改变声音的音调或速度,或将我们的声音转换成其他人或其他东西的声音,如名人、卡通人物、机器人或不…...

计算机网络 —— 数据链路层(无线局域网)

计算机网络 —— 数据链路层(无线局域网) 什么是无线局域网IEEE 802.11主要标准及其特点: 802.11的MAC帧样式 我们来看看无线局域网: 什么是无线局域网 无线局域网(Wireless Local Area Network,简称WLAN…...

SpringBoot图书管理系统【附:资料➕文档】

前言:我是源码分享交流Coding,专注JavaVue领域,专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享,定制和毕业设计服务! 免费获取方式--->>文章末尾处! 项目介绍048: 图…...

shell简介

一、Shell 概念定义 Shell 是用 C 语言编写的程序,是用户使用 Linux 的桥梁,既是命令语言又是程序设计语言。 shell 脚本为 Shell 编写的脚本程序,常说的 shell 通常指 shell 脚本。 包含一系列命令的文本文件,这些命令按照特定…...

使用 Scapy 库编写 ICMP 不可达攻击脚本

一、介绍 ICMP不可达攻击是一种利用ICMP(Internet Control Message Protocol)不可达消息来干扰或中断目标系统的网络通信的攻击类型。通过发送伪造的ICMP不可达消息,攻击者可以诱使目标系统认为某些网络路径或主机不可达,从而导致…...

Electron qt开发教程

模块安装打包 npm install -g electron-forge electron-forge init my-project --templatevue npm start //进入目录启动 //打包成一个目录到out目录下,注意这种打包一般用于调试,并不是用于分发 npm run package //打出真正的分发包,放在o…...

尝试用 GPT-4o 写 2024高考语文作文

文章目录 新课标I卷科技进步与问题的演变 新课标II卷抵达未知之境:探索与成长的旅程 全国甲卷坦诚交流:构建真正相遇的桥梁 北京卷历久弥新 天津卷定义与自定义:在世界的缤纷中前行 上海卷认可度的思考与反思 新课标I卷 阅读下面的材料&#…...

自动化Reddit图片收集:Python爬虫技巧

引言 Reddit,作为一个全球性的社交平台,拥有海量的用户生成内容,其中包括大量的图片资源。对于数据科学家、市场研究人员或任何需要大量图片资源的人来说,自动化地从Reddit收集图片是一个极具价值的技能。本文将详细介绍如何使用…...

自动驾驶人工智能

自动驾驶技术中使用的算法和滤波器 如何部署软件中的算法和滤波器,以增强传感器数据的可用性和应用性 自动驾驶人工智能 文章目录 一、介绍二、自动驾驶的算法2.1 感知算法2.2 本地化算法2.3 映射算法2.4 规划算法2.5 控制算法2.6 过滤 器2.7 卡尔曼滤波器2.8 颗粒过…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...