ElasticSearch:不停機更新索引類型(未驗證)

文章目錄

      • **一、前期準備**
        • **1. 集群健康檢查**
        • **2. 備份數據**
        • **3. 監控系統準備**
      • **二、創建新索引并配置**
        • **1. 設計新索引映射**
        • **2. 創建讀寫別名**
      • **三、全量數據遷移**
        • **1. 執行初始 Reindex**
        • **2. 監控 Reindex 進度**
      • **四、增量數據同步**
        • **1. 方案選擇**
      • **五、雙寫切換**
        • **1. 修改應用代碼實現雙寫**
        • **2. 驗證雙寫一致性**
      • **六、流量切換**
        • **1. 只讀流量切換**
        • **2. 驗證查詢結果一致性**
        • **3. 寫入流量切換**
      • **七、收尾工作**
        • **1. 恢復新索引配置**
        • **2. 驗證性能和穩定性**
        • **3. 刪除舊索引(可選)**
      • **八、回滾策略**
      • **九、優化建議**
      • **十、風險控制**

一、前期準備

1. 集群健康檢查
GET /_cluster/health

確保:

  • statusgreen
  • number_of_nodes 符合預期
  • unassigned_shards 為 0
2. 備份數據
# 注冊快照倉庫
PUT /_snapshot/my_backup
{"type": "fs","settings": {"location": "/path/to/snapshots"}
}# 創建全量快照
PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true
3. 監控系統準備
  • 開啟 ES 性能監控(如使用 Elastic APM、Prometheus + Grafana)
  • 設置關鍵指標告警(如集群負載、JVM 內存、磁盤使用率)

二、創建新索引并配置

