一场由 ES 分片 routing 引发的问题

一场由 ES 分片 routing 引发的问题

ES 结构

{"poroperties": {"joinType": {"type": "join","eager_global_ordinals": true,"relations": {"spu": "sku"}},"id":{"type": "keyword"},"spuGuid": {"type": "keyword"},"skuGuid": {"type": "keyword"},"sellCount": {"type": "long"}}
}

我们使用 ES 存储商品数据,我们使用父子文档,字段为 joinType,其值为 sku 时则为子文档,id 为 skuGuid,其值为 spu 时则为父文档,id 为 spuGuid。使用父子文档是为了通过 sku 参数查询条件去查询 spu。

ES 在多分片多的情况下,必须将父子文档放在同一分片中,所以我们以 spuGuid 作为routing id。
在这里插入图片描述

问题描述

一段更新销量的代码执行完以后,查询发现销量未变化。
在这里插入图片描述

问题排查

查看 ES 数据

用 GET goods_index/_doc/7277857079027761152 直接查询该id的文档

在这里插入图片描述

用 POST goods_index/_search 条件为 skuGuid = 7277857079027761152

在这里插入图片描述

用 POST goods_index/_search 条件为 id = 7277857079027761152

这时候我还在怀疑是不是因为我们代码最近把主键都改为 long 数值类型,在序列化时变成了字符串类型,是否 es 对这个敏感。所以我又进行了一次查询,这次使用 id 字段,因为每个文档都会内置一个 id,然后就发现问题了。
在这里插入图片描述
这里居然出现了两个文档!,而且他们一个有 routing,一个没有 routing,我恍然大悟。我们的 ES 设置了分片数为 3,也就是每个文档都会根据 id 得到不同的 routing 值,从而存入不同的分片中。由于我们为了确保父子文档能正确查询,按照官方文档要求的将 spuGuid 设为 routing,但是在更新销量的代码中并没有指定 routing,没有指定的话,就会默认使用 id 作为 routing 依据,那就不知道会存入哪个分片了,运气好就是对的,运气差就是错的。这就解释了为什么一些商品的销量是正确的,一些是错误的问题。而且用 GET _doc 的方式查询时,它会默认用 id routing 一次再查询,所以查不到真正的文档,而查询到的那个只有一个销量的文档是代码中 upsert 插入的,upsert 是先如果没有找到对应文档就会插入文档,所以就只有一个字段。而在用 _search skuGuid = 7277857079027761152 查询时查不到是因为本来就没 skuGuid 这个字段。最后用 _search id = 7277857079027761152 查询到了,是因为用了文档本来的 id 查到了。

在这里插入图片描述

解决办法

ES更新的时候因为有分片存在,UpdateRequest 不设置 routing 时默认用 id 路由,如果用了父子文档(父子文档现在用的 spuGuid 作为routing id),就会路由错误,更新失败。

所以更新的时候如果用UpdateRequest,就必须指定routing;否则就用UpdateByQueryRequest,无需指定routing。

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

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

相关文章

Linux信号的处理

目录 一、信号处理概述:为什么需要“信号”? 二、用户空间与内核空间:进程的“双重人格” 三、内核态与用户态:权限的“安全锁” 四、信号捕捉的内核级实现:层层“安检” 五、sigaction函数:精细控制信…

IntelliJ IDEA 2023.3.1安装指南从下载到配置的完整教程(附资源下载)

安装 IntelliJ IDEA 2023.3.1 非常简单,以下是详细的安装步骤,适用于 Windows、macOS 和 Linux 系统。 1. 下载 IntelliJ IDEA IntelliJ IDEA下载链接:https://pan.quark.cn/s/3ad975664934 选择适合你的操作系统的版本: Ultimat…

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解 (图1-1) 一、鸿蒙中App、HAP、HAR、HSP是什么? (1)App Pack(Application Package) 是应用发布的形态,上架应用市场是以App Pa…

配置阿里云yum源

配置阿里云yum源 修改默认的yum仓库,把原有的移动到创建的目录里(踢出国外的yum源) # 切换到/ect/yum.repos.d/目录下 cd /etc/yum.repos.d/ # 新建repo目录 mkdir repo # 把原有的移动到创建的目录里 mv ./*.repo ./repo/配置yum源 # 找到…

在C#的MVC框架framework项目的使用ajax,及源码下载

在C# MVC框架中使用AJAX实现异步请求,有助于提高应用程序的性能和用户体验。 在MVC框架framework项目中,ajax使用方法如下 1.在Controller类中,创建一个新的方法(例如:GetRes),该方法处理AJAX请求并返回J…

Linux部署DHCP服务脚本

#!/bin/bash #部署DHCP服务 #userli 20250319#检查是否为root用户 if[ "$USER" ! "root" ] thenecho "错误:非root用户,权限不足!"exit 0 fi#配置网络环境 read -ep "请给本机配置一个IP地址(不…

