數據一致性巡檢總結:基于分桶采樣的設計與實現

數據一致性巡檢總結:基于分桶采樣的設計與實現

背景

在分布式系統中,緩存(如 Redis)與數據庫(如 MySQL)之間的數據一致性問題是一個常見的挑戰。由于緩存的引入,數據在緩存和數據庫之間可能存在延遲、更新失敗或邏輯錯誤,導致數據不一致。這種不一致可能會影響業務的正確性和用戶體驗。

為了解決這一問題,我們設計并實現了一套基于分桶采樣的數據一致性巡檢機制。該機制通過分桶采樣、分批處理、數據一致性校驗、采樣結果存儲、報警機制以及數據維護機制,能夠有效發現緩存與數據庫之間的數據不一致問題,同時優化數據存儲和查詢效率,保障業務的正確性與穩定性。


一、設計思想

  1. 分桶采樣
    • 將數據劃分為多個桶(BUCKET_SIZE),每個桶包含一定范圍的數據。
    • 根據單次需要采樣的數量(sampleCount)和單次拉取數據量(batchSize),計算得到總批次數,通過總批次數(totalBatches)生成唯一索引(generateUniqueIndexes),到不同桶中隨機采樣數據。
    • 分桶采樣的優點在于:
      • 降低數據重復采樣的概率,確保采樣數據的獨立性。
      • 提高采樣效率,避免全量掃描數據庫。
      • 常規的數據庫 Rand() 函數存在性能問題。
  2. 本地聚合與存儲
    • 采樣數據在本地內存中聚合,通過 ConcurrentHashMap 存儲采樣結果,減少頻繁訪問 Redis。
    • 采樣結果通過 Redis 的 SortedSet 存儲,score 為觸發采樣的時間戳,value 中存儲的是不一致率以及不一致的訂單信息,便于前端頁面根據范圍查詢。
  3. 數據一致性校驗
    • 針對每個訂單號,分別校驗緩存(Redis)與數據庫(DB)中數據一致性。
    • 可以排除指定字段校驗,例如 datachangeLasttime
    • 校驗結果包括:
      • 對象級別一致性:校驗單個對象(如訂單、訂單詳情)的字段值是否一致。
      • 列表級別一致性:校驗列表數據(如乘客信息、推薦信息)的條目數量和內容是否一致。
  4. 報警機制
    • 如果發現數據不一致,觸發報警機制,通過郵件通知相關人員。
    • 報警內容包括:
      • 數據庫名、表名、不一致率。
      • 不一致訂單的詳細信息(訂單號、DB 數據、Redis 數據、不一致類型)。
  5. 數據維護機制
    • 定期將舊數據從熱緩存遷移到冷緩存,并清理過期數據。
    • 通過冷熱數據分離策略,優化存儲和查詢效率。
  6. 觸發采樣的方式
    • 定時任務觸發:系統通過定時任務定期觸發數據一致性巡檢,確保數據一致性問題能夠被及時發現。
    • 前端主動觸發:提供了前端接口,允許管理員根據需要手動觸發數據一致性巡檢。

二、實現細節

1. 分桶采樣

int totalBatches = totalCheckCount / batchSize;
if (totalCheckCount % batchSize != 0) {totalBatches++;
}
List<Integer> uniqueIndexes = generateUniqueIndexes(totalBatches).stream().toList();
  • 根據總數據量和批次大小計算總批次數。
  • 生成唯一索引(generateUniqueIndexes),確保每批次采樣的數據獨立且不重復。

2. 采樣數據的獲取

// 獲取數據 SQL 針對 ID 取余 SELECT orderNumber FROM scm_grabticket_order WHERE Status IN ('O', 'L') AND id % ? = ? LIMIT ?
List<String> orderNumberList = orderDao.sampleEffectiveOrderNumber(BUCKET_SIZE, bucketIndex, batchSize);
  • 每批次從數據庫中采樣有效訂單號(sampleEffectiveOrderNumber)。
  • 采樣邏輯基于分桶索引(bucketIndex)和批次大小(batchSize),確保采樣數據的獨立性和代表性。

3. 數據一致性校驗

