在數(shù)據(jù)庫的日常運維和性能優(yōu)化中,數(shù)據(jù)庫表數(shù)據(jù)的生命周期管理是一個常見且重要的工作場景。在oracle數(shù)據(jù)庫中,數(shù)據(jù)生命周期管理包括歷史分區(qū)的truncate、壓縮、分區(qū)遷移分級存儲管理以及delete等方案。而在mongodb中,沒有表分區(qū)的概念,在分片中,要考慮業(yè)務均勻分布在所有數(shù)據(jù)片中,但是由于時間字段單調(diào)遞增的特性,所以基本不會考慮將時間字段作為獨立片鍵。同時,Mongodb的WiredTiger存儲引擎默認采用snappy壓縮算法,在我們的生產(chǎn)系統(tǒng)上,壓縮比例大概在3:1,如果采用zlib算法,壓縮比例可達10:1以上(會增大CPU開銷),所以在一般情況下,mongodb的數(shù)據(jù)生命周期管理也不會使用手動壓縮方式,如果要建設歷史歸檔庫,可考慮使用zlib算法進行壓縮。Mongodb的數(shù)據(jù)生命周期管理可利用自身的功能特性實現(xiàn),下面將對幾種數(shù)據(jù)清理方案進行描述。
TTL(timetolive)索引是MongoDB中一種特殊的索引,是一種在除_id外的時間字段上創(chuàng)建的單列索引(復合索引無法擁有TTL屬性)。在創(chuàng)建TTL索引后,后臺線程將根據(jù)字段值再指定的秒數(shù)后自動刪除數(shù)據(jù)。如:
db.Record.createIndex({"timestamp":1},{ expireAfterSeconds:2678400 , background:true});
表示根據(jù)timestamp字段時間的31天后過期刪除數(shù)據(jù)。
如果字段值是一個數(shù)組,則以數(shù)組的最小時間為準。如果要修改TTL索引的數(shù)據(jù)過期時間,無需重建索引,可通過如下命令修改:
db.runCommand({ collMod: "test", --集合名稱
index:{ name: "lastModifiedDate_1", --索引名稱
expireAfterSeconds:60 --過期時間
}})
注意在復制集架構中,如果集合數(shù)據(jù)量較大,并且修改減少數(shù)據(jù)保留時間,命令執(zhí)行完成后,后臺線程會緩慢刪除數(shù)據(jù),此過程中會產(chǎn)生大量的oplog,需關注系統(tǒng)配置的oplogsize,確保有足夠的空間存放Oplog,以便于在存在延遲從節(jié)點或者從節(jié)點IO性能較差的情況下,不至于出現(xiàn)主節(jié)點的oplog被覆蓋丟失從而引起同步異常的情況。并且在大量數(shù)據(jù)被刪除后,會出現(xiàn)集合碎片,類似oracle的高水位,空間再集合中可重用,但是不會釋放給操作系統(tǒng),需進行compact操作,此操作可導致庫級鎖,可以在進行主從切換的情況下,滾動在從節(jié)點操作。
capped集合是mongodb中的一種特殊的集合,其大小是固定的,數(shù)據(jù)寫入是有序的,當存儲的數(shù)據(jù)超過大小限制時,將采取先入先出的原則,自動清理舊數(shù)據(jù)。在限制集合大小的同時,capped集合還可以限制文檔數(shù)量,當存儲數(shù)據(jù)未達到文檔數(shù)量限制但是達到大小限制,也會自動清理數(shù)據(jù)。oplog.rs就是一個固定集合。由于capped集合的大小是固定的,數(shù)據(jù)是有序的,所以其插入和查詢的性能都優(yōu)于普通集合。
示例:
db.createCollection("log", { capped: true, size: 10737418240 } ) --創(chuàng)建10GB的固定集合
db.createCollection("log",{ capped : true, size : 10737418240, max : 50000000 } ) --創(chuàng)建最大10GB,且不超過5千萬行的固定集合。注意:固定集合無法手工刪除數(shù)據(jù),且無法進行分片。
在一個集合中,若存在時間字段時,可通過時間字段定位并刪除歷史數(shù)據(jù),但是如果沒有時間字段,怎么定位歷史數(shù)據(jù)呢?在mongodb中,每個集合會默認創(chuàng)建一個_id字段,并且該字段上默認創(chuàng)建了主鍵索引,該字段類型為ObjectId。ObjectId是一個12字節(jié)的BSON類型字符串。按照字節(jié)順序,依次代表:
4字節(jié):UNIX時間戳
3字節(jié):表示運行MongoDB的機器
2字節(jié):表示生成此_id的進程
3字節(jié):由一個隨機數(shù)開始的計數(shù)器生成的值
通過js代碼將時間值轉換為objectid,按時間范圍清理歷史數(shù)據(jù)。利用objectid的有序性和唯一索引過濾,快速清理目標數(shù)據(jù),避免清理條件字段無索引時產(chǎn)生低效的全表掃描。
詳細方法如下:
1.獲取時間條件時間范圍轉換為objectid
ObjectId(Math.floor((new Date(2019/8/9))/1000).toString(16) + "0000000000000000") ObjectId("5b6b13800000000000000000") |
2.將轉換后的時間與objectid比較,按照objectid刪除
var objIdMin = ObjectId(Math.floor((new Date(2019/8/9))/1000).toString(16) + "0000000000000000") var objIdMax = ObjectId(Math.floor((new Date(2018/9/11))/1000).toString(16) + "0000000000000000") db.test.remove({_id:{$gt: objIdMin, $lt: objIdMax}}) |
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/130178.html
摘要:是以的形式來創(chuàng)建的組件的,是目前極為推薦的創(chuàng)建有狀態(tài)組件的方式,最終會取代形式相對于可以更好實現(xiàn)代碼復用。當然,有三種手動綁定方法可以在構造函數(shù)中完成綁定,也可以在調(diào)用時使用來完成綁定,還可以使用來綁定。 React推出后,出于不同的原因先后出現(xiàn)三種定義react組件的方式,殊途同歸;具體的三種方式: 函數(shù)式定義的無狀態(tài)組件 es5原生方式React.createClass定義的組件...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:的三種工作模式服務器目前一共有三種穩(wěn)定的,多進程處理模塊模式。模式下所能同時處理的請求總數(shù)是由子進程總數(shù)乘以值決定的,應該大于等于。默認最大的子進程總數(shù)是,加大時也需要顯式聲明最大值是。 Apache 的三種工作模式(Prefork、Worker、Event) Web服務器Apache目前一共有三種穩(wěn)定的MPM(Multi-Processing Module,多進程處理模塊)模式。 它...
閱讀 1356·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3671·2023-01-11 13:20