1. 設計新索引映射
PUT /new_products
{"settings": {"index.number_of_shards": 5,  // 與舊索引保持一致"index.number_of_replicas": 1,"index.refresh_interval": "30s",  // 臨時調大,提升寫入性能"index.translog.durability": "async",  // 臨時使用異步持久化"index.translog.sync_interval": "30s"},"mappings": {"properties": {"id": {"type": "keyword"},"name": {"type": "text"},"price": {"type": "double"},  // 假設原字段為 integer"create_time": {"type": "date", "format": "yyyy-MM-dd HH:mm:ss||epoch_millis"},"tags": {"type": "keyword"}}}
}
2. 創建讀寫別名
POST /_aliases
{"actions": [{ "add": { "alias": "products_read", "index": "old_products" } },{ "add": { "alias": "products_write", "index": "old_products" } }]
}

三、全量數據遷移

1. 執行初始 Reindex
POST /_reindex?wait_for_completion=false
{"source": {"index": "old_products","size": 5000,  // 每次查詢 5000 條"sort": ["_doc"]  // 按文檔順序處理,避免遺漏},"dest": {"index": "new_products","op_type": "create"},"script": {"source": """// 類型轉換邏輯if (ctx._source.containsKey("price")) {ctx._source.price = Double.parseDouble(ctx._source.price.toString());}// 日期格式轉換if (ctx._source.containsKey("create_time")) {try {ctx._source.create_time = new Date(ctx._source.create_time).getTime();} catch (Exception e) {// 處理異常日期格式ctx._source.create_time = System.currentTimeMillis();}}"""}
}
2. 監控 Reindex 進度
GET /_tasks?detailed=true&actions=*reindex

四、增量數據同步

1. 方案選擇
  • 方案 A:基于時間戳的定時同步(適合有 update_time 字段的場景)
POST /_reindex?wait_for_completion=false
{"source": {"index": "old_products","query": {"range": {"update_time": {"gte": "{{last_sync_time}}",  // 上次同步時間"lt": "now"}}}},"dest": {"index": "new_products"}
}
  • 方案 B:基于 Canal 的 binlog 訂閱(適合 ES 作為 MySQL 從庫的場景)
# 部署 Canal 客戶端
canal.deployer-1.1.5/bin/startup.sh# 配置 canal.instance.filter.regex=.*\\..* 監聽全量變更

五、雙寫切換

1. 修改應用代碼實現雙寫

在應用層同時寫入新舊索引:

// 偽代碼示例
public void indexProduct(Product product) {// 寫入舊索引esClient.index("products_write", product);// 寫入新索引(帶類型轉換)Product newProduct = convertProduct(product);esClient.index("new_products", newProduct);
}
2. 驗證雙寫一致性
// 對比同一文檔在新舊索引中的差異
GET old_products/_doc/1
GET new_products/_doc/1

六、流量切換

1. 只讀流量切換
POST /_aliases
{"actions": [{ "remove": { "alias": "products_read", "index": "old_products" } },{ "add": { "alias": "products_read", "index": "new_products" } }]
}
2. 驗證查詢結果一致性
// 對比相同查詢在新舊索引中的結果
GET products_read/_search?q=name:iphone
GET old_products/_search?q=name:iphone
3. 寫入流量切換
POST /_aliases
{"actions": [{ "remove": { "alias": "products_write", "index": "old_products" } },{ "add": { "alias": "products_write", "index": "new_products" } }]
}

七、收尾工作

1. 恢復新索引配置
PUT /new_products/_settings
{"index.refresh_interval": "1s","index.translog.durability": "request","index.translog.sync_interval": "5s"
}
2. 驗證性能和穩定性
  • 監控集群負載
  • 驗證業務查詢性能
  • 驗證寫入吞吐量
3. 刪除舊索引(可選)
DELETE /old_products

八、回滾策略

若出現問題,可快速回滾:

POST /_aliases
{"actions": [{ "remove": { "alias": "products_read", "index": "new_products" } },{ "add": { "alias": "products_read", "index": "old_products" } },{ "remove": { "alias": "products_write", "index": "new_products" } },{ "add": { "alias": "products_write", "index": "old_products" } }]
}

九、優化建議

  1. 分批次遷移:對百萬級數據,按時間或 ID 范圍分批 Reindex,避免單次任務過大
  2. 限流控制
POST /_reindex?wait_for_completion=false
{"source": { "index": "old_products" },"dest": { "index": "new_products" },"requests_per_second": 100  // 每秒處理 100 個請求
}
  1. 臨時擴容:遷移期間增加專用協調節點,減輕數據節點壓力
  2. 預熱緩存:遷移后對熱點數據執行預熱查詢
  3. 自動化腳本:使用 Python 腳本編排整個流程:
import requests
import timedef reindex_with_progress():# 啟動 reindexresponse = requests.post("http://localhost:9200/_reindex?wait_for_completion=false",json={"source": {"index": "old_products"},"dest": {"index": "new_products"}})task_id = response.json()["task"]# 監控進度while True:status = requests.get(f"http://localhost:9200/_tasks/{task_id}").json()completed = status["task"]["status"]["completed"]total = status["task"]["status"]["total"]print(f"進度: {completed}/{total} ({completed/total*100:.2f}%)")if status["completed"]:breaktime.sleep(5)reindex_with_progress()

十、風險控制

  1. 灰度發布:先遷移部分數據進行驗證
  2. 熔斷機制:設置錯誤率閾值,超過則自動停止遷移
  3. 預留資源:確保集群有 30% 以上的空閑資源
  4. 夜間執行:選擇業務低峰期執行核心操作

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

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

相關文章

python學智能算法(二十七)|SVM-拉格朗日函數求解上

【1】引言 前序學習進程中,我們已經掌握了支持向量機算法中,為尋找最佳分割超平面,如何用向量表達超平面方程,如何為超平面方程建立拉格朗日函數。 本篇文章的學習目標是:求解SVM拉格朗日函數。 【2】求解方法 【2.…

mac安裝node的步驟

適用于macOS 10.15及以上版本。 前提條件 macOS版本:確保系統為macOS 10.15(Catalina)或更高版本。可在“蘋果菜單 > 關于本機”查看。管理員權限:部分安裝可能需要管理員權限。網絡連接:需要聯網下載安裝包或工具…

【LeetCode數據結構】棧的應用——有效的括號問題詳解

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 🍉學習方向:C/C方向 ??人生格言:為天地立心,為生民立命,為…

多尺度卷積模型:Inception塊

在GoogLeNet中,基本的卷積塊被稱為Inception塊(Inception block)。 使用窗口大小為11,33,551\times1,3\times3,5\times511,33,55的卷積層,從不同空間大小中提…

Android 默認圖庫播放視頻沒有自動循環功能,如何添加

Android 默認圖庫播放視頻沒有自動循環功能, 如何添加 按如下方式添加 開發云 - 一站式云服務平臺 .../apps/Gallery2/res/values-zh-rCN/strings.xml | 3 ++ packages/apps/Gallery2/res/values/strings.xml | 3 ++ .../com/android/gallery3d/app/MovieActivity…

7月21日總結

命令執行 RCE RCE(remote code execute):遠程命令執行或者代碼執行,我們平時說的rce,比如thinkPHP的 rce漏洞,即算代碼注入漏洞,也算rce漏洞,因為滲透的最終情況可以實現執行命令或…

Linux——自制shell命令行解釋器

文章目錄1.打印命令提示符2.獲取用戶輸入指令3.重定向分析4.命令行參數表,環境變量表,初始化5.命令解析6.命令執行6.1.創建子進程6.2 處理內建命令6.3 文件重定向7.源碼前言 在實現shell的時候我們先創建自己myshell目錄,在目錄中創建myshell.cc文件,因…

Boost庫智能指針boost::shared_ptr詳解和常用場景使用錯誤示例以及解決方法

1、Boost智能指針 —— boost::shared_ptr 詳解一、什么是 boost::shared_ptr boost::shared_ptr 是 Boost 庫中實現的一個智能指針模板類,用于管理動態分配的對象生命周期,采用引用計數機制。多個 shared_ptr 實例可以共享同一個對象的所有權&#xff0…

科學分析指南,如何快速找到并清理磁盤的無用文件

隨著時間的推移,系統中會積累大量的臨時文件、緩存文件、不再需要的安裝包或其他大型文件。磁盤清理可以刪除這些不必要的文件,從而釋放寶貴的磁盤空間。它無需安裝,插上 U 盤就能直接使用。只需勾選需要掃描的磁盤,點擊“開始分析…

Laravel 系統版本查看及artisan管理員密碼找回方法針對各個版本通用方法及原理-優雅草卓伊凡

Laravel 系統版本查看及artisan管理員密碼找回方法針對各個版本通用方法及原理-優雅草卓伊凡一、查看 Laravel 版本的方法優雅草蜻蜓T會議系統專業版 最近又有客戶要了,但是發現 密碼不對 管理員賬戶密碼不對,卓伊凡必須處理下,這里順便講解密…

針對大規模語言模型的上下文工程技術調研與總結(翻譯并摘要)

針對大規模語言模型的上下文工程技術調研與總結聲明摘要部分翻譯介紹部分翻譯相關工作部分翻譯并摘要為什么使用上下文工程(翻譯并摘要)基礎組件(翻譯并摘要)RAG(翻譯并摘要簡單介紹一下個人認為比較好的技術&#xff…

QT配置Quazip外部庫

1.下載QuaZip源碼網址:https://sourceforge.net/projects/quazip/  注:下載->解壓->打開.pro文件2.編譯QuaZip源碼2.1配置zlib注:QuaZip需zlib的支持,我們需要引用zlib找到本地安裝Qt目錄下zlib目錄:注&#x…

從C++開始的編程生活(4)——類的定義、訪問限定符、類域、類的實例化和this指針

前言 本系列文章承接C語言的學習,需要有C語言的基礎才能學會哦~ 第3篇主要講的是有關于C的類的定義、訪問限定符、類域、類的實例化和this指針。 C才起步,都很簡單呢! 目錄 前言 類 基本語法 訪問限定符 基本語法 類域 類的實例化 內…

AD域控制器虛擬化的安全加固最佳實踐

以下是AD域控制器虛擬化安全加固的7項核心實踐,結合最新Windows Server 2022特性與虛擬化環境需求:基礎架構強化? 采用靜態IP分配并確保所有域控節點DNS指向主DC(如192.168.1.10)? 虛擬機模板需預配置林/域功能級別為Windows Se…

java解析nc氣象數據

1.1pom.xml<dependency><groupId>edu.ucar</groupId><artifactId>netcdfAll</artifactId><version>5.4.1</version></dependency>1.2 netcdf使用/** param type 0 ,1, 2 wind 1 or 2 其他 0 .* return Map* */public Map i…

STC8H8K64U SKDIP28芯片頻率占空比PWM波形

/****PWM輸出任意周期占空比波形*******/ #include "STC8H.h" // #include "intrins.h" // #define uchar unsigned char // #define uint unsig…

【RK3576】【Android14】USB開發調試

獲取更多相關的【RK3576】【Android14】驅動開發&#xff0c;可收藏系列博文&#xff0c;持續更新中&#xff1a; 【RK3576】Android 14 驅動開發實戰指南 硬件接口 RK3576支持兩個USB3.0控制器 驅動開發 dts配置 在“Android14/kernel-6.1/arch/arm64/boot/dts/rockchip/rk…

20. TaskExecutor與ResourceManager心跳

20. TaskExecutor與ResourceManager心跳 現在&#xff0c;需要回過頭看 ResourceManager是如何產生心跳管理服務的。cluster.initializeServices 方法的 heartbeatServices createHeartbeatServices(configuration);產生一個 HeartbeatServicesImpljobmanager的 resourceManag…

OS19.【Linux】進程狀態(上)

目錄 1.情景引入 2.操作系統學科對進程狀態的分類 運行狀態 基于時間片的輪轉調度算法 阻塞狀態 等待IO設備的例子 等待其他進程中需要獲取的數據 進程喚醒 掛起狀態(全稱為阻塞掛起狀態) 簡單談談虛擬內存管理 就緒狀態 筆面試題 3.Linux對進程狀態的分類 R和S狀…

如何優雅地修改項目的 Android 版本(API 級別)

引言 在 Android 開發的日常迭代中&#xff0c;我們經常需要升級或降級項目的 minSdkVersion、targetSdkVersion 與 compileSdkVersion。升級可以解鎖新特性和性能優化&#xff1b;降級則可能為了兼容舊機型或快速驗證問題。本文將手把手演示在 Android Studio 里修改 Android …