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})

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

閱讀全文 »

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


DAY13 MongoDB 索引(Index) 種類與建立方式

什麼是索引(Index)

索引是資料庫設計中非常重要的一環,透過針對特定欄位(一個以上)建立索引,使得任何操作能夠快速找到資料,這也是為什麼操作的查詢條件通常都須建立索引的緣故,所以使用者情境(user scenario)對開發者來說非常重要,如果沒有這些情境,開發者無法預測這個功能該如何使用,進而無法設計出合適的結構或者索引等。

預設索引

MongoDB 內的所有 collection 都有一個 Default Index,打開任一文件都會看到一個 _id 欄位,就是這個。

_id 不需要指定,寫入資料庫時就會自動幫你產生,當然你也可以自己客製化,在某些情境很適合。

索引值排序

MongoDB 索引欄位是有排序的,預設是正序1,反序-1則需要特別設定,至於要使用哪一種排序,需要根據你的使用情境來決定。

閱讀全文 »

這篇文章主要是在讀了 提問的智慧 這篇文章後的想法,因為我很懶惰所以準備了一個我流精簡版,而精簡版可能會不盡然完全表達,請慎讀,不懂可以回去翻原文。


觀念

  1. 沒有人有義務回答你的問題
  2. 沒有得到回覆可能也是正常的,請尋求其他管道,而不是重複發文

提問前

  1. 去 Google 或論壇找前人的經驗
  2. 讀懂手冊
  3. 嘗試自己檢驗來找到答案

提問時

  1. 有禮貌
  2. 找對地方發問
  3. 切勿要求回覆到發問處以外的地方,例如(email)
  4. 不要加上對問題沒幫助的話「救命啊」「緊急」「我是新手」「抱歉我小嫩嫩」
  5. 精確的表達問題以及重現問題的步驟
  6. 附上必要資訊,例如軟體版本或是硬體規格
  7. 不要直接宣稱「我發現了BUG」或「這是個BUG」

提問後

  1. 有禮貌
  2. 更新問題結果,例如「已解決」
閱讀全文 »