不久前MongoDB發佈了4.0正式版, 4.0版本的最大特性是支持多文檔事務, 但這一特性只支持副本集或者分片集羣, 單節點MongoDB環境是沒法使用此特性的.html
本文將詳細介紹在CentOS7.4操做系統上搭建基於用戶認證的MongoDB4.0三節點的副本集集羣的完整過程.node
MongoDB官網下載中心 MongoDB4.0.3下載地址linux
# 三節點均執行
# 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 |
[注]:mongodb
1. 本文的三節點環境使用VirtualBox建立的三臺虛擬機. 配置集羣的過程與真實服務器無異. 本文MongoDB服務使用的端口統一改成9927, 也可直接使用默認的27017端口.數據庫
2. 虛擬機網絡選擇NAT網絡, 注意不是網絡地址轉換(NAT), 後者沒法支持虛擬機之間的網絡互通.服務器
3. 建議爲虛擬機能夠開啓端口映射(VirtualBox全局設定-網絡), 開啓端口映射後, 主機能夠經過ssh訪問虛擬機(映射22端口), 也能夠在主機上鍊接虛擬機的MongoDB服務(映射9927端口).網絡
4. 單服務器環境下一樣能夠配置MongoDB副本集集羣, 即"三節點"部署在一臺服務器上, 節點IP相同, 節點端口不一樣(如9927, 9928, 9929), 配置過程與三服務器大同小異(每一個"節點"需分配一個單獨的目錄).ssh
5. 爲保證集羣節點互通, 建議關閉虛擬機操做系統防火牆(systemctl disable firewalld, systemctl stop firewalld)或者爲防火牆開放9927端口(firewall-cmd --zone=public --add-port=9927/tcp --permanent, firewall-cmd --reload).tcp
目錄 | 用途 | 備註 |
/mgrs/data | Mongo集羣數據文件目錄 | |
/mgrs/logs | Mongo集羣系統日誌目錄 | |
/mgrs/conf | Mongo集羣配置文件目錄 |
[注]:spa
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三節點副本集集羣環境已經搭建完成.