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().