vulhub Matrix-Breakout

1.下载靶机,打开靶机和kali虚拟机 2.查询kali和靶机ip 3.浏览器访问 访问81端口有登陆界面 4.扫描敏感目录 kali dirb 扫描 一一访问 robot.txt提示我们继续找找,可能是因为我们的字典太小了,我们换个扫描器换个字典试下,利用kali自带的最大…

科普类——双目立体视觉与 RGBD 相机的简单对比

双目立体视觉与 RGBD 相机生成的深度图在原理、性能和应用场景上有显著差异。以下是两者的详细对比和分析: 1. 原理差异 (1) 双目立体视觉 (Stereo Vision) 原理: 通过两个摄像头模拟人眼视差,计算匹配像素点的水平位移(视差&…

深度学习项目--基于DenseNet网络的“乳腺癌图像识别”,准确率90%+,pytorch复现

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 如果说最经典的神经网络,ResNet肯定是一个,从ResNet发布后,很多人做了修改,denseNet网络无疑是最成功的…

面试八股 —— Redis篇

重点:缓存 和 分布式锁 缓存(穿透,击穿,雪崩) 降级可作为系统的保底策略,适用于穿透,击穿,雪崩 1.缓存穿透 2.缓存击穿 3.缓存雪崩 缓存——双写一致性 1.强一致性业务&#xff08…

mapbox-gl源码中解析style加载地图过程详解

我将结合 Mapbox GL JS 的源码示例,一步一步讲解 style 的解析和地图加载过程,帮助大家深入理解其内部机制。 Mapbox GL JS 是一个强大的 Web 地图库,利用 WebGL 技术渲染交互式地图。其核心功能之一是通过样式(style&#xff09…

瑞萨RA系列使用JLink RTT Viewer输出调试信息

引言 还在用UART调试程序么?试试JLINK的RTT Viewer吧!不需占用UART端口、低资源暂用、实时性高延时微秒级,这么好的工具还有什么理由不用了! 目录 一、JLink RTT Viewer 简介 二、软件安装 三、工程应用 3.1 SEGGER_RTT驱动包 3.2 手搓宏定义APP_PRINT 3.3 使用APP_…

MySQL 入门大全:查询语言分类

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

1.Windows+vscode+cline+MCP配置

文章目录 1.简介与资源2.在windows中安装vscode及Cline插件1. 安装vscode2. 安装Cline插件3. 配置大语言模型3. 配置MCP步骤(windows) 1.简介与资源 MCP官方开源仓库 MCP合集网站 参考视频 2.在windows中安装vscode及Cline插件 1. 安装vscode 2. 安装Cline插件 Cline插件…

性能测试过程实时监控分析

性能监控 前言一、查看性能测试结果的3大方式1、GUI界面报告插件2、命令行运行 html报告3、后端监听器接入仪表盘 二、influxDB grafana jmeter测试监控大屏1、原理:2、linux环境中influxDB 安装和配置3、jmerer后端监听器连接influxDB4、linux环境总grafana环境搭…

【Linux我做主】浅谈Shell及其原理

浅谈Linux中的Shell及其原理 Linux中Shell的运行原理github地址前言一、Linux内核与Shell的关系1.1 操作系统核心1.2 用户与内核的隔离 二、Shell的演进与核心机制2.1 发展历程2.2 核心功能解析2.3 shell的工作流程1. 用户输入命令2. 解析器拆分指令3. 扩展器处理动态内容变量替…

可视化图解算法:链表中倒数(最后)k个结点

1. 题目 描述 输入一个长度为 n 的链表,设链表中的元素的值为ai ,返回该链表中倒数第k个节点。 如果该链表长度小于k,请返回一个长度为 0 的链表。 数据范围:0≤n≤105,0 ≤ai≤109,0 ≤k≤109 要求&am…

在线教育网站项目第四步:deepseek骗我, WSL2不能创建两个独立的Ubuntu,但我们能实现实例互访及外部访问

一、说明 上一章折腾了半天,搞出不少问题,今天我们在deepseek的帮助下,完成多个独立ubuntu24.04实例的安装,并完成固定ip,实践证明,deepseek不靠谱,浪费我2个小时时间,我们将在下面实…

CMake 保姆级教程

CMake 是一个跨平台的构建工具,用于生成适合不同平台和编译器的构建系统文件(如 Makefile 或 Visual Studio 项目文件)。 在 Windows 下使用 CMake 构建项目时,CMake 会根据 CMakeLists.txt 文件生成适合 Windows 的构建系统文件&…

zabbix数据库溯源

0x00 背景 zabbix数据库如果密码泄露被登录并新增管理员如何快速发现?并进行溯源? 本文介绍数据库本身未开启access log的情况。 0x01 实践 Mysql 数据库查insert SELECT * FROM sys.host_summary_by_statement_type where statement like %insert% 查…