2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY23 MongoDB 免費監控工具

產品或服務上線最重要的當然是穩定度,大一點的團隊會設置監控部門,而人少的團隊更需要做好監控自動化,減少沒有警告或是誤警的發生率。


MongoDB 其實很佛心的讓你可以簡單幾個指令查到當前狀態,甚至有基礎的免費雲端監控服務,我們馬上來看看。

取得目前監控狀態

  • db.getFreeMonitoringStatus()
1
2
ith2021> db.getFreeMonitoringStatus()
{ state: 'undecided', ok: 1 }

這個是資料庫啟動後查詢的結果,狀態不是官網說的 enableddisabled,但只要經過修改後就不會是這個 undecided 了。

閱讀全文 »

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY22 MongoDB Profiler 幾個指令抓拖垮系統的元兇

Profiler 查詢推薦指令

1
db.system.profile.find()

一般我們不會這樣做,因為資訊又多又難閱讀,可以加上一些查詢條件。
例如 limit(x) 或者指定某些操作 op 等等。
以下直接推薦我常在使用的指令:

直接找出最慢的

利用執行時間、倒序來找出最慢的幾個。
為了方便閱讀也加入.limit().pretty()語法,後面就不贅述。

1
db.system.profile.find().sort({ millis: -1 }).limit(5).pretty();

利用操作類別查詢

閱讀全文 »

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY21 MongoDB Profiler 如何監控效能差的操作

有處理過資料庫效能問題的大概都知道 profiler 是什麼,MongoDB 也有這個功能。開啟此功能狀態下,會對資料庫效能有影響,至於多少還是需要多觀察與測試。

Profiler 是一個蒐集所有 MongoDB 操作細節的工具,除了一般的 CRUD 之外,包含管理員指令也會記錄,這細節有多細節,基本上就是完整指令以及對系統的影響、執行時間等等。

Profiler 資訊全部儲存在 system.profile 內,它是一個 capped collection,因此不用太擔心,如果不知道甚麼是 capped collection,請務必往前翻前面的文章,這是一個很重要的設計。

Profiler 分級

Profiler 一共分三級:

  • 0, 關閉 profiler
  • 1, 僅記錄查詢時間大於 slowms 的查詢資訊
  • 2, 紀錄全部的查詢資訊

如何取得目前狀態

閱讀全文 »

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY20 MongoDB Oplog 玩壞它

把手弄髒,親眼於本機見證節點同步跟不上

本篇的目的就是要在本機端大量寫入資量,讓次節點的更新開始跟不上主節點,藉由這樣教你如何觀察這個現象以及處裡。

step1 建立 replica set

請直接參考這篇之前文章,在 local 啟動一組 MongoDB replica set,並直接連上 primary。

step1 寫入大量資料

準備了這個 script,大量寫入資料進資料庫中。
mongo --host localhost --port 27668 < test-data-script.js

  • 27668 是你的 primary node port
  • test-data-script.js 是腳本檔案名稱
閱讀全文 »

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY19 MongoDB Oplog 到底是什麼?

oplog 是什麼?

如果你的 MongoDB 是使用 replication,那你會需要知道什麼是 oplog;如果你的 MongoDB 是只有單一個節點,那就暫時還不需要理解。

oplog 是用來同步主要節點與次節點資料用的。例如我們寫入了一筆資料,而這筆資料的異動資訊也會被寫入 oplog 中,次節點會主動去主節點的 oplog collection 內執行find, getMore 拿到需要同步的資料,再透過後續抄寫機制回次節點,並告訴主節點最後同步時間。

ChainingAllowed

MongoDB 同步機制中,來源不一定是主節點,例如這是我們預期的

  1. 主 -> 次1
  2. 主 -> 次2

但實際上可以是

閱讀全文 »

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY18 MongoDB Replication 實戰

本篇我們要使用 Dcoker compose 方式實作 MongoDB replication,又快速又方便,如果不太熟的可以去參考之前文章 DAY2 安裝與使用 MongoDB


上一篇文章有提到(怎麼又是之前文章啊?這樣代表我的文章有連貫性啊) MongoDB replication 至少需要有三個實體。

首先我們建立一個 yml 檔案 docker-compose.yml,開始寫我們計劃中的設定。

  1. 替這次 replication 取個名字叫做 ith2021-rs

  2. 三個節點名稱與port分別為

    • mongo_node1 : 27666
    • mongo_node2 : 27667
    • mongo_node3 : 27668
  3. 再拿之前的範例來修改就完成了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: '3'
services:
mongo_node1:
container_name: mongo_node1
image: mongo
ports:
- 27666:27666
command: mongod --port 27666 --bind_ip_all --replSet ith2021-rs
mongo_node2:
container_name: mongo_node2
image: mongo
ports:
- 27667:27667
command: mongod --port 27667 --bind_ip_all --replSet ith2021-rs
mongo_node3:
container_name: mongo_node3
image: mongo
ports:
- 27668:27668
command: mongod --port 27668 --bind_ip_all --replSet ith2021-rs

我們可以看到這次啟動的指令多了 --replSet ith2021-rs,就是指定 replica set 的名稱。

閱讀全文 »

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY17 MongoDB Replication 基礎觀念

本系列至今都是介紹 MongoDB 在單一實體運作的狀況,我們稱為 standalone,從今天開始將介紹多個實體共同運作的模式,稱為 replication

Replication

Replication,MongoDB 的強項之一。

透過 Replication 功能,可以將數個 MongoDB instance 組成一個群體,並且擁有一樣的資料,透過這樣的組成,提升資料的備份、安全性以及高可用性(Data redundancy, availability)。另一個好處就是讀寫分離


架構

首先我們來看架構圖,

閱讀全文 »

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY16 MongoDB Explain 與 Index 建議

MongoDB explain - executionStats

這篇主要講解的是 MongoDB explain 指令的 executionStats 項目。
使用此模式進行 explain,會根據你輸入的語法,在 query optimizer 找出最佳的查詢計畫,並且 實際執行你的語法,無論是查詢或者新增刪除修改。但是請不用擔心,這樣做並不會真的去改變任何資料庫內容,只是協助、更貼近真實情況下,你的語法執行結果如何。

查詢語法在 explain 參數中帶入 executionStats,即可。

1
db.collection.find().explain("executionStats")

實際執行

馬上進入重頭戲,實際執行的部分。我們沿用了上一篇文章的範例,一樣是查詢 name 欄位,參數則指令了executionStats

db.collection.find("name":"Devil").explain("executionStats")

閱讀全文 »

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY15 MongoDB Explain 效能分析工具

針對資料庫內的資料進行查詢、新增、刪修都需要迅速地找到該筆資料,因此建立索引很重要。至於要如何評估指令的效能如何,例如參數設計、順序,就需要使用 MongoDB 的 explain 指令,其他資料庫如 Oracle, MSSQL 叫做 execution plan

而 MongoDB 使用語法很簡單

1
db.collection.find().explain()

MongoDB explain 種類

MongoDB 的 explain 總共有三種模式,分別是:

  • queryPlanner
  • executionStats
  • allPlansExecution
閱讀全文 »

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


DAY14 MongoDB 索引屬性與進階注意事項

昨天的文章介紹了各種索引以及建立方式,這篇會講一些使用上的一些經驗。

索引屬性 (Index properties)

在建立索引時還有一些屬性能設定,這些非常關鍵請務必先了解。

Unique

透過設定 index unique,使得該欄位變成唯一值(亦可用在多欄位)。使用方法是在後方加上{unique:true}即可,例如:

1
db.employee.createIndex({"department": 1}, {unique:true})

複合索引使用方式也是一樣。

閱讀全文 »