MongoDB 4.2.0分片集群搭建
MongoDB分片集群搭建
一.環境介紹
系統環境
操作系統 | 主機名 | IP地址 |
---|---|---|
CentOS Linux release 7.6.1810 (Core) | mongox | 10.0.0.4 |
CentOS Linux release 7.6.1810 (Core) | mongoy | 10.0.0.5 |
CentOS Linux release 7.6.1810 (Core) | mongoz | 10.0.0.6 |
MongoDB版本
當前使用的MongoDB版本為4.2.0,下載地址.
關閉防火牆
systemctl stop filewalld
集群架構
副本集
若要查看具體的文檔,可以訪問官方文檔,文章中很多內容都可以參考https://docs.mongodb.com/manual/,地址
分片
二.安裝
創建用戶
創建目錄
#創建日志目錄
mkdir -p /var/log/mongodb/
touch /var/log/mongodb/mongod{0,1,2}.log
touch /var/log/mongodb/csvr.log
#創建存儲目錄
mkdir -p /data/mongodb/{0,1,2,csvr}
配置副本集
在每台機器上都創建下列三個文件
#mongod0.yaml
systemLog:
destination: file
path: "/var/log/mongodb/mongod0.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/data/mongodb/0"
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 27016
setParameter:
enableLocalhostAuthBypass: false
replication:
replSetName: "rs0"
sharding:
clusterRole: shardsvr
#mongod1.yaml
systemLog:
destination: file
path: "/var/log/mongodb/mongod1.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/data/mongodb/1"
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 27017
setParameter:
enableLocalhostAuthBypass: false
replication:
replSetName: "rs1"
sharding:
clusterRole: shardsvr
#mongod2.yaml
systemLog:
destination: file
path: "/var/log/mongodb/mongod2.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/data/mongodb/2"
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 27018
setParameter:
enableLocalhostAuthBypass: false
replication:
replSetName: "rs2"
sharding:
clusterRole: shardsvr
初始化副本集
#在每台機器上都執行
bin/mongod -f mongod0.yaml
bin/mongod -f mongod1.yaml
bin/mongod -f mongod2.yaml
#任意一台機器執行,進去到mongo shell
bin/mongo -port 27016
#在mongo shell中執行
rs.initiate( {
_id : "rs0",
members: [
{ _id: 0, host: "mongox:27016" },
{ _id: 1, host: "mongoy:27016" },
{ _id: 2, host: "mongoz:27016" }
]
})
#任意一台機器執行,進去到mongo shell
bin/mongo -port 27017
#在mongo shell中執行
rs.initiate( {
_id : "rs1",
members: [
{ _id: 0, host: "mongox:27017" },
{ _id: 1, host: "mongoy:27017" },
{ _id: 2, host: "mongoz:27017" }
]
})
#任意一台機器執行,進去到mongo shell
bin/mongo -port 27018
#在mongo shell中執行
rs.initiate( {
_id : "rs2",
members: [
{ _id: 0, host: "mongox:27018" },
{ _id: 1, host: "mongoy:27018" },
{ _id: 2, host: "mongoz:27018" }
]
})
配置服務器
創建配置文件
#mongox主機上,csvr.yaml
systemLog:
destination: file
#日志存儲位置
path: "/var/log/mongodb/csvr.log"
logAppend: true
storage:
journal:
enabled: true
#數據文件存儲位置
dbPath: "/data/mongodb/csvr"
#是否一個庫一個文件夾
directoryPerDB: true
#WT引擎配置
wiredTiger:
engineConfig:
#WT最大使用cache(根據服務器實際情況調節)
cacheSizeGB: 1
#是否將索引也按數據庫名單獨存儲
directoryForIndexes: true
#表壓縮配置
collectionConfig:
blockCompressor: zlib
#索引配置
indexConfig:
prefixCompression: true
#端口配置
net:
bindIp: mongox
port: 27019
replication:
oplogSizeMB: 2048
replSetName: csvr
sharding:
clusterRole: configsvr
processManagement:
fork: true
在mongox主機上執行該文件,bin/mongod -f csvr.yaml
#mongoy主機上,csvr.yaml
systemLog:
destination: file
#日志存儲位置
path: "/var/log/mongodb/csvr.log"
logAppend: true
storage:
journal:
enabled: true
#數據文件存儲位置
dbPath: "/data/mongodb/csvr"
#是否一個庫一個文件夾
directoryPerDB: true
#WT引擎配置
wiredTiger:
engineConfig:
#WT最大使用cache(根據服務器實際情況調節)
cacheSizeGB: 1
#是否將索引也按數據庫名單獨存儲
directoryForIndexes: true
#表壓縮配置
collectionConfig:
blockCompressor: zlib
#索引配置
indexConfig:
prefixCompression: true
#端口配置
net:
bindIp: mongoy
port: 27019
replication:
oplogSizeMB: 2048
replSetName: csvr
sharding:
clusterRole: configsvr
processManagement:
fork: true
在mongoy主機上執行該文件,`bin/mongod -f csvr.yaml
#mongoz主機上,csvr-mongoz.yaml
systemLog:
destination: file
#日志存儲位置
path: "/var/log/mongodb/csvr.log"
logAppend: true
storage:
journal:
enabled: true
#數據文件存儲位置
dbPath: "/data/mongodb/csvr"
#是否一個庫一個文件夾
directoryPerDB: true
#WT引擎配置
wiredTiger:
engineConfig:
#WT最大使用cache(根據服務器實際情況調節)
cacheSizeGB: 1
#是否將索引也按數據庫名單獨存儲
directoryForIndexes: true
#表壓縮配置
collectionConfig:
blockCompressor: zlib
#索引配置
indexConfig:
prefixCompression: true
#端口配置
net:
bindIp: mongoz
port: 27019
replication:
oplogSizeMB: 2048
replSetName: csvr
sharding:
clusterRole: configsvr
processManagement:
fork: true
在mongoz主機上執行該文件,`bin/mongod -f csvr.yaml
初始化配置服務器
#切換到mongo shell
bin/mongo --host mongox --port 27019
#在mongo shell中執行
rs.initiate( {
_id : "csvr",
configsvr: true,
members: [
{ _id: 0, host: "mongox:27019" },
{ _id: 1, host: "mongoy:27019" },
{ _id: 2, host: "mongoz:27019" }
]
})
mongos的配置
創建配置文件
#mongox主機上創建mongos0.yaml
systemLog:
destination: file
path: "/var/log/mongodb/mongos.log"
logAppend: true
net:
bindIp: mongox
port: 27020
# 將confige server 添加到路由
sharding:
configDB: csvr/mongox:27019,mongoy:27019,mongoz:27019
processManagement:
fork: true
#在mongox上執行
bin/mongos -f mongos0.yaml
#mongoy主機上創建mongos1.yaml
systemLog:
destination: file
path: "/var/log/mongodb/mongos.log"
logAppend: true
net:
bindIp: mongoy
port: 27020
# 將confige server 添加到路由
sharding:
configDB: csvr/mongox:27019,mongoy:27019,mongoz:27019
processManagement:
fork: true
#在mongoy上執行
bin/mongos -f mongos1.yaml
#mongoz主機上創建mongos2.yaml
systemLog:
destination: file
path: "/var/log/mongodb/mongos.log"
logAppend: true
net:
bindIp: mongoz
port: 27020
# 將confige server 添加到路由
sharding:
configDB: csvr/mongox:27019,mongoy:27019,mongoz:27019
processManagement:
fork: true
#在mongoz上執行
bin/mongos -f mongos2.yaml
登錄到mongos
#任意一台主機執行都可以,當前在mongox上執行
bin/mongos mongox:27020
添加分片
use admin
db.runCommand( { addshard : "rs0/mongox:27016,mongoy:27016,mongoz:27016",name:"shard1"} )
db.runCommand( { addshard : "rs1/mongox:27017,mongoy:27017,mongoz:27017",name:"shard2"} )
db.runCommand( { addshard : "rs2/mongox:27018,mongoy:27018,mongoz:27018",name:"shard3"} )
激活分片
需要注意的是,分片功能是需要手動開啟的.
在mongo shell中,這里設置一個測試數據庫,用來測試分片的功能.
db.runCommand( { enablesharding : "testdb" } )
db.runCommand( { shardcollection : "testdb.users",key : {id: 1} } )
創建測試數據,用來測試分片功能,下面的代碼向數據庫中插入了200w條數據,由於數據量比較大,所以批量插入的時候,時間會稍微有點久.
var arr=[];
for(var i=0;i<2000000;i++){
var uid = i;
var name = "mongodb"+i;
arr.push({"id":uid,"name":name});
}
db.users.insertMany(arr);
查詢狀態
通過sh.status()函數查看當前分片的狀態,查看副本集的狀態通過rs.status().
庫,用來測試分片的功能.
db.runCommand( { enablesharding : "testdb" } )
db.runCommand( { shardcollection : "testdb.users",key : {id: 1} } )
創建測試數據,用來測試分片功能,下面的代碼向數據庫中插入了200w條數據,由於數據量比較大,所以批量插入的時候,時間會稍微有點久.
var arr=[];
for(var i=0;i<2000000;i++){
var uid = i;
var name = "mongodb"+i;
arr.push({"id":uid,"name":name});
}
db.users.insertMany(arr);
查詢狀態
通過sh.status()函數查看當前分片的狀態,查看副本集的狀態通過rs.status().