mongodb副本集安裝

前置工作

下載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

成功登錄,則表明認證啓用成功且用戶名密碼正確

總結

這裏我由於硬件限制,使用的是僞分佈式的方式,但是和真正的分佈式區別不大。
部署主要分三步:

  • 前置工作:包括服務二進制下載,相關目錄端口的規劃、相關環境的初始化
  • 服務部署:主要是將服務正確的啓動起來
  • 權限與認證:服務啓動後,一些相關的配置工作,使服務更安全穩定的提供服務
發佈了129 篇原創文章 · 獲贊 203 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章