首頁 > 軟體

聊聊MongoDB 帶存取控制的副本集部署問題

2022-02-19 10:00:20

  當你需要用到一個MongoDB 副本集叢集,用於開發測試時, 可以通過下面的步驟簡單完成。

版本及環境 MongoDB4.4 Centos6.5

一、下載 MongoDB Server 及 MongoDB Shell

   MongoDB Server 提供資料庫服務。 Mongo Shell 可以理解為命令列的使用者端程式。

   下載地址:https://www.mongodb.com/try/download/community

   此處選擇對應的,版本, 平臺,Package型別(server /shell)

    4.4.12 MongoDB Server:https://repo.mongodb.org/yum/redhat/6/mongodb-org/4.4/x86_64/RPMS/mongodb-org-server-4.4.12-1.el6.x86_64.rpm

MongoDB Shell:https://repo.mongodb.org/yum/redhat/6/mongodb-org/4.4/x86_64/RPMS/mongodb-org-shell-4.4.12-1.el6.x86_64.rpm

    RMP 安裝

rpm -ivh mongodb-org-server-4.4.12-1.el6.x86_64.rpm

rpm -ivh mongodb-org-shell-4.4.12-1.el6.x86_64.rpm

二、副本集初始化

副本集(replica set)是一組維護相同資料的mongod程序, 提供了高可用性。部分節點故障了,還可以自動選取主節點,繼續提供服務。

由於副本集的連結方式和單點有些區別,所以測試環境也按照副本集方式部署。

    

   MongoDB 手冊中關於副本集的部分在:https://docs.mongodb.com/v4.4/replication/

    1. 首先建立下資料庫資料儲存目錄,用於儲存資料。 環境是單機,三個節點的目錄,都是在一臺機器建立的,偽分散式。

mkdir -p /srv/mongodb/rs0-0  /srv/mongodb/rs0-1 /srv/mongodb/rs0-2 

    2. 依次啟動三個mongod範例

mongod --replSet rs0 --fork --logpath  /srv/mongodb/0 --logappend --port 27017 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-0  --oplogSize 128
mongod --replSet rs0 --fork  --logpath  /srv/mongodb/1 --logappend --port 27018 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-1  --oplogSize 128
mongod --replSet rs0 --fork  --logpath  /srv/mongodb/2 --logappend --port 27019 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-2  --oplogSize 128

    啟動後, ps -axu |grep mongo 看一下 3個程序 mongod 是不是都ok。

    3.使用mongo shell 連線其中一個節點。進行副本集初始化。

mongo --port 27017

    進入shell後, 執行如下命令。注意替換“10.13.50.40” 為實際IP

rsconf = {
  _id: "rs0",
  members: [
    {
     _id: 0,
     host: "10.13.50.40:27017"
    },
    {
     _id: 1,
     host: "10.13.50.40:27018"
    },
    {
     _id: 2,
     host: "10.13.50.40:27019"
    }
   ]
}
rs.initiate( rsconf )

    初始化完成後,可以通過

rs.conf()

    檢視副本集設定。

    到這裡3個節點的副本集已經設定好了。可以連線進行讀寫操作了。

但目前連線是沒有存取控制的, 下面來增加存取控制。

三、增加存取控制

    在副本集中啟用存取控制,需要進行兩項設定。

    1. 副本集節點成員間的安全認證,支援keyfiles 或者 x.509 證書 認證。

2.副本集服務與資料庫連線使用者端間的安全認證, 使用者名稱,密碼。許可權基於使用者所屬角色。

    副本集節點間的內部認證, 這裡使用keyfiles。 通俗說就是所有節點共用相同的keyfile 作為密碼。keyfile正確, 才能夠加入副本集,實現了副本集節點間的身份驗證。 

    建立一個keyfile, 複製三份,供3個節點使用。下面按官方手冊, 使用openssl 生成隨機密碼,修改許可權為400. 複製到3個目錄備用。

openssl rand -base64 756 > key
chmod  400 key
mkdir -p  /srv/mongodb/k0 /srv/mongodb/k1   /srv/mongodb/k2
cp key /srv/mongodb/k0/
cp key /srv/mongodb/k1/
cp key /srv/mongodb/k2/

下面建立使用者,指定角色。 如前述,使用 mongo shell 連線資料庫。建立使用者需要在主節點進行。如果連線的節點不是當前主節點。可以用 rs.status(); 檢視主節點ip埠後連線。進入mongo shell後, 輸入如下命令。

admin = db.getSiblingDB("admin")
admin.createUser(
  {
    user: "admin",
    pwd: "admin!@#$", 
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

    建立一個使用者名稱未 admin 角色為 userAdminAnyDatabase 的使用者, 密碼為 admin!@#$。 關於內建角色的更多資訊可以在這裡瞭解。

  https://docs.mongodb.com/v4.4/reference/built-in-roles/

    準備就緒後。 需要重啟mongo server服務, 啟用存取控制機制。 下面關閉所有節點。

mongo --port 27017 --eval 'db.adminCommand("shutdown")'
mongo --port 27018 --eval 'db.adminCommand("shutdown")'
mongo --port 27019 --eval 'db.adminCommand("shutdown")'

    重新啟動mongod,啟用存取控制 --auth --keyFile

mongod --replSet rs0 --fork --auth  --keyFile  /srv/mongodb/k0/key --logpath  /srv/mongodb/0 --logappend --port 27017 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-0  --oplogSize 128
mongod --replSet rs0 --fork --auth --keyFile  /srv/mongodb/k1/key  --logpath  /srv/mongodb/1 --logappend --port 27018 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-1  --oplogSize 128
mongod --replSet rs0 --fork --auth  --keyFile  /srv/mongodb/k2/key  --logpath  /srv/mongodb/2 --logappend --port 27019 --bind_ip 0.0.0.0,:: --dbpath /srv/mongodb/rs0-2  --oplogSize 128

  此時,已經啟用了存取控制, 無許可權使用者無法對資料庫進行讀寫,無法新增使用者。下面使用 帶認證的方式登入。 --username 及 --password

mongo admin --username admin --password 'admin!@#$'  --host rs0/10.13.50.40:27017,10.13.50.40:27018,10.13.50.40:27019

    admin的角色userAdminAnyDatabase 具有使用者管理許可權,但無資料庫讀寫許可權。 登陸後在 mongo shell中建立一個資料庫庫讀寫使用者,讀寫特定資料庫。test 使用者具有對資料庫 mytest 的讀寫許可權, 屬於內建的 readWrite 角色。

db.createUser( {user: "test",pwd: "test!@#$",roles: [ { role: "readWrite", db: "mytest" } ]})

    然後mongo shell 使用 test 登入 驗證。

mongo test --username test --password 'test!@#$'  --host rs0/10.13.50.40:27017,10.13.50.40:27018,10.13.50.40:27019

  test登入後,在mongo shell 中測試讀寫

use mytest
db.col.insert({name:'測試',age:1})
db.col.find()

   查詢結果

{ "_id" : ObjectId("61f3da65e72c3f10edef9a78"), "name" : "測試", "age" : 1 }

至此。一個三個節點的, 帶有存取控制的副本集,就搞定收工。

到此這篇關於MongoDB 帶存取控制的副本集部署的文章就介紹到這了,更多相關MongoDB副本集部署內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com