checkConsistencyByOrderNumber(channelEnum, orderNumber, samplingResultMapForNewCache, DataConsistencyQueryType.NEW_CACHE);
  • 針對每個訂單號,分別校驗新舊緩存與數據庫的一致性。

  • 校驗邏輯包括:

    • 對象級別一致性

      checkObjectConsistencyAndStoreResult(orderNumber, samplingResult, dbValue, redisValue);
      
      • 比較單個對象的字段值是否一致,排除指定字段(CHECK_CONSISTENCY_EXCLUDE_FIELDS)。
    • 列表級別一致性

      checkListConsistencyAndStoreResult(orderNumber, samplingResult, dbValue, redisValue);
      
      • 比較列表數據的條目數量和內容是否一致,記錄僅存在于 DB 或 Redis 中的數據。

4. 采樣結果的存儲

storeSampleResultToRedis(dbNameEnum, createTime, samplingResultMapForOldCache, DataConsistencyQueryType.NEW_CACHE);
  • 將采樣結果存儲到 Redis 的 SortedSet 中,score 為觸發采樣的時間戳。
  • 存儲邏輯包括:
    • 設置采樣結果的創建時間(createTime)和不一致率(inconsistencyRatio)。
    • 數據保留時間為 15 天(LocalDateTime.now().plusDays(15))。

5. 報警機制

dataInConsistencyAlert(samplingResultMapForNewCache, samplingResultMapForOldCache, dbNameEnum);
  • 如果發現數據不一致,觸發報警機制。
  • 報警內容包括:
    • 數據庫名、表名、不一致率。
    • 不一致訂單的詳細信息(最多展示 5 條)。

6. 數據維護機制

定期遷移數據到冷緩存

為了優化存儲和查詢效率,防止 Redis 數據內存占用過大,系統實現了一個數據維護機制,定期將舊數據從熱緩存遷移到冷緩存,并清理過期數據。

