MongoDB 4.2.0分片集群搭建

  • Post author:
  • Post category:其他




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



版权声明:本文为liver_life原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。