一、简介
router:路由角色,提供接口,使得分片集群对外透明,不存储数据
configsvr:配置角色,存储元数据信息,分片集群后端有多份存储,读取数据去哪个存储上读取,依赖于配置角色
shardsvr:存储角色,存储真正的数据
用户通过touter角色插入数据时,需要从configsvr知道这份数据插入到哪个节点,然后执行插入动作插入数据到sharddsvr
用户通过touter角色查询数据时,需要从configsvr知道这份数据存储在哪个节点,然后去sharddsvr获取数据
二、搭建
创建数据节点,一主一从一仲裁
rsdata1:192.168.10.128:27015 192.168.10.129:27015 192.168.10.130:27015
rsdata2:192.168.10.128:27016 192.168.10.129:27016 192.168.10.130:27016
创建配置节点,一主两从
rsconfig:192.168.10.128:27018 192.168.10.129:27018 192.168.10.130:27018
路由节点
192.168.10.128:27017
1、数据节点搭建,三台机器操作一样
mkdir -p /mongodb/27015/{data,log,conf}
cat >/mongodb/27015/conf/mongod.conf <<EOF
storage:
dbPath: /mongodb/27015/data/
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /mongodb/27015/log/mongodb.log
net:
port: 27015
bindIp: 0.0.0.0
replication:
oplogSizeMB: 2048
#复制集名字,几个节点必须一样
replSetName: rsdata1
processManagement:
fork: true
pidFilePath: /mongodb/27015/log/mongod.pid
sharding:
clusterRole: shardsvr
EOF
cp -r /mongodb/27015/ /mongodb/27016
sed 's#27015#27016#g' /mongodb/27016/conf/mongod.conf -i
sed 's#rsdata1#rsdata2#g' /mongodb/27016/conf/mongod.conf -i
启动六个节点
mongod -f /mongodb/27015/conf/mongod.conf
mongod -f /mongodb/27016/conf/mongod.conf
搭建副本集
mongo --port 27015
use admin
config = {_id: 'rsdata1', members: [
{_id: 0, host: '192.168.10.128:27015'},
{_id: 1, host: '192.168.10.129:27015'},
{_id: 2, host: '192.168.10.130:27015',"arbiterOnly":true}]
}
rs.initiate(config)
mongo --port 27016
use admin
config = {_id: 'rsdata2', members: [
{_id: 0, host: '192.168.10.128:27016'},
{_id: 1, host: '192.168.10.129:27016'},
{_id: 2, host: '192.168.10.130:27016',"arbiterOnly":true}]
}
rs.initiate(config)
2、配置节点三台机器相同操作
mkdir -p /mongodb/27018/{data,log,conf}
cat >/mongodb/27018/conf/mongod.conf <<EOF
storage:
dbPath: /mongodb/27018/data/
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /mongodb/27018/log/mongodb.log
net:
port: 27018
bindIp: 0.0.0.0
replication:
oplogSizeMB: 2048
#复制集名字,几个节点必须一样
replSetName: rsconfig
processManagement:
fork: true
pidFilePath: /mongodb/27018/log/mongod.pid
sharding:
clusterRole: configsvr
EOF
mongod -f /mongodb/27018/conf/mongod.conf #启动服务
搭建副本集
mongo --port 27018
use admin
config = {_id: 'rsconfig', members: [
{_id: 0, host: '192.168.10.128:27018'},
{_id: 1, host: '192.168.10.129:27018'},
{_id: 2, host: '192.168.10.130:27018'}]
}
rs.initiate(config)
3、路由节点搭建,需要搭几个自己决定
mkdir -p /mongodb/27017/{data,log,conf}
cat > /mongodb/27017/conf/mongos.conf <<EOF
systemLog:
destination: file
path: /mongodb/27017/log/mongos.log
logAppend: true
net:
bindIp: 0.0.0.0
port: 27017
sharding:
#此处配置为配置节点副本集名称和三个ip+端口
configDB: rsconfig/192.168.10.128:27018,192.168.10.129:27018,192.168.10.130:27018
processManagement:
fork: true
EOF
mongos -f /mongodb/27017/conf/mongos.conf #启动服务
use admin #将数据节点加入到路由中,rsdata1和rsdata2分别是俩副本集的名字
db.runCommand( { addshard : "rsdata1/192.168.10.128:27015,192.168.10.129:27015,192.168.10.130:27015",name:"shard1"} )
db.runCommand( { addshard : "rsdata2/192.168.10.128:27016,192.168.10.129:27016,192.168.10.130:27016",name:"shard2"} )
移除命令
db.runCommand( { removeshard : "shard2"} )
移除时会自动转移分片数据,需要一个时间过程,完成后,再次执行删除分片命令才能真正删除
如果shard2有数据,转移需要时间
4、正式使用
默认是不启用分片的,如果不设置,默认是随机分配到一个数据集群节点上
以hash策略分片
use admin
db.runCommand( { enablesharding : "qingchen" } ) #激活数据库切片功能
db.runCommand( { shardcollection : "qingchen.hashqingchen",key : {_id: "hashed"} } ) #指定分片键对集合分片
for(i=0;i<5000;i++){
db.hashqingchen.insert({name:'myqingchen'+i,age:i})
}
插入5000条数据,两个数据集群节点分到大概2500条左右的数据,不会那么平均
以范围值分片
use admin
db.runCommand( { enablesharding : "qingchen" } )
use qingchen
db.zhifanwei.ensureIndex( { id: 1 } )
use admin
db.runCommand( { shardcollection : "qingchen.zhifanwei",key : {id: 1} } )
use qingchen
for(i=1;i<1000000;i++){ db.zhifanwei.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
如果分片集中在一个数据副本集节点,可以考虑将chunk调小,默认是64M,填满后才会考虑向其他片的数据块填充数据
use config
db.settings.save( { _id: "chunksize",value: 1 } )
##开始没设置,导致插了60多万条数据,都只在一个节点上,还以为范围值分片失败了
#范围值分片先往一个数据节点26000多条,然后再往另一个节点插入数据
####如何在两种策略之间选择
如果查询进行范围查找,建议范围值分片
如果正常查询数据,hash可以考虑
一个库的不同表可以分别选择hash或者值范围