當你需要用到一個MongoDB 副本集集群,用于開發測驗時, 可以通過下面的步驟簡單完成,
版本及環境 MongoDB4.4 Centos6.5
一. 下載安裝 MongoDB Server 及 MongoDB Shell
二. 副本集啟動,初始化
三. 配置用戶 增加 訪問控制
一、下載 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 }
至此,一個三個節點的, 帶有訪問控制的副本集,就搞定收工,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/426461.html
標籤:其他
下一篇:mysql,資料型別與表操作