public void maintainInConsistencyData(DBNameEnum dbNameEnum) {long fifteenDaysAgo = DateUtils.localDateTimeToLongAccurateMinute(LocalDateTime.now().minusDays(15));long sixMonthsAgo = DateUtils.localDateTimeToLongAccurateMinute(LocalDateTime.now().minusMonths(6));for (TableNameIndexEnum value : TableNameIndexEnum.values()) {for (DataConsistencyQueryType dataConsistencyQueryType : dataConsistencyQueryTypes) {// 1. 從熱數據中查詢 15 天以外的數據,備份到冷數據中backUpOldData(dbNameEnum, value.getTableNameEnum(), dataConsistencyQueryType, fifteenDaysAgo);// 2. 清理冷數據中半年以外的數據removeOldDataFromColdStore(dbNameEnum, value.getTableNameEnum(), dataConsistencyQueryType, sixMonthsAgo);}}
}
  • 備份舊數據:將 15 天以前的數據從熱緩存遷移到冷緩存。
  • 清理過期數據:刪除冷緩存中 6 個月以前的數據。
  • 數據精簡:遷移到冷緩存時,會清除詳細的不一致訂單信息,只保留統計數據。
觸發方式

數據維護機制的觸發方式有兩種:

  • 定時任務調度:系統會定期自動觸發數據維護任務,確保數據定期得到整理和優化。
  • 前端主動觸發:提供了前端接口,允許管理員手動觸發數據維護任務,以應對特殊情況或緊急需求。

這種雙重觸發機制既保證了數據維護的自動化,又提供了靈活的人工干預途徑。


三、前端展示

請添加圖片描述
請添加圖片描述


四、總結

本文總結了基于分桶采樣的數據一致性巡檢設計與實現,涵蓋了分桶采樣、分批處理、數據一致性校驗、采樣結果存儲和報警機制等關鍵點。同時,介紹了數據維護機制,包括定期將舊數據遷移到冷緩存以及清理過期數據的策略。系統通過定時任務和前端主動觸發兩種方式來執行數據維護,既保證了自動化又提供了靈活性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77793.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot與Druid整合,實現主從數據庫同步

通過引入主從數據庫同步系統&#xff0c;可以顯著提升平臺的性能和穩定性&#xff0c;同時保證數據的一致性和安全性。Druid連接池也提供了強大的監控和安全防護功能&#xff0c;使得整個系統更加健壯和可靠。 我們為什么選擇Druid&#xff1f; 高效的連接管理&#xff1a;Dru…

在Linux系統中安裝MySQL,二進制包版

1、檢查是否已安裝數據庫&#xff08;rpm軟件包管理器&#xff09; rpm -qa | grep mysql rpm -qa | grep mariadb #centOS7自帶mariadb與mysql數據庫沖突2、刪除已有數據庫 rpm -e –nodeps 軟件名稱 3、官網下載MySQL包 4、上傳 # 使用FinalShell或Xshell工具上傳&#…

【含文檔+PPT+源碼】基于SpringBoot電腦DIY裝機教程網站的設計與實現

項目介紹 本課程演示的是一款 基于SpringBoot電腦DIY裝機教程網站的設計與實現&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套…

Spring Boot 緩存機制:從原理到實踐

文章目錄 一、引言二、Spring Boot 緩存機制原理2.1 緩存抽象層2.2 緩存注解2.3 緩存管理器 三、入門使用3.1 引入依賴3.2 配置緩存3.3 啟用緩存3.4 使用緩存注解3.5 實體類 四、踩坑記錄4.1 緩存鍵生成問題4.2 緩存過期與更新問題4.3 事務與緩存的一致性問題 五、心得體會5.1 …

Spark讀取Apollo配置

--conf spark.driver.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 --conf spark.executor.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 在spark的提交命令中&…

[逆向工程]如何理解小端序?逆向工程中的字節序陷阱與實戰解析

[逆向工程]如何理解小端序&#xff1f;逆向工程中的字節序陷阱與實戰解析 關鍵詞&#xff1a;逆向工程、小端序、字節序、二進制分析、數據解析 引言&#xff1a;為什么字節序是逆向工程師的必修課&#xff1f; 在逆向工程中&#xff0c;分析二進制數據是最基礎的任務之一。…

項目三 - 任務2:創建筆記本電腦類(一爹多叔)

在本次實戰中&#xff0c;我們通過Java的單根繼承和多接口實現特性&#xff0c;設計了一個筆記本電腦類。首先創建了Computer抽象類&#xff0c;提供計算的抽象方法&#xff0c;模擬電腦的基本功能。接著定義了NetCard和USB兩個接口&#xff0c;分別包含連接網絡和USB設備的抽象…

ElasticSearch深入解析(六):集群核心配置

1.開發模式和生產模式 Elasticsearch默認運行在開發模式下&#xff0c;此模式允許節點在配置存在錯誤時照常啟動&#xff0c;僅將警告信息寫入日志文件。而生產模式則更為嚴格&#xff0c;一旦檢測到配置錯誤&#xff0c;節點將無法啟動&#xff0c;這是一種保障系統穩定性的安…

【Prometheus-MySQL Exporter安裝配置指南,開機自啟】

目錄 1. 創建 MySQL 監控用戶2. 配置 MySQL 認證文件3. 安裝 mysqld_exporter4. 配置 Systemd 服務5. 啟動并驗證服務6. 修改Prometheus配置常見錯誤排查錯誤現象排查步驟 6. 驗證監控數據關鍵注意事項 7. Grafana看板 1. 創建 MySQL 監控用戶 mysql -uroot -p123456 # 登錄M…

redis未授權訪問漏洞學習

一、Redis常見用途 1. Redis介紹 全稱與起源: Redis全稱Remote Dictionary Service(遠程字典服務)&#xff0c;最初由antirez在2009年開發&#xff0c;用于解決網站訪問記錄統計的性能問題。發展歷程: 從最初僅支持列表功能的內存數據庫&#xff0c;經過十余年發展已支持多種…

4.27搭建用戶界面

更新 router下面的index.js添加新的children 先區分一下views文件夾下的不同vue文件&#xff1a; Home.vue是繪制home頁面的所有的表格。 Main.vue是架構頭部和左側目錄的框架的。 研究一下這個routes對象&#xff0c;就可以發現重定向redirect的奧妙所在&#xff0c;我們先把…

【MySQL】(8) 聯合查詢

一、聯合查詢的作用 由于范式的規則&#xff0c;數據分到多個表中&#xff0c;想要查詢完整的信息&#xff0c;就需要聯合查詢多張表。比如查詢學生的學生信息和所在班級的信息&#xff0c;就需要聯合查詢學生表和班級表。 二、聯合查詢過程 案例&#xff1a;查詢學生姓名為孫…

圖漾官網Sample_V1版本C++語言完整參考例子---單相機版本

文章目錄 1.參考例子 主要梳理了圖漾官網Sample_V1版本的例子 1.參考例子 主要增加了從storage區域讀取相機參數的設置&#xff0c;使用圖漾PercipioViewer軟件&#xff0c;如何將相機參數保存到srorage區&#xff0c;可參考鏈接&#xff1a;保存相機參數操作 保存參數設置 注…

關于本地端口啟動問題

如何啟動一個本地端口 1. Node.js (使用Express框架) 使用node.js的方法 注意&#xff1a;下列bash命令最好在管理員權限運行的cmd窗口中進行&#xff0c;否則可能會有權限錯誤 首先&#xff0c;確保您已經安裝了Node.js和npm。然后&#xff0c;創建一個新的Node.js項目并安…

產銷協同的作用是什么?又如何對各部門發揮作用?

目錄 一、產銷協同的對象有哪些&#xff1f; 1. 客戶需求 2. 市場趨勢 3. 供應鏈伙伴 4. 企業戰略目標 二、產銷協同的作用是什么&#xff1f; 1. 提高客戶滿意度 2. 降低企業成本 3. 增強市場競爭力 4. 優化資源配置 三、產銷協同對各部門怎么發揮作用&#xff1f;…

React Router v7 從入門到精通指南

一、設計思想與核心原理 1. 設計哲學 組件即路由&#xff1a;路由以 <Route> 組件形式聲明&#xff0c;與 React 組件樹深度集成聲明式導航&#xff1a;通過 <Link> 和 useNavigate 實現無刷新路由跳轉動態匹配機制&#xff1a;路徑參數、通配符、優先級匹配規則…

Python爬蟲實戰:獲取網yi新聞網財經信息并做數據分析,以供選股做參考

一、引言 在財經領域,股市信息對投資者意義重大。網yi新聞作為知名新聞資訊平臺,其股市板塊蘊含豐富的最新股市熱點信息。然而,依靠傳統人工方式從海量網頁數據中獲取并分析這些信息,效率低下且難以全面覆蓋。因此,利用爬蟲技術自動化抓取相關信息,并結合數據分析和機器…

Spring Boot Actuator - 應用監控與管理

一、 Spring Boot Actuator 概述 Spring Boot Actuator是Spring Boot 提供的生產級監控與管理工具集&#xff0c;用于實時監控和運維管理應用。Actuator 通過HTTP 端點&#xff08;或 JMX 端點&#xff09;暴露應用的健康狀態、性能指標、日志信息、環境配置等關鍵數據&#x…

不同類型插槽的聲明方法和對應的調用方式

在 Vue 3 中&#xff0c;slot 用于讓組件的使用者可以向組件內部插入自定義內容。Vue 3 提供了多種聲明和使用插槽的方式&#xff0c;下面為你詳細介紹不同類型插槽的聲明方法和對應的調用方式。 1. 匿名插槽 聲明方法 在組件模板中直接使用 標簽來定義匿名插槽&#xff0c;它可…

DeepSeek 聯手 Word,開啟辦公開掛模式

目錄 一、DeepSeek 與 Word 結合的神奇之處二、前期準備&#xff0c;萬事俱備2.1 了解 DeepSeek2.2 確認軟件版本2.3 賬號與密鑰獲取 三、接入方法全解析3.1 OfficeAI 插件接入3.1.1 下載與安裝插件3.1.2 配置 API 密鑰 3.2 VBA 宏接入3.2.1 啟用開發者工具3.2.2 調整信任設置3…