導語
不久前MongoDB發布了4.0正式版, 4.0版本的最大特性是支持多文檔事務, 但這一特性只支持副本集或者分片集群, 單節點MongoDB環境是無法使用此特性的.
本文將詳細介紹在CentOS7.4操作系統上搭建基於用戶認證的MongoDB4.0三節點的副本集集群的完整過程.
基礎規划
軟件環境
MongoDB官網下載中心 MongoDB4.0.3下載地址
# 三節點均執行
# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.3.tgz #mongodb下載 # tar -zxvf mongodb-linux-x86_64-rhel70-4.0.3.tgz #mongodb解壓 # mv mongodb-linux-x86_64-rhel70-4.0.3 /usr/local/share/mongodb #mongodb安裝 # echo 'export PATH=/usr/local/share/mongodb/bin:$PATH' >> /etc/profile #mongodb環境配置
# source /etc/profile #使配置生效 # mongo --version # 查看是否安裝成功
環境規划
| 節點名 | 節點用途 | 節點IP | 節點端口 | 集群名 |
| mongo1 | 主節點(PRIMARY) | 10.0.2.11 | 9927 | myrs |
| mongo2 | 從節點(SECONDARY) | 10.0.2.12 | 9927 | |
| mongo3 | 仲裁節點(ARBITER) | 10.0.2.13 | 9927 |
[注]:
1. 本文的三節點環境使用VirtualBox創建的三台虛擬機. 配置集群的過程與真實服務器無異. 本文MongoDB服務使用的端口統一改為9927, 也可直接使用默認的27017端口.
2. 虛擬機網絡選擇NAT網絡, 注意不是網絡地址轉換(NAT), 后者無法支持虛擬機之間的網絡互通.
3. 建議為虛擬機可以開啟端口映射(VirtualBox全局設定-網絡), 開啟端口映射后, 主機可以通過ssh訪問虛擬機(映射22端口), 也可以在主機上連接虛擬機的MongoDB服務(映射9927端口).
4. 單服務器環境下同樣可以配置MongoDB副本集集群, 即"三節點"部署在一台服務器上, 節點IP相同, 節點端口不同(如9927, 9928, 9929), 配置過程與三服務器大同小異(每個"節點"需分配一個單獨的目錄).
5. 為保證集群節點互通, 建議關閉虛擬機操作系統防火牆(systemctl disable firewalld, systemctl stop firewalld)或者為防火牆開放9927端口(firewall-cmd --zone=public --add-port=9927/tcp --permanent, firewall-cmd --reload).
| 目錄 | 用途 | 備注 |
| /mgrs/data | Mongo集群數據文件目錄 | |
| /mgrs/logs | Mongo集群系統日志目錄 | |
| /mgrs/conf | Mongo集群配置文件目錄 |
[注]:
1. 三節點均配置相同的目錄環境. 目錄環境並非MongoDB硬性規定, 可根據自身需求規划.
2. 如是單服務器下的Mongo集群, 則需為每個"節點"配置單獨目錄(/mgrs/node1/data, /mgrs/node1/logs, /mgrs/node1/conf, 依此類推).
搭建步驟
配置文件
MongoDB服務支持命令行配置參數和配置文件兩種啟動方式, 為便於管理, 推薦使用配置文件進行服務參數的配置. 自Mongo2.6版起, 官方推薦使用YAML格式的配置參數: MongoDB官方YAML配置文件參數說明; 舊版配置文件格式依然可用但不建議使用: MongoDB官方舊版配置文件參數說明.
下面是本集群使用的YAML配置文件mongod.conf:
systemLog:
destination: file
path: "/mgrs/logs/mongod.log"
logAppend: true
storage:
dbPath: "/mgrs/data"
journal:
enabled: true
processManagement:
fork: true
pidFilePath: "/mgrs/mongod.pid"
net:
bindIpAll: true
port: 9927
#security:
# keyFile: "/mgrs/conf/access.key"
# authorization: enabled
#setParameter:
# authenticationMechanisms: SCRAM-SHA-1
replication:
oplogSizeMB: 500
replSetName: myrs
[注]:
1. 三節點的配置文件均相同. 配置文件存放位置建議為:/mrgs/conf/mongod.conf.
2. 如是單服務器環境, 需根據具體目錄規划為三個配置文件配置相應的參數.
3. 配置文件參數可根據實際需要對照官方參數說明進行修改.
4. security部分的參數用於啟用集群用戶認證, 需要先注釋掉, 等集群搭建完成再啟用, setParameter部分可以去掉.
5. net部分直接啟用bindIpAll參數將操作系統上配置的所有ip均綁定到mongodb服務上, 生產環境可使用bindIp: "10.0.2.11"參數代替.
啟動服務
直接使用配置文件在三個節點上分別啟動mongod后台進程.
# 三節點均執行
# mongod -f /mgrs/conf/mongod.conf
配置集群
進入其中一個節點(主節點)的mongo控制台, 配置集群(務必保證節點防火牆關閉或開放mongo服務端口).
# 僅在一個節點執行
# mongo 127.0.0.1:9927 #進入mongo控制台 > cfg = {_id: 'myrs', members: []} #生成集群配置變量 > cfg.members.push({_id: 1, host: '10.0.2.11:9927'}) #變量中加入節點1 > cfg.members.push({_id: 2, host: '10.0.2.12:9927'}) #變量中加入節點2 > cfg.members.push({_id: 3, host: '10.0.2.13:9927'}, arbiterOnly: true) #變量中加入節點3(仲裁節點) > rs.initiate(cfg) #根據變量配置集群 > rs.isMaster() #查看集群是否配置成功 > rs.status()
添加用戶
集群配置完成后, 仍然在主節點的mongo控制台中添加三個用戶:數據庫管理員, 集群管理員和訪問特定數據庫的用戶.
# 僅在一個節點執行 # mongo 127.0.0.1:9927 #進入mongo控制台 > use admin #使用內置的admin庫 > db.createUser( #創建數據庫管理員 { user:"root", pwd:"root", roles:[{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"}] } ) > db.createUser( #創建集群管理員 { user:"suroot", pwd:"suroot", roles:[{role:"clusterAdmin",db:"admin"},{role:"clusterManager",db:"admin"},{role:"clusterMonitor",db:"admin"}] } ) > use testdb #切換到testdb數據庫,不用事先創建 > db.createUser( #創建特定庫的特定用戶 { user:"test", pwd:"test", roles:[{role:"readWrite",db:"testdb"},{role:"dbAdmin",db:"testdb"},{role:"userAdmin",db:"testdb"}] } ) > use admin > db.system.users.find() #查看創建的用戶
[注]:
1. MongoDB的用戶和數據庫是綁定的, 必須指定某個用戶歸屬於哪個數據庫, 即在roles字段的每個role中指定db字段.
2. 數據庫管理員通常需要具有讀寫,管理任意數據庫和管理任意用戶的role, 后續可以登錄此用戶進行數據庫和用戶的增刪改查.
3. 集群管理員通常需要具有集群管理和集群監控的role, 只有集群管理員可以關閉集群.
4. 普通用戶根據用途不同可以對特定或者多個數據庫擁有各種不同的role, 本例中的test用戶既可以讀寫testdb庫, 同時也是testdb庫的管理員.
5. 主節點上添加的用戶應該能夠在從節點上查詢到(需要先鍵入rs.slaveOk()命令).
開啟用戶認證
用戶添加完成后需要關閉所有節點(先關閉仲裁和從節點, 再關閉主節點, 避免主節點切換):
# 在三個節點均執行 # mongo 127.0.0.1:9927 #節點關閉只能在本機操作 > use admin > db.shutdownServer() #關閉mongo后台進程
生成keyFile(keyFile的用途是作為所有mongod后台進程允許加入集群的憑證, 所有集群中的節點共用一個keyFile, 避免其他mongod非法加入集群):
# 僅在一個節點執行
# openssl rand -base64 756 > /mgrs/conf/access.key #生成keyFile, keyFile的長度必須在6-1024個字符之間 # chmod 400 /mgrs/conf/access.key #設置keyFile文件為只讀
# scp /mgrs/conf/access.key root@10.0.2.12:/mgrs/conf/ #將keyFile復制到其他節點
# scp /mgrs/conf/access.key root@10.0.2.13:/mgrs/conf/
取消三個節點mongod.conf文件中security部分的注釋:
systemLog:
destination: file
path: "/mgrs/logs/mongod.log"
logAppend: true
storage:
dbPath: "/mgrs/data"
journal:
enabled: true
processManagement:
fork: true
pidFilePath: "/mgrs/mongod.pid"
net:
bindIpAll: true
port: 9927
security:
keyFile: "/mgrs/conf/access.key"
authorization: enabled
setParameter:
authenticationMechanisms: SCRAM-SHA-1
replication:
oplogSizeMB: 500
replSetName: myrs
依次啟動主節點, 從節點和仲裁節點的mongod后台進程:
# 三個節點均執行 # mongod -f /mgrs/conf/mongod.conf
使用認證用戶登錄:
# mongo 127.0.0.1:9927
> use admin
> db.auth('root', 'root') #使用數據庫管理員認證
> rs.slaveOk() #默認讀寫操作均在主節點執行, 從節點上需要執行此命令才能讀取數據庫數據
> db.system.users.find()
> use testdb
> db.auth('test', 'test') #切換到test用戶
> db.getCollectionNames()
> use admin #切換到集群管理員用戶, 關閉mongo服務
> db.auth('suroot', 'suroot')
至此, 基於用戶認證的MongoDB4.0三節點副本集集群環境已經搭建完成.
常用命令
結束
