MongoDB#
MongoDB 是一種開源的文件型NoSQL資料庫系統,主要由 MongoDB, Inc. 這家公司負責提供與維護。MongoDB, Inc. 維護官方版本,發布更新與企業商用版本,並管理其社群版網站mongodb.org與企業版網站mongodb.com。
Introduction#
MongoDB 具備高靈活性、可擴展性和高可用性,支援副本集架構實現資料冗餘與自動故障轉移,適合現代化應用需求。維護方面主要由 MongoDB, Inc. 透過軟件更新和技術支援提供,社群版受社群貢獻者幫助維護,企業版則有專職團隊支援。
Install#
匯入包管理系統使用的公鑰
$ wget -qO - https://www.mongodb.org/static/pgp/server-4.0.asc | sudo apt-key add -為 MongoDB 建立一個 list file 創建清單檔 /etc/apt/sources.list.d/mongodb-org-4.0.list 適用於您的 Ubuntu 版本。
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list重新載入本地包資料庫
$ sudo apt-get update安裝 MongoDB 包
$ sudo apt-get install -y mongodb-org儘管您可以指定任何可用的 MongoDB 版本, apt-get 將在有較新版本可用時升級軟體包。為防止意外升級,您可以將包固定為當前安裝的版本
$ echo "mongodb-org hold" | sudo dpkg --set-selections $ echo "mongodb-org-server hold" | sudo dpkg --set-selections $ echo "mongodb-org-shell hold" | sudo dpkg --set-selections $ echo "mongodb-org-mongos hold" | sudo dpkg --set-selections $ echo "mongodb-org-tools hold" | sudo dpkg --set-selections啟動 MongoDB
$ sudo systemctl start mongod如果您在啟動時收到類似於以下內容的錯誤 mongod
Failed to start mongod.service: Unit mongod.service not found.首先執行以下命令:$ sudo systemctl daemon-reload然後再次運行上面的 start 命令
驗證 MongoDB 是否已成功啟動
$ sudo systemctl status mongod您可以選擇透過發出以下命令來確保 MongoDB 將在系統重啟後啟動:
$ sudo systemctl enable mongod您可以通過發出以下命令來停止 mongod 進程
$ sudo systemctl stop mongod您可以透過發出以下命令重新啟動 mongod 行程
$ sudo systemctl restart mongod開始使用 MongoDB 啟動與 mongod 在同一主機上的 mongo shell。您可以在不使用任何命令列選項下執行 mongo shell,預設會連接到運行在本地主機且使用預設埠號 27017 的 mongod
$ mongo
Setting in up#
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIpAll: true
#bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
#security:
security:
authorization: enabled
keyFile: /etc/mongod.keyfile
#operationProfiling:
#replication:
replication:
replSetName: rs0
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:Operate#
登入DB#
$ mongo --host localhost --port 27017 -u root -p <password> --authenticationDatabase <database name>切換資料庫#
use <database name>更新使用者權限#
db.updateUser("<user name>", {
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "clusterAdmin", db: "admin" },
],
});新系統創建管理者帳號#
db.createUser({
user: "root",
pwd: "<passworf>",
roles: [
{ role: "clusterAdmin", db: "admin" }
]
})更換使用者密碼#
db.changeUserPassword("root", "<password>")Replica set#
支援表
| Platform | 4.0 | 4.4 | 5.0 | 6.0 | 7.0 | 8.0 |
|---|---|---|---|---|---|---|
| Ubuntu18.4 | V | V | V | V | ||
| Ubuntu20.4 | V | V | V | V | V | |
| Ubuntu22.4 | 6.0.4+ | V | V | |||
| Ubuntu24.4 | V |
以下操作全部要加入副本集的mongodb都要設定
登入 mongo 使用 root 帳號並切換 db 到 admin
use admin指令
show users確認 root 有{ role: "clusterAdmin", db: "admin" }角色,如果沒有角色,執行 :db.grantRolesToUser("root", [ { role: "clusterAdmin", db: "admin" } ])各副本間使用 keyfile 進行驗證。
建立keyfile並放在
/etc/並將建立好的 keyfile 複製到其他子節點
# 生成keyfile openssl rand -base64 756 > /etc/mongod.keyfile # 給予400權限 chmod 400 /etc/mongod.keyfile # 設定使用者群組 chown mongod:mongod /etc/mongod.keyfile編輯
/etc/mongo.conf在 security & replication 區塊加入 :# ... security: authorization: enabled keyFile: /etc/mongod.keyfile # ... replication: # 將副本取名為rs0,可以是任意名稱 replSetName: rs0重啟 mongodb
$ systemctl restart mongod建立 Repclica set
以下在主節點執行
登入 mongo 使用 root 帳號
初始化副本集:
cfg = { _id: "rs0", members: [ { _id: 0, host: "203.0.113.1:27017" }, // 主節點,預設配置 //參數 priority: 設定是否參與選舉,votes: 設定是否參與投票 { _id: 1, host: "203.0.113.2:27017", priority: 0, votes: 0 }, { _id: 2, host: "203.0.113.3:27017", priority: 0, votes: 0 } ] } rs.initiate(cfg) #如果初始化時沒有加入可以單獨加入節點 #rs.add( { _id: 1, host: "203.0.113.2:27017", priority: 0, votes: 0 } )使用
rs.status()查看狀態,待stateStr狀態變成SECONDARY後將子集加入選舉與投票 :// 將節點編號 1 加入選舉 cfg = rs.conf(); cfg.members[1].priority = 1 cfg.members[1].votes = 1 rs.reconfig(cfg) // 將節點編號 2 加入選舉 cfg = rs.conf(); cfg.members[2].priority = 1 cfg.members[2].votes = 1 rs.reconfig(cfg)使用
rs.conf()確認子節點狀態確認 priority , votes 已變更為 1{ "_id" : 2, "host" : "203.0.113.3:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }建立完成,將連接的url改成 :
mongodb://<user>:<pwd>@203.0.113.1:27017,203.0.113.2:27017,203.0.113.3:27017/<dbname>?replicaSet=rs0角括號內是需要自訂的內容。手動切換PRIMARY 在PRIMARY主機上登入 mongo 使用一下指令:
rs.stepDown()刪除節點
rs.remove("203.0.113.2:27017")強制取得PRIMARY
# 只有一個節點活著的時候並且沒有取得 Primary 節點的時候,這個節點會變成 Secondary 節點,並且無法進行寫入操作。 # 這時候我們需要強制重寫cfg # 取得目前副本集配置 cfg = rs.conf(); # 修改副本集配置,僅保留當前節點並設置優先級為1 cfg.members = [cfg.members[0]]; cfg.members[0].priority = 1; # 使用force參數強制重新配置 rs.reconfig(cfg, {force: true});
Reference#
This docs:
Official docs: