前置工作
下載mongo
mongodb 官方下載頁面連接:https://www.mongodb.com/download-center/community
版本可以根據自己需要選擇,由於我要使用 mongo事務的特性,只能選擇 4.0 之後的版本,這裏我選擇 4.0.14
OS根據自己的系統選擇,我的系統是 centos 7,選擇 RHEL 7.0 Linux 64-bit x64 即可
下載並解壓:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.14.tgz
tar -zvxf mongodb-linux-x86_64-rhel70-4.0.14.tgz
端口分配
服務 | Host | Port |
---|---|---|
node-0 | 10.38.160.174 | 27017 |
node-1 | 10.38.160.174 | 27027 |
node-2 | 10.38.160.174 | 27037 |
相關目錄創建
安裝目錄:/home/work/app/mongodb
二進制目錄:/home/work/app/mongodb/bin
數據目錄:/home/work/app/mongodb/data/node-0,/home/work/app/mongodb/data/node-1,/home/work/app/mongodb/data/node-2
日誌目錄:/home/work/app/mongodb/logs
認證文件目錄:/home/work/app/mongodb/auth
Mongodb二進制存儲目錄:/home/work/app/mongodb/bin
mkdir /home/work/app/mongodb
mkdir /home/work/app/mongodb/data/node-{0..2}
mkdir /home/work/app/mongodb/logs
mkdir /home/work/app/mongodb/auth
mv mongodb-linux-x86_64-rhel70-4.0.14/bin /home/work/app/mongodb
設置環境變量
vim ~/.bashrc # 這裏爲bash
export PATH=/home/work/app/mongodb/bin:$PATH
服務部署
啓動服務
關鍵參數說明:
- –dbpath 數據目錄路徑
- –logpath 日誌文件路徑
- –logappend 以追加的方式寫入日誌而非覆蓋(不設置可能會導致服務啓動後,歷史日誌丟失)
- –fork 後臺啓動
- –port 綁定的端口
- –replSet 副本集名稱
- –bind_ip_all 綁定所有端口(不指定,默認綁定127.0.0.1),等效於 --bind_ip 0.0.0.0
啓動命令:
# 啓動node-0
mongod --dbpath=/home/work/app/mongodb/data/node-0 --logpath=/home/work/app/mongodb/logs/node-0.log --logappend --fork --port=27017 --replSet=mytest --bind_ip_all
# 啓動node-1
mongod --dbpath=/home/work/app/mongodb/data/node-1 --logpath=/home/work/app/mongodb/logs/node-1.log --logappend --fork --port=27027 --replSet=mytest --bind_ip_all
# 啓動node-2
mongod --dbpath=/home/work/app/mongodb/data/node-2 --logpath=/home/work/app/mongodb/logs/node-2.log --logappend --fork --port=27037 --replSet=mytest --bind_ip_all
看到 child process started successfully
則表明啓動成功,如果失敗,可通過日誌查看失敗原因
登錄mongo
登錄命令如下:
mongo --host 10.38.160.174 --port 27017 # 這裏端口隨意,也可以選擇 27027 或 27037
初始化集羣,並設置 10.38.160.174:27017 爲 primary :
可通過 priority 的設置決定master,不指定則默認爲 1,關於 priority,詳見Adjust Priority for Replica Set Member
use admin
# 初始化集羣
rs.initiate({"_id":"mytest","members":[{"_id":0,"host":"10.38.160.174:27017",priority:2},{"_id":1,"host":"10.38.160.174:27027"},{"_id":2,"host":"10.38.160.174:27037"}]})
輸出如下內容,則表明成功:
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1577104905, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1577104905, 1)
}
退出並重新登錄:
exit # 退出mongo
# 重新登錄
mongo --host 10.38.160.174 --port 27017 # 這裏我們登錄 27017端口
可以看到如下內容,表明集羣設置成功,且 10.38.160.174:27017 爲 PRIMARY 節點,符合預期:
mytest:PRIMARY>
至此,一個mongodb集羣已經基本搭建完成可以使用,但是爲了安全和更好地使用,我們需要創建用戶並啓用授權功能
權限與認證
創建用戶名密碼
這裏我們創建了一個 admin
的用戶,密碼爲 admin
,權限爲 userAdminAnyDatabase
clusterAdmin
,更多身份與權限,參見:Users
use admin
db.createUser({
user:"admin",
pwd:"admin",
roles:[{
role:"userAdminAnyDatabase",db:"admin"
},{
role:"clusterAdmin",db:"admin"
}]
})
輸出如下內容,則表明設置成功:
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "clusterAdmin",
"db" : "admin"
}
]
}
測試認證:
db.auth('admin', 'admin')
輸出1
則表明設置成功。雖然用戶名密碼設置成功了,但是mongodb服務目前還是不支持認證的,需要讓服務啓用認證功能。
啓用認證
啓用認證後,不僅客戶端連接需要認證,同樣的,服務節點內部之間也是需要認證的,mongodb目前支持兩種方,一種是keyfile方式,一種是證書方式,這裏我們使用簡單的keyfile的方式。keyfile方式原理上是將key存進文件中,key內容可以隨意,推薦通過以下方式生成隨機內容的keyfile:
openssl rand -base64 756 > /home/work/app/mongodb/auth/key.file
認證相關參數,更多信息參見Internal/Membership Authentication:
- –auth 啓用認證
- –keyFile 集羣之間證人token
- -u 用戶名
- -p 密碼
# 停止集羣
mongod --dbpath=/home/work/app/mongodb/data/node-0 --logpath=/home/work/app/mongodb/logs/node-0.log --logappend --fork --port=27017 --replSet=mytest --bind_ip_all --shutdown
mongod --dbpath=/home/work/app/mongodb/data/node-1 --logpath=/home/work/app/mongodb/logs/node-1.log --logappend --fork --port=27027 --replSet=mytest --bind_ip_all --shutdown
mongod --dbpath=/home/work/app/mongodb/data/node-2 --logpath=/home/work/app/mongodb/logs/node-2.log --logappend --fork --port=27037 --replSet=mytest --bind_ip_all --shutdown
# 以認證方式重新啓動
# 啓動node-0
mongod --dbpath=/home/work/app/mongodb/data/node-0 --logpath=/home/work/app/mongodb/logs/node-0.log --logappend --fork --port=27017 --replSet=mytest --bind_ip_all --auth --keyFile=/home/work/app/mongodb/auth/key.file
# 啓動node-1
mongod --dbpath=/home/work/app/mongodb/data/node-1 --logpath=/home/work/app/mongodb/logs/node-1.log --logappend --fork --port=27027 --replSet=mytest --bind_ip_all --auth --keyFile=/home/work/app/mongodb/auth/key.file
# 啓動node-2
mongod --dbpath=/home/work/app/mongodb/data/node-2 --logpath=/home/work/app/mongodb/logs/node-2.log --logappend --fork --port=27037 --replSet=mytest --bind_ip_all --auth --keyFile=/home/work/app/mongodb/auth/key.file
測試登錄:
mongo --host 10.38.160.174 --port 27017 -u admin -p admin
成功登錄,則表明認證啓用成功且用戶名密碼正確
總結
這裏我由於硬件限制,使用的是僞分佈式的方式,但是和真正的分佈式區別不大。
部署主要分三步:
- 前置工作:包括服務二進制下載,相關目錄端口的規劃、相關環境的初始化
- 服務部署:主要是將服務正確的啓動起來
- 權限與認證:服務啓動後,一些相關的配置工作,使服務更安全穩定的提供服務