四、mongodb集群搭建

一、简介

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或者值范围

?

上一篇:MySQL 安装、导入测试数据及开启慢查询日志


下一篇:MySQL基础 - MySQL的数据目录