ES數據過多,索引拆分

公司企微聊天數據存儲在 ES 中,雖然按照企業分儲在不同的ES 索引中,但某些常用的企微主體使用量還是很大。4年中一個索引存儲數據已經達到46多億條數據,占用存儲3.1tb,
在這里插入圖片描述

ES 配置在這里插入圖片描述

由于多一個副本,存儲得翻倍,成本考慮,所以沒有設置副本分片(不建議你們這么做)

索引拆分后,只需要修改插入時的代碼邏輯,設置好別名后,查詢代碼是不需要改動的

進入主題,拆分索引 ,數據按年進行拆分

1.設置索引模板

PUT _template/chat_message_template
{"index_patterns": ["chat-message-*"],"settings": {"number_of_shards": 15,  // 這里和集群的節點對應,需要是節點的整數倍"number_of_replicas": 0,  // 分片副本,生產環境最好設置>=1"refresh_interval": "20s","codec": "best_compression","max_result_window": "100000000"},"mappings": {"properties": {"msg_id": {"type": "keyword"},"msg_time": {"type": "long"},"msg_type": {"type": "keyword"},"text": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart","term_vector": "with_positions_offsets"},"image": {"type": "text"},.........}}
}

2.根據模板新建索引

PUT chat-message-2021

3.reindex 到新索引

!!重要!!

# reindex 前查看磁盤是否夠用,索引切分后,占用磁盤大小比一個索引大了一些
# 盡量多留一些空間給新索引 , 擴容前磁盤占用40%左右是個不錯的選擇,請提前進行擴容
# 我們遇到了空間不夠用的情況,后擴容,雖然說是滾動擴容,客服說任務可能會取消,但擴容后任務還在,所以盡量提前把空間擴容好
# 查看各節點的分片數量及磁盤使用
GET /_cat/nodes?v&h=name,shards,disk.used_percent
# 結果 
name                              disk.used_percent
es-cn-**-data-g4-3             86.12
es-cn-**-data-g4-2             81.75
es-cn-**-data-g4-0             85.94
es-cn-**-data-g4-4             85.73
es-cn-**-data-g4-1             85.67

reindex命令

?# 限流保護?:添加?requests_per_second=1000參數避免集群過載?
# 異步執行,會直接返回 taskId:   wait_for_completion
# 執行完后,修改以下 msg_time 再執行,可以并行遷移每年的數據POST _reindex?requests_per_second=1000&wait_for_completion=false
{"conflicts": "proceed",  // 默認情況下,當發生version conflict的時候,_reindex會被abort。解決方案設置為“proceed”:"source": {"index": "chat-message-0613","size":5000,"query": {"range": {"msg_time": {"gte": 1609430400000,"lt": 1610380800111}}}},"dest": {"index": "chat-message-2021","op_type": "create" // 把op_type設置為create,_reindex API,只在dest index中添加不不存在的doucments。如果相同的documents已經存在,則會報version confilct的錯誤。}
}

4.查看進度

GET _tasks?detailed=true&actions=*reindex
# 返回結果 
{"nodes" : {"z5VL_HJ2Qn****AMQ" : {"name" : "es-cn-**-data-g4-3","transport_address" : "121.**.114.80:9300","host" : "121.**.114.80","ip" : "121.**.114.80:9300","roles" : ["data","ingest","master","ml","remote_cluster_client","transform"],"attributes" : {"zone_id" : "cn-shanghai-g","ml.machine_memory" : "64887980032","ml.max_open_jobs" : "20","xpack.installed" : "true","zone" : "cn-shanghai-g","transform.node" : "true"},"tasks" : {"z5VL_HJ2Qn****YhoAMQ:6597302" : {"node" : "z5VL_HJ2Qn****YhoAMQ","id" : 6597302,"type" : "transport","action" : "indices:data/write/reindex","status" : {"total" : 484234,"updated" : 0,"created" : 0,"deleted" : 0,"batches" : 11,"version_conflicts" : 55000,"noops" : 0,"retries" : {"bulk" : 0,"search" : 0},"throttled_millis" : 99999,"requests_per_second" : 1000.0,"throttled_until_millis" : 2410},"description" : "reindex from [chat-message-0613] to [chat-message-2021][_doc]","start_time_in_millis" : 1742189556123,"running_time_in_nanos" : 109710051531,"cancellable" : true,"headers" : {"trace_id" : "ywiWopUBbHoVT9Iz8TeX"}}}}}
}

5.查看文檔數量是否相同

把數據和 kibana 中索引文檔數據比對即可
例:查看2021年的數據量
GET chat-message-0613/_count
{"query": {"range": {"msg_time": {"gte": 1609459200000,"lt": 1640966400000}}}
}
# 數量對的上的話,可以把老索引給刪除了,釋放磁盤,在 kibana 中操作即可

6.修改別名

先刪除之前的別名,把老的別名放到新建的索引上
POST _aliases
{"actions" : [{"remove" : {"index" : "chat-message-0613" , "alias" : "chat-message"}},{"add" : {"index" : "chat-message-2021" , "alias" : "chat-message"}},{"add" : {"index" : "chat-message-2022" , "alias" : "chat-message"}},{"add" : {"index" : "chat-message-2023" , "alias" : "chat-message"}},{"add" : {"index" : "chat-message-2024" , "alias" : "chat-message"}},{"add" : {"index" : "chat-message-2025" , "alias" : "chat-message"}}]
}
修改別名后,ES 查詢部分不用修改

取消reindex命令

POST _tasks/z5VL_HJ2Qn****YhoAMQ:6597302/_cancel

插入文檔數據的部分邏輯代碼

func (s *ElasticService) CreateIndex(index, alias, mapping string) (err error) {// 判斷索引是否存在exists, err := sys.Elastic().IndexExists(index).Do(context.Background())if err != nil {sys.Log().Error(sys.NewProjectErr(1000401).Error() + index)return}if exists {// 加鎖,說明此索引已經存在_, _ = model.Factory.Lock.AddLock(model.LockSync, "mapping:ext:"+index, 370*24*3600)return}defer func() {model.Factory.Lock.UnLocK(model.LockSync, "mapping:create:"+index)}()// 多線程創建防止出錯,加鎖ok, err := model.Factory.Lock.AddLock(model.LockSync, "mapping:create:"+index, 120)if err != nil {return}if !ok {err = errors.New("未搶占到鎖")return}// 創建indexcreateIndex, err := sys.Elastic().CreateIndex(index).Body(mapping).Do(context.Background())if err != nil {sys.Log().Error(sys.NewProjectErr(1000401).Error() + index)return}if !createIndex.Acknowledged {// Not acknowledgedsys.Log().Error(sys.NewProjectErr(1000401).Error() + index)return}// 創建aliasputAlias, err := sys.Elastic().Alias().Add(index, alias).Do(context.Background())if err != nil {sys.Log().Error(sys.NewProjectErr(1000402).Error() + alias)return}// 可選:檢查別名操作是否被集群確認(按需添加)if !putAlias.Acknowledged {sys.Log().Error("Alias creation not acknowledged: " + alias)return}return
}// 數據按年切分后請求此方法
func (s *ElasticService) Bulk(index, alias string, chatMsg []model.ChatMessage) (bulkResponseItem []*elastic.BulkResponseItem, err error) {tryTime := 0
CreateIndex:// 分布鎖ok, err := model.Factory.Lock.ExistLock(model.LockSync, "mapping:ext:"+index)if err != nil {return}if !ok {errCreate := s.CreateIndex(index, alias, ChatMessageMapping)if errCreate != nil {if tryTime < 10 {tryTime++time.Sleep(time.Second)goto CreateIndex} else {err = errCreatereturn}}}bulkRequest := sys.Elastic().Bulk().........}

最后

整個遷移非常費時間。 讓grok 幫我算了下(ps. 同樣的提問,國內大模型都沒算出來 ,還是MASK的強啊)
在這里插入圖片描述

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

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

相關文章

存儲服務器是指什么

今天小編主要來為大家介紹存儲服務器主要是指什么&#xff0c;存儲服務器與傳統的物理服務器和云服務器是不同的&#xff0c;其是為了特定的目標所設計的&#xff0c;在硬件配置方式上也有著一定的區別&#xff0c;存儲空間會根據需求的不同而改變。 存儲服務器中一般會配備大容…

golang不使用鎖的情況下,對slice執行并發寫操作,是否會有并發問題呢?

背景 并發問題最簡單的解決方案加個鎖,但是,加鎖就會有資源爭用,提高并發能力其中的一個優化方向就是減少鎖的使用。 我在之前的這篇文章《開啟多個協程,并行對struct中的每個元素操作,是否會引起并發問題?》中討論過多協程場景下struct的并發問題。 Go語言中的slice在…

Java知識整理round1

一、常見集合篇 1. 為什么數組索引從0開始呢&#xff1f;假如從1開始不行咩 數組&#xff08;Array&#xff09;&#xff1a;一種用連續的內存空間存儲相同數據類型數據的線性數據結構 &#xff08;1&#xff09;在根據數組索引獲取元素的時候&#xff0c;會用索引和尋址公式…

【C++指針】搭建起程序與內存深度交互的橋梁(下)

&#x1f525;&#x1f525; 個人主頁 點擊&#x1f525;&#x1f525; 每文一詩 &#x1f4aa;&#x1f3fc; 往者不可諫&#xff0c;來者猶可追——《論語微子篇》 譯文&#xff1a;過去的事情已經無法挽回&#xff0c;未來的歲月還可以迎頭趕上。 目錄 C內存模型 new與…

JavaScript創建對象的多種方式

在JavaScript中&#xff0c;創建對象有多種方式&#xff0c;每種方式都有其優缺點。本文將介紹四種常見的對象創建模式&#xff1a;工廠模式、構造函數模式、原型模式和組合模式&#xff0c;并分析它們的特點以及如何優化。 1. 工廠模式 工廠模式是一種簡單的對象創建方式&am…

muduo庫的思路梳理

前言 對于muduo庫源碼的剖析我發現還是有些混亂的&#xff0c;所以這里再次梳理一下muduo網絡庫爭取可以簡單明了 首先對于muduo庫來說&#xff0c;不能想的得太過于復雜&#xff0c;它無非就是一個線程池加上epoll組成的網絡庫 這里我們從用的角度出發理解muoduo網絡庫 #inc…

Keil5 安裝全攻略

Keil5 安裝全攻略 Keil5 是一款廣泛用于嵌入式開發的 IDE&#xff0c;支持多種微控制器架構&#xff08;如 ARM、C51&#xff09;。本文將詳細介紹 Keil5 的安裝步驟、常見問題及解決方法&#xff0c;幫助您快速上手。 1. 安裝前的準備工作 (1) 系統要求 操作系統&#xff1…

C語言do...while語句將數字反轉后輸出

一、題目引入 輸入一個數字,將各位數字反轉后輸出? 參考代碼: 二、分析代碼 接著圖片中的分析 第一 ->a 的值變為12 第二 ->進入while循環條件,a為12不等于0循環才停止(a的值為12,顯然不等于0) 所以繼續進行循環 第三 ->此時b的值為12取各位上的數字(即2) 打印…

優選算法系列(前綴和 _下) k

目錄 五&#xff1a;和為 k 的子數組&#xff08;medium&#xff09; 題目鏈接&#xff1a;560. 和為 K 的子數組 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 代碼&#xff1a; 六&#xff1a;和可被 K 整除的子數組&#xff08;medium&#xff09; 題目鏈…

mac m3 pro 部署 stable diffusion webui

什么是Stable Diffusion WebUI &#xff1f; Stable Diffusion WebUI 是一個基于Stable Diffusion模型開發的圖形用戶界面&#xff08;GUI&#xff09;工具。通過這個工具&#xff0c;我們可以很方便的基于提示詞&#xff0c;描述一段文本來指導模型生成相應的圖像。相比較通過…

OpenCV圖像拼接(6)根據權重圖對源圖像進行歸一化處理函數normalizeUsingWeightMap()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::normalizeUsingWeightMap 是 OpenCV 中用于圖像拼接細節處理的一個函數。它根據權重圖對源圖像進行歸一化處理&#xff0c;通常用于…

23種設計模式-外觀(Facade)設計模式

外觀設計模式 &#x1f6a9;什么是外觀設計模式&#xff1f;&#x1f6a9;外觀設計模式的特點&#x1f6a9;外觀設計模式的結構&#x1f6a9;外觀設計模式的優缺點&#x1f6a9;外觀設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是外觀設計模式…

capl語言基礎語法(二)

1.strncpy&#xff1a;將字符串復制到另一個字符串中。 輸入&#xff1a; dest 是目標字符串。 src 是源字符串。 n 是要復制的最大字符數。 語法&#xff1a; char *strncpy(char *dest, const char *src, size_t n); 例子&#xff1a; strncpy(gStringRep,"",…

QLoRA和LoRA 微調

QLoRA 其實是一種結合了量化和 LoRA 微調技術的統一方法&#xff0c;而不是同時使用兩種不同的微調方式。換句話說&#xff0c;QLoRA 的意思就是&#xff1a;先把大模型的主權重用低精度&#xff08;例如 4-bit&#xff09;量化&#xff0c;從而大幅減少存儲需求&#xff1b;然…

Qt Concurrent 并發 Map 和 Map-Reduce

并發 Map 和 Map-Reduce QtConcurrent::map()會對容器中的每個項目應用一個函數&#xff0c;對項目進行就地修改。QtConcurrent::mapped() 類似于 map()&#xff0c;但它返回的是一個包含修改內容的新容器。QtConcurrent::mappedReduced() 類似于 mapped()&#xff0c;只不過修…

RT-Thread-線程管理

一、線程管理 RT_Thread線程管理主要是實現線程管理和調度&#xff0c;線程分為用戶線程和系統線程。RT_Thread的線程調度器是搶占式的&#xff0c;尋找就緒狀態最高優先級線程。 線程管理的API函數 創建線程函數 rt_thread_t rt_thread_create( const char *name, //線程名稱 …

【CC2530 教程 十二】CC2530 Z-Stack 硬件抽象層

目錄 一、硬件抽象層簡介&#xff1a; &#xff08;1&#xff09;HAL 硬件抽象層是什么&#xff1f; &#xff08;2&#xff09;通俗易懂的解釋&#xff1a; &#xff08;3&#xff09;具體例子&#xff1a; 二、硬件抽象層HAL&#xff1a; &#xff08;1&#xff09;HAL…

Linux如何判斷磁盤是否已分區?

在 Linux 系統中&#xff0c;判斷磁盤是否已分區可通過以下方法實現&#xff1a; 方法 1&#xff1a;使用 fdisk -l 命令 此命令會列出所有磁盤及其分區的詳細信息&#xff1a; sudo fdisk -l輸出解讀&#xff1a; 若磁盤&#xff08;如 /dev/sdb&#xff09;下有類似 /dev/…

《熔化焊接與熱切割作業》考試注意事項

考試前的準備 攜帶必要的證件和材料&#xff1a;考生需攜帶身份證、準考證等有效證件&#xff0c;以及考試所需的焊接工具、材料等。確保證件齊全&#xff0c;避免因證件問題影響考試。 提前檢查焊接設備和工具&#xff1a;在考試前&#xff0c;考生應仔細檢查焊接設備和工具是…

Matlab Hessian矩陣計算(LoG算子)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 圖像的Hessian矩陣用于描述圖像灰度值的二階導數,可以用來分析圖像的局部曲率和變化。例如,在圖像邊緣檢測、特征點檢測等任務中,Hessian矩陣能幫助我們識別圖像的結構。 Hessian矩陣定義 對于二維圖像,Hessian…