分片是每个节点存储数据的不同片段,复制集是每个节点存储数据的相同副本

mongos:接收请求和路由请求

config servers:记录所有节点信息

shard:分片集存储数据

Mongodb版本:3.4.24

查看版本命令:mongo version

1. 端口分配和目录创建

1.1 端口分配

这个是用作下面配置文件里的,找些没用的端口,不用自己去分配

验证端口是否被使用命令:netstat -ap | grep 端口

集群节点

192.168.2.195

192.168.2.196

192.168.2.197

configsvr(配置服务)

192.168.2.195:20000

192.168.2.196:20000

192.168.2.197:20000

mongos(路由)

192.168.2.195:27017

192.168.2.196:27017

192.168.2.197:27017

Shard(分片)

192.168.2.195:26021

192.168.2.196:26021

192.168.2.197:26021

副本集:每个分片只有一个副本集,没有冗余备份。

1.2 目录创建

每台设备都要创建

dbpath( 数据库配置路径):

mkdir -p /flash/system/volume/database/shard_test #数据库存储

mkdir -p /flash/system/volume/data/test/shard_test #分片存储

Logpath(日志文件配置):

mkdir -p /var/log/test/shard_test #这条没有,方便复制粘贴命令加上的

touch /var/log/test/shard_test/config.log #config server日志

touch /var/log/test/shard_test/route.log #route日志

touch /var/log/test/shard_test/shard.log #shard日志

2. config server配置服务器

2.1 配置服务器

每台设备都要配置

vi /usr/etc/dbconf/npbase_shard.conf

fork=true

quiet=true

nounixsocket=true

bind_ip=0.0.0.0

port=20000

logappend=true

configsvr=true

replSet=configs

logpath=/var/log/test/shard_test/config.log

dbpath=/flash/system/volume/database/shard_test

2.2 配置完成后启动config server

每台设备都要启动

mongod -f /usr/etc/dbconf/npbase_shard.conf

2.3 初始化配置服务器副本集

进入Mongo命令行,可选择任意配置服务器节点初始化配置副本集

只需要在一台设备上初始化

mongo -port 20000

config = (

{

_id : "configs",

members: [

{ _id : 0, host : "192.168.2.195:20000" },

{ _id : 1, host : "192.168.2.196:20000" },

{ _id : 2, host : "192.168.2.197:20000" },

]

}

)

初始化之前要保证每台设备都启动完毕,配置好了,不然会报错

rs.initiate(config)

mongodb如何切片备份 mongodb分片命令_数据库

3. shard分片集

3.1 配置分片集

shard分片集是实际存储数据的地方,配置shard一定要配置shardsvr=true。

每台设备都要配置,每台机子蓝字的地方需要改完自己IP

vi /usr/etc/dbconf/shard_test.conf

--------------分片1-----------------------

fork=true

nounixsocket=true

bind_ip=192.168.2.195

port=26021

logappend=true

shardsvr=true

replSet=shard1

logpath=/var/log/test/shard_test/shard.log

dbpath=/flash/system/volume/data/test/shard_test

--------------分片2-----------------------

fork=true

nounixsocket=true

bind_ip=192.168.2.196

port=26021

logappend=true

shardsvr=true

replSet=shard2

logpath=/var/log/test/shard_test/shard.log

dbpath=/flash/system/volume/data/test/shard_test

--------------分片3-----------------------

fork=true

nounixsocket=true

bind_ip=192.168.2.197

port=26021

logappend=true

shardsvr=true

replSet=shard3

logpath=/var/log/test/shard_test/shard.log

dbpath=/flash/system/volume/data/test/shard_test

3.2 开启shard服务

每台设备都要开启,每个shard节点服务都要开启

mongod -f /usr/etc/dbconf/shard_test.conf

3.3 初始化shard分片副本集

每台设备上都要初始化

mongo -port 26021 -host 192.168.2.195

config = (

{

_id : "shard1",

members: [

{ _id : 0, host : "192.168.2.195:26021" },

]

}

)

初始化之前要保证每台设备都启动完毕,配置好了,不然会报错

rs.initiate(config)

--------------分片2-----------------------

mongo -port 26021 -host 192.168.2.196

config = (

{

_id : "shard2",

members: [

{ _id : 0, host : "192.168.2.196:26021" },

]

}

)

初始化之前要保证每台设备都启动完毕,配置好了,不然会报错

rs.initiate(config)

--------------分片3-----------------------

mongo -port 26021 -host 192.168.2.197

config = (

{

_id : "shard3",

members: [

{ _id : 0, host : "192.168.2.197:26021" },

]

}

)

初始化之前要保证每台设备都启动完毕,配置好了,不然会报错

rs.initiate(config)

mongodb如何切片备份 mongodb分片命令_初始化_02

 

4. 配置mogos路由服务

4.1 参数启动

mongodb中的router(mongos)角色只负责提供一个入口,不存储任何的数据,router最重要的配置是指定configsvr的地址,使用复制集ip+端口的方式指定配置多个router,任何一个都能正常的获取数据。

每台设备都需要启动,蓝字的地方需要根据机子变动

mongos --port 27017 --configdb configs/192.168.2.195:20000,192.168.2.196:20000,192.168.2.197:20000 --logpath /var/log/test/shard_test/route.log --fork

4.2 将之前配置好的shard副本集添加到分片中

只需要在一台设备上初始化

mongo admin -port 27017

sh.addShard("shard1/192.168.2.195:26021")

sh.addShard("shard2/192.168.2.196:26021")

sh.addShard("shard3/192.168.2.197:26021")

查看分片

sh.status()

mongodb如何切片备份 mongodb分片命令_mongodb_03

mongodb如何切片备份 mongodb分片命令_mongodb如何切片备份_04

4.3指定数据库和集合分片策略

在刚刚初始化的那台机子上

接下来需要指定数据库分片并配置片键,片键必须是索引。

激活数据库分片功能

db.runCommand({ enablesharding:"shardtest" })

开启Hash分片

db.runCommand({ shardcollection: "shardtest.test", key: { _id:"hashed"}})

mongodb如何切片备份 mongodb分片命令_mongodb_05

 

5.测试

5.1插入数据测试

mongo admin -port 27017

#切换到db shardtest

use shardtest

#往shardtest的test集合中插入20000条数据

for(i=1;i<20001;i++){db.test.insert({"name":"test","number":i,"date":new Date()});}

#查看test表中的记录数,判断数据是否插入成功

db.getCollection('test').count()

mongodb如何切片备份 mongodb分片命令_数据库_06

5.2 分片结果测试

20000条数据经过hash算法分别插入到了三个分片中。

三个分片分别插入了6725条、9942条记录、9942条记录。

#分片一:6725条记录

mongo -port 26021 -host 192.168.2.195

use shardtest

db.getCollection('test').count()

mongodb如何切片备份 mongodb分片命令_mongodb如何切片备份_07

#分片二:6589条记录

mongo -port 26021 -host 192.168.2.196

use shardtest

db.getCollection('test').count()

mongodb如何切片备份 mongodb分片命令_分布式_08

#分片三:6686条记录

mongo -port 26021 -host 192.168.2.197

use shardtest

db.getCollection('test').count()

mongodb如何切片备份 mongodb分片命令_mongodb如何切片备份_09

  

5.3 关闭一个分片节点测试

结束其中一个分片节点,再次查询shardtest数据库中test集合数量,系统报错

mongodb如何切片备份 mongodb分片命令_数据库_10