版本
mongodb-linux-x86_64-3.2.12
分片的概念
为了突破单点数据库服务器的I/O能力限制,对数据库存储进行水平扩展。严格地说,每一个服务器或者实例或者复制集就是一个分片。
分片的优势
(1)提供类似线性增长架构
(2)提高数据库可用性
(3)提高大型数据库查询服务性能
什么时候需要分片
(1)单点数据库服务器存储成为瓶颈
(2)单点数据库服务器的性能成为瓶颈
(3)大型应用分散数据以充分利用内存
如何部署分片
路由实例:接收客户端请求
配置实例:分片及复制集的配置信息
服务器角色及相关配置文件
服务器 | 角色 | 标志 |
127.0.0.1:47017 | 分片服务器(主) | shard1 |
127.0.0.1:47018 | 分片服务器 | Shard2 |
127.0.0.1:37017 | 配置实例服务器 | configs |
127.0.0.1:27017 | 路由服务器 | route |
127.0.0.1:47019 | 分片服务器(从) | shard1 |
[root@iZ4jc05d2ictd0xzg4lzteZ opt]# vi mongodbshard1.cnf
dbpath=/opt/mongodb/datashard1
port=47017
logpath=/opt/mongodb/logs
fork=true
logappend=true
shardsvr=true
replSet=shard1
[root@iZ4jc05d2ictd0xzg4lzteZ opt]# vi mongodbshard2.cnf
dbpath=/opt/mongodb/datashard2
port=47018
logpath=/opt/mongodb/logs
fork=true
logappend=true
shardsvr=true
replSet=shard2
[root@iZ4jc05d2ictd0xzg4lzteZ opt]# vi mongodbshard3.cnf
dbpath=/opt/mongodb/datashard3
port=37017
logpath=/opt/mongodb/logs
fork=true
logappend=true
configsvr=true
replSet=configs
[root@iZ4jc05d2ictd0xzg4lzteZ opt]# vi mongodbshard6.cnf
dbpath=/opt/mongodb/datashard5
port=47019
logpath=/opt/mongodb/logs
fork=true
logappend=true
shardsvr=true
replSet=shard1
启动并初始化相关服务
./mongod -f /opt/mongodbshard1.cnf
./mongo --port 47017
cfg={_id:'shard1',members:[ {_id:0,host:'127.0.0.1:47017'} ]}
rs.initiate(cfg)
./mongod -f /opt/mongodbshard2.cnf
./mongo --port 47018
cfg={_id:'shard2',members:[ {_id:0,host:'127.0.0.1:47018'} ]}
rs.initiate(cfg)
./mongod -f /opt/mongodbshard3.cnf
./mongo --port 37017
cfg={_id:'configs',members:[ {_id:0,host:'127.0.0.1:37017'} ]}
rs.initiate(cfg)
添加相关分片
[root@iZ4jc05d2ictd0xzg4lzteZ bin]# ./mongos --port 27017 --fork --logappend --logpath /opt/mongodb/route.log --configdb configs/127.0.0.1:37017 --chunkSize 1
设置1M是为了测试,否则要插入大量数据才能分片。
[root@iZ4jc05d2ictd0xzg4lzteZ bin]# ./mongo --port 27017
mongos> use admin
mongos> sh.addShard("shard1/127.0.0.1:47017")
{
"shardAdded" : "shard1",
"ok" : 1,
"operationTime" : Timestamp(1551230697, 10),
"$clusterTime" : {
"clusterTime" : Timestamp(1551230697, 10),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
db.runCommand( { enablesharding :"testdb"}); //指定分片的库
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } ) //指定分片的ns及相关的分片健
mongos> for (var i=100001;i<=200000;i++){
... db.table1.insert({id:i,name:"hxf"})
... }
或
for (var i=1;i<=100000;i++){ db.table1.insert({id:i,name:"hxf"}) } //向分片的集合写入相关数据
此时生产11个chunkSize全部存放在shard1中
mongos> sh.addShard("shard2/127.0.0.1:47018") //加入shard2
{
"shardAdded" : "shard2",
"ok" : 1,
"operationTime" : Timestamp(1551230802, 4),
"$clusterTime" : {
"clusterTime" : Timestamp(1551230802, 4),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
此时生产11个chunkSize 放在shard1中为6个,shard2中为5个,均匀分配
删除相关分片
mongos> db.runCommand( { removeshard: "shard2" } )
此时生产11个chunkSize 放在shard1中为11个,shard2中为0个,均匀分配
mongos> use config
mongos> db.shards.find() //将该集合的shard2的记录删除掉
分片服务器的主从复制配置
./mongod -f /opt/mongodbshard6.cnf
./mongod -f /opt/mongodbshard1.cnf
./mongo --port 47017
cfg={_id:'shard1',members:[ {_id:0,host:'127.0.0.1:47017'},{_id:1,host:'127.0.0.1:47019'} ]}
rs.initiate(cfg)
./mongod -f /opt/mongodbshard2.cnf
./mongo --port 47018
cfg={_id:'shard2',members:[ {_id:0,host:'127.0.0.1:47018'} ]}
rs.initiate(cfg)
./mongod -f /opt/mongodbshard3.cnf
./mongo --port 37017
cfg={_id:'configs',members:[ {_id:0,host:'127.0.0.1:37017'} ]}
rs.initiate(cfg)
[root@iZ4jc05d2ictd0xzg4lzteZ bin]# ./mongos --port 27017 --fork --logappend --logpath /opt/mongodb/route.log --configdb configs/127.0.0.1:37017 --chunkSize 1
[root@iZ4jc05d2ictd0xzg4lzteZ bin]# ./mongo --port 27017
mongos> sh.addShard("shard1/127.0.0.1:47017,127.0.0.1:47019")
{ "shardAdded" : "shard1", "ok" : 1 }
此时能够实现主从备份,但由于水平有限,在故障时不能实现主从切换
当前分片实例的查看
sh.status()
分片需要索引及相关原则
uid 顺序增长 且 唯一
按uid分片
sex:1,2,3,使用的是固定值按sex分片
salary:2000-7000 的随机值,按saraly分片
原则:结合业务需求,尽可能选择存储分片均匀的键
(1)字段的值有限
结果:理论上分片有限
(2)时间戳或者自动增长ID
结果:数据大多都逻辑连续和顺序地插入到一个分片上
优点:无限数量的字段值,提供无限数量的分片
缺点:单一且不可分散的热点
(3)随机片键
优点:分散热点
缺点:数据越大,性能越差
(4)结合业务特点,组合的搜索条件就是片键
结果:高效