MongoDB#

MongoDB 是一種開源的文件型NoSQL資料庫系統,主要由 MongoDB, Inc. 這家公司負責提供與維護。MongoDB, Inc. 維護官方版本,發布更新與企業商用版本,並管理其社群版網站mongodb.org與企業版網站mongodb.com。


Introduction#

MongoDB 具備高靈活性、可擴展性和高可用性,支援副本集架構實現資料冗餘與自動故障轉移,適合現代化應用需求。維護方面主要由 MongoDB, Inc. 透過軟件更新和技術支援提供,社群版受社群貢獻者幫助維護,企業版則有專職團隊支援。


Install#

  1. 匯入包管理系統使用的公鑰

    $ wget -qO - https://www.mongodb.org/static/pgp/server-4.0.asc | sudo apt-key add -
  2. 為 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
  3. 重新載入本地包資料庫

    $ sudo apt-get update
  4. 安裝 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
  5. 啟動 MongoDB

    $ sudo systemctl start mongod

    如果您在啟動時收到類似於以下內容的錯誤 mongod

    Failed to start mongod.service: Unit mongod.service not found. 首先執行以下命令:

    $ sudo systemctl daemon-reload

    然後再次運行上面的 start 命令

  6. 驗證 MongoDB 是否已成功啟動

    $ sudo systemctl status mongod

    您可以選擇透過發出以下命令來確保 MongoDB 將在系統重啟後啟動:

    $ sudo systemctl enable mongod
  7. 您可以通過發出以下命令來停止 mongod 進程

    $ sudo systemctl stop mongod
  8. 您可以透過發出以下命令重新啟動 mongod 行程

    $ sudo systemctl restart mongod
  9. 開始使用 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#

支援表

Platform4.04.45.06.07.08.0
Ubuntu18.4VVVV
Ubuntu20.4VVVVV
Ubuntu22.46.0.4+VV
Ubuntu24.4V
  1. 以下操作全部要加入副本集的mongodb都要設定

  2. 登入 mongo 使用 root 帳號並切換 db 到 admin

    use admin
  3. 指令 show users 確認 root 有 { role: "clusterAdmin", db: "admin" } 角色,如果沒有角色,執行 :

    db.grantRolesToUser("root", [ { role: "clusterAdmin", db: "admin" } ])
  4. 各副本間使用 keyfile 進行驗證。

    建立keyfile並放在/etc/

    並將建立好的 keyfile 複製到其他子節點

    # 生成keyfile
    openssl rand -base64 756 > /etc/mongod.keyfile
    # 給予400權限
    chmod 400 /etc/mongod.keyfile
    # 設定使用者群組
    chown mongod:mongod /etc/mongod.keyfile
  5. 編輯 /etc/mongo.conf 在 security & replication 區塊加入 :

    # ...
    security:
        authorization: enabled
        keyFile: /etc/mongod.keyfile
    # ...
    replication:
        # 將副本取名為rs0,可以是任意名稱
        replSetName: rs0
  6. 重啟 mongodb

    $ systemctl restart mongod
  7. 建立 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 角括號內是需要自訂的內容。

  8. 手動切換PRIMARY 在PRIMARY主機上登入 mongo 使用一下指令:

    rs.stepDown()
  9. 刪除節點

    rs.remove("203.0.113.2:27017")
  10. 強制取得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:

template

Official docs: