MONGODB 監控 那些基本 「點」 到東拉西扯 (一)

  • 2020 年 3 月 31 日
  • 筆記

最近老有一些文字,寫 MONGODB 不安全,漏洞,損失之類的文章,點進去看,原來就是沒有設置 MONGODB 最基本的 安全驗證,俗稱用戶名密碼,你放那個資料庫,都不安全,這樣博人眼球的文字,我比較「反感」,因為有些 「高層人士」,會一遍遍的問,這個MONGODB 安全嗎,最近看經常有說MONGODB 不安全,有漏洞的,所以,請寫這樣文字的人,有點公德心,好好的一個MongoDB 要上線被高層叫停,你是何等心情。

話歸正題,MOGNODB 的確是很「皮實」的一個資料庫,(要不都是雷神做封面)。但MONGODB 在「耐X」你也得監控他不是,要不你使用過度出了差錯那就很難搞了。

其實從監控資料庫的角度來看大體的監控點都是趨於一致的,然後就是根據每種資料庫的細枝末節來進行,區別化對待。

一般那MONGODB 怎麼來從裡到外的監控,下面就來 TALK 一下

1 使用mongodb 很少有單機來搞,複製集是標配,所以複製集的滯後就是一個點,複製延遲是指將數據從主節點複製到輔助節點的延遲。這當然的被監控。

2 複製狀態,mongodb的主副本是隨時因為某些因素切換的,所以副本狀態跟蹤輔助節點是否死亡以及是否有新主節點的選擇的方法。

3 鎖定狀態的統計,鎖定狀態顯示設置了哪些數據鎖,以及它們的存在時間長度。

4 記憶體使用情況,相對於其他的資料庫mongodbd的記憶體使用量更值得關注。

5 資料庫的連接數

6 資料庫的磁碟的使用率與程度。

7 語句慢查詢

以上的內容不少,所以mongodb的監控應該是一個連續劇,今天就用 replication slave lag 來開刀

要看複製延遲那一定都要使用,rs.printSlaveReplicationInfo(), 這個命令,這個命令本身是可以在複製集中任何的節點中運行的,這個地球人都知道。

但這裡有一個問題,就是在主節點一段時間沒有任何操作的過程中,再次操作,此時如果執行了 rs.printSlaveReplicationinfo 會顯示負值,主要的原因他會接受來自primary節點之前的心跳來對比現在的optime 則會在很短的時間又顯示負數的可能,負數的大小與主庫有多長時間不活動有關。

所以這裡建議的是,在主庫運行rs.printSlaveReplicationinfo命令。

以上的建議在最新的mongodb 的版本依然有效。

而rs.printReplicationInfo(), 是另一個針對複製有關的命令,這個命令可以觀察你本地的oplog的size以及你的oplog 還可以接受多長時間的數據,first 和 last event 的時間是多少等等,資訊。

需要提到的MONGODB 3.4 以及以前的版本,是不能隨便改動 oplog的,這其實不是好事,就如同 MYSQL 不能隨便變動 innodb_buffer_pool_size 在MYSQL 運行的時候,並且改動很麻煩。

所以如果還在使用MONGODB 3.4 之前的版本,還是很有必要升級到更新的版本。

至於其他的點,後面會繼續,下面是一些常用,或可能你不知道的MONGODB 的簡單的監控工具。

1 最常用的監控程式就是MOGNODB 自提供的 mongostat 通過 mongostat 可以查看 insert query update delete 等操作的類型並且mongostat 是可以對 mongod 和 mongos 提取監控的數據的。

同時為了保證數據的安裝 mongostat 也是需要輸入用戶名和密碼的並且你提供的用戶需要 clusterMonitor 的許可權。

通過這個基本的監控,我們可以掌握,例如某些故障時刻或資料庫不正常時刻的 insert query,update delete 的數據量,看看有什麼異常,同時也可以看到 dirty 看看臟頁是否過多,系統的資源是否有異常。

insert:每秒插入數

query:每秒查詢數

update:每秒更新數

delete:每秒刪除數

getmore:每秒返回的游標數

command:每秒的命令數(其中從庫用管道符|將本地數據和複製數據隔開)

dirty: wiredtiger特有的參數,記錄wiredtiger快取中臟數據的比例。

used: wiredtiger特有的參數,記錄wiredtiger快取使用百分比。

flusher: 每個查詢間隔之間的checkpoint觸發次數。

Vsize:虛擬記憶體使用量。

res:物理記憶體使用量。

qrw: 客戶端等待從MongoDB實例讀寫數據的隊列長度

arw:執行讀寫操作的活躍客戶端數量

netIn:MongoDB實例的網路進流量。

netOut:MongoDB實例的網路出流量。

conn: 連接數。

set:複製集名稱。

repl:複製集中的狀態

當然如果你覺得這個命令在查看一些對比上一條數據之間有多少差異的數據時比較麻煩,你可以使用 MONGOSTAT 提供的 diff 命令來滿足你的需求-o 'host,mem.bits,metrics.document.inserted.diff()=inserted diff,metrics.document.inserted=inserted'

他會給出你,當前插入的行數與對比上一次插入的相減後的差額,好進一步查看當前的資料庫的任務是遞增還是遞減的狀態。

那如何通過命令行的方式,一次性的監控複製集中所有機器,並且是交換的方式 mongostat 也提供了相關的方式

當然如果你在初接手mongodb 或集合的情況下,你也可以使用 pt-mongodb-summary (需要安裝 PT 工具),來對你當前的伺服器或者複製集進行一個掃描,獲得一些基本的資訊。