<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近專案在使用MongoDB作為圖片和檔案的儲存資料庫,為啥不直接存MySQL裡,還要搭個MongoDB叢集,麻不麻煩?
讓我們一起,一探究竟,繼續學習解決MongoDB超大塊資料問題,實現快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。
可以在任何時間新增mongos程序,只要確保,它們的 --configdb
選項指定了正確的設定伺服器副本集,並且使用者端可以立即與其建立連線。
要修改一個分片的成員,需要直接連線到該分片的主節點,並重新設定副本集。叢集設定會檢測到變更並自動更新 config.shards
。
一般情況下,不應該從叢集中刪除分片,會給系統帶來不必要的壓力。
刪除分片時,要確保均衡器的開啟狀態。
均衡器的作用是把要刪除分片上的所有資料移動到其它分片,這個過程稱為排空。可以通過 removeShard
命令執行排空操作。
可以通過 sh.setBalancerState(false)
關閉均衡器。關閉均衡器不會將正在進行的過程停止,也就是說遷移過程不會立即停止。
通過db.locks.find({"_id","balancer"})["state"]
檢視均衡器是否關閉。0表示均衡器已關閉。
均衡過程會增加系統的負載,目標分片必須查詢源分片的所有檔案,並將檔案插入目標分片的塊中,然後源分片必須刪除這些檔案。
資料遷移是很消耗效能的,此時可以在config.settings
集合中為均衡過程指定一個時間視窗。將其指定在一個閒暇時間執行。
如果設定了均衡視窗,應該對其進行監控,確保mongos能夠在所分配的時間內保持叢集的均衡。
均衡器使用塊的數量而不是資料的大小作為度量。移動一個塊被稱為遷移,這是MongoDB平衡資料的方式。可能會存在一個大塊的分片稱為許多小分片遷移的目標。
一個塊可以存放數百萬個檔案,塊越大,遷移到另一個分片所花費的時間就越長,預設情況下,塊的大小為64MB。
但對於64MB的塊,遷移時間太長了,為了加快遷移速度,可以減少塊的大小。
比如將塊的大小改為32MB。
db.settings.save({"_id","chunksize","value":32})
已經存在的塊不會發生改變,自動拆分僅會在插入或更新時發生,拆分操作是無法恢復的,如果增加了塊的大小,那麼已經存在的塊只會通過插入或更新來增長,直到它們達到新的大小。塊大小的取值範圍在1MB到1024MB。
這是一個叢集範圍的設定,會影響所有的集合和資料庫。因此,如果一個集合需要較小的塊,另一個集合需要較大的塊,那麼可能需要在這兩個大小間取一個折中的值。
如果MongoDB的遷移過於頻繁或者使用的檔案太大,則可能需要增加塊的大小。
一個塊的所有資料都位於某個特定的分片上。如果最終這個分片擁有的塊比其它分片多,那麼MongoDB會將一些塊移動到其它分片上。
當一個塊大於 config.settings
中所設定的最大塊大小時,均衡器就不允許移動這個塊了。這些不可拆分、不可移動的塊被稱為超大塊。
要解決超大塊引起的叢集不均衡問題,就必須將超大塊均勻地分配到各個分片中。
sh.setBalancerState(false)
;db.settings.save({"_id","chunksize","value":maxInteger})
;moveChunk
命令移動分片中的超大塊;splitChunk
命令,直到其塊數量與目標分片塊數量大致相同;更改片鍵,使其擁有更細粒度的分片。
通過db.currentOp()
檢視當前操作,``db.currentOp()```最常見的用途是查詢慢操作。
MongoDB Enterprise > db.currentOp() { "inprog" : [ { "type" : "op", "host" : "LAPTOP-P6QEH9UD:27017", "desc" : "conn1", "connectionId" : 1, "client" : "127.0.0.1:50481", "appName" : "MongoDB Shell", "clientMetadata" : { "application" : { "name" : "MongoDB Shell" }, "driver" : { "name" : "MongoDB Internal Client", "version" : "5.0.14" }, "os" : { "type" : "Windows", "name" : "Microsoft Windows 10", "architecture" : "x86_64", "version" : "10.0 (build 19044)" } }, "active" : true, "currentOpTime" : "2023-02-07T23:12:23.086+08:00", "threaded" : true, "opid" : 422, "lsid" : { "id" : UUID("f83e33d1-9966-44a4-87de-817de0d804a3"), "uid" : BinData(0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=") }, "secs_running" : NumberLong(0), "microsecs_running" : NumberLong(182), "op" : "command", "ns" : "admin.$cmd.aggregate", "command" : { "aggregate" : 1, "pipeline" : [ { "$currentOp" : { "allUsers" : true, "idleConnections" : false, "truncateOps" : false } }, { "$match" : { } } ], "cursor" : { }, "lsid" : { "id" : UUID("f83e33d1-9966-44a4-87de-817de0d804a3") }, "$readPreference" : { "mode" : "primaryPreferred" }, "$db" : "admin" }, "numYields" : 0, "locks" : { }, "waitingForLock" : false, "lockStats" : { }, "waitingForFlowControl" : false, "flowControlStats" : { } }, { "type" : "op", "host" : "LAPTOP-P6QEH9UD:27017", "desc" : "Checkpointer", "active" : true, "currentOpTime" : "2023-02-07T23:12:23.086+08:00", "opid" : 3, "op" : "none", "ns" : "", "command" : { }, "numYields" : 0, "locks" : { }, "waitingForLock" : false, "lockStats" : { }, "waitingForFlowControl" : false, "flowControlStats" : { } }, { "type" : "op", "host" : "LAPTOP-P6QEH9UD:27017", "desc" : "JournalFlusher", "active" : true, "currentOpTime" : "2023-02-07T23:12:23.086+08:00", "opid" : 419, "op" : "none", "ns" : "", "command" : { }, "numYields" : 0, "locks" : { }, "waitingForLock" : false, "lockStats" : { }, "waitingForFlowControl" : false, "flowControlStats" : { } } ], "ok" : 1 }
waitingForLock
狀態,則當前操作不會讓出鎖;通過``db.currentOp()找到慢查詢後,可以通過db.killOp(opid)```的方式將其終止。
並不是所有操作都可以被終止,只有當操作讓出時,才能終止,因此,更新、查詢、刪除操作都可以被終止,但持有或等待鎖的操作不能被終止。
如果MongoDB中的請求發生了堆積,那麼這些寫操作將堆積在作業系統的通訊端緩衝區,當終止MongoDB正在執行的寫操作時,MongoDB依舊會處理緩衝區的寫操作。可以通過開啟寫入確認機制,保證每次寫操作都要等前一個寫操作完成後才能執行,而不是僅僅等到前一個寫操作處於資料庫伺服器的緩衝區就開始下一次寫入。
系統分析器可以提供大量關於耗時過長操作的資訊,但系統分析器會嚴重的降低MongoDB的效率,因為每次寫操作都會將其記錄在system.profile
中記錄一下。每次讀操作都必須等待system.profile
寫入完畢才行。
開啟分析器:
MongoDB Enterprise > db.setProfilingLevel(2) { "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
slowms
決定了在紀錄檔中列印慢速操作的閾值。比如slowms
設定為100,那麼每個耗時超過100毫秒的操作都會被記錄在紀錄檔中,即使分析器是關閉的。
查詢分析級別:
MongoDB Enterprise > db.getProfilingLevel() 2
重新啟動MongoDB資料庫會重置分析級別。
通過Object.bsonsize
函數獲取其在磁碟中儲存大小,單位是位元組。
> Object.bsonsize(db.worker.find()) 65194
使用mongotop
統計哪些集合最繁忙。
使用mongotop --locks
統計每個資料庫的鎖資訊。
mongostat
提供了整個伺服器範圍的資訊。
以上就是MongoDB超大塊資料問題解決的詳細內容,更多關於MongoDB超大塊資料的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45