MONGODB 讀寫佇列增高與寫延遲與多粒度鎖
這個問題來自於我們內部的一個專案,本身MONGODB 並沒有特別的大,只是偶發有讀寫佇列瞬時增高的情況。在發生這個情況的時候,會出現global lock 同時會出現寫入緩慢的問題。
所以這個問題出現後我發現我對MOGNODB 的鎖真的不瞭解,所以解決問題之前必須弄明白。
首先根據我們的認知,mongodb是一個高速型的資料庫產品,也就是說MONGODB 和傳統資料庫不一樣,如果你的查詢在 500ms 已經可以算為慢查詢了,而在很多傳統資料庫中,這是正常的。那麼一個mongodb中的效能的好壞與mongodb的鎖的百分比有很大的關係。
在不少人的頭腦中,感覺mongodb是一個無事務的資料庫產品,實際上MONGODB 與傳統資料庫在這部分是一致的,具有mvcc,具有多版本控制,以及併發等功能,同時接受成百上千的.
實際上mongodb的鎖也是多粒度的,透過鎖來阻止同一個docuemnt在同一個時間被修改。而在讀取的過程中,是不會對資料進行鎖定的但是會跟蹤你的鎖定的頻率,作為一個指標來對你的資料庫進行跟蹤。而這個鎖定的頻率統計是在兩個層面,database 和 global . 在鎖這個層面上,對於資料庫層,只會對不同的使用者進行加鎖,而不會對在上層進行加鎖。
實際上從mongodb的角度來看,mognodb的本身也將一些在寫庫上的鎖進行了分離,如MONGODB本身的多節點,讀寫分離的方式,讓讀和寫在物理上就進行了分離。所以如果一個利用了MONGODB 的從節點的部分的應用可能在鎖方面產生的問題就比較少了。
如果遇到了鎖定的部分比較多的情況,一般是系統響應的問題,具體可能有效能較差的 mongodb 的查詢或者系統無法滿足當前訴求產生的問題。
1 globalLock
4.4
5.0
2 locks
4.4
5.0
透過上面的兩個命令,可以檢視MONGODB 鎖的部分的資訊和內容,那麼我們怎麼解讀這些指標和資料來對應我們對於MONGODB 的觀測和問題的發現
1 globalLock.currentQueue.total
這個部分主要體現了兩個問題 1併發性,如果系統中併發較多,則這個部分的totoal 會有波動,同時如果有需求等待鎖的情況下,這個位置的數字會上升。
剩下的readers ,writers 兩種是分別表達你的鎖的需求來自於 read 還是 write
2 globalLock.totalTime
這個部分的數值需要和你的實際的伺服器的執行的時間進行比較,如果你的這部分時間和實際的伺服器的執行時間之間差距較大。
4.4
5.0
在4.4的版本中,我們可以透過acquireWaitCount 部分,來獲取等待獲取資源的等待時間,如果在短期這個數值上升的很高,那麼說明系統正在存在大量的系統資源的。
所以撰寫一個程式,在發現問題的情況下,快速的收集資料並將這些資料進行比對,可以快速的發現系統中出現的問題。如果後面我們寫出這樣的程式,也會和大家分享。
同時遇到這個問題,需要綜合的去分析和收集資料,global lock 高的原因還需要更詳細的分析。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2934744/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 高可用延遲佇列設計與實現佇列
- Laravel 延遲佇列Laravel佇列
- redis 延遲佇列Redis佇列
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 多執行緒與併發----讀寫鎖執行緒
- 延遲阻塞佇列 DelayQueue佇列
- hyperf redis延遲佇列Redis佇列
- RabbitMQ實戰《延遲佇列》MQ佇列
- RabbitMQ實現延遲佇列MQ佇列
- RabbitMQ 實現延遲佇列MQ佇列
- [Redis]延遲訊息佇列Redis佇列
- MySQL MyISAM引擎的讀鎖與寫鎖MySql
- MySQL 中讀寫分離資料延遲MySql
- 佇列、資源與鎖佇列
- 如何才能讓Spring Boot與RabbitMQ結合實現延遲佇列Spring BootMQ佇列
- php+redis實現延遲佇列PHPRedis佇列
- 如何用RabbitMQ實現延遲佇列MQ佇列
- Spring Boot(十四)RabbitMQ延遲佇列Spring BootMQ佇列
- RabbitMQ、RocketMQ、Kafka延遲佇列實現MQKafka佇列
- Golang 實現 RabbitMQ 的延遲佇列GolangMQ佇列
- 使用RabbitMq原生實現延遲佇列MQ佇列
- 讀寫鎖 ReentrantReadWriteLock 與 互斥鎖 的效率
- Redis 應用-非同步訊息佇列與延時佇列Redis非同步佇列
- 訊息佇列-一篇讀懂rabbitmq(生命週期,confirm模式,延遲佇列,叢集)佇列MQ模式
- 你知道Redis可以實現延遲佇列嗎?Redis佇列
- 基於Dynomite的分散式延遲佇列MIT分散式佇列
- 如何避免MYSQL主從延遲帶來的讀寫問題?MySql
- Delayed Message 外掛實現 RabbitMQ 延遲佇列MQ佇列
- 【RabbitMQ】一文帶你搞定RabbitMQ延遲佇列MQ佇列
- RabbitMQ 學習筆記 -- 12 死信佇列 DLX + TTL 方式實現延遲佇列MQ筆記佇列
- 延遲繫結與retdlresolve
- 實現無鎖的棧與佇列(4)佇列
- 實現無鎖的棧與佇列(3)佇列
- 實現無鎖的棧與佇列(1)佇列
- 實現無鎖的棧與佇列(2)佇列
- Dyno-queues 分散式延遲佇列 之 輔助功能分散式佇列
- 基於訊息佇列(RabbitMQ)實現延遲任務佇列MQ
- RabbitMQ高階之訊息限流與延時佇列MQ佇列