一場由 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.pswp.cn/news/898410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898410.shtml
英文地址,請注明出處:http://en.pswp.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% 查…