使用 Sharded cluster 时,通常是要解决如下2个问题
- 存储容量受单机限制,即磁盘资源遭遇瓶颈。
- 读写能力受单机限制(读能力也可以在复制集里加 secondary 节点来扩展),可能是 CPU、内存或者网卡等资源遭遇瓶颈,导致读写能力无法扩展。
Sharded模式图
创建3个配置服务(configsvr)
docker run -d -p 40001:40001 --privileged=true -v cnf40001:/data/db --name cnf_c1 mongo:latest --configsvr --port 40001 --dbpath /data/db --replSet crs
docker run -d -p 40002:40002 --privileged=true -v cnf40002:/data/db --name cnf_c2 mongo:latest --configsvr --port 40002 --dbpath /data/db --replSet crs
docker run -d -p 40003:40003 --privileged=true -v cnf40003:/data/db --name cnf_c3 mongo:latest --configsvr --port 40003 --dbpath /data/db --replSet crs
任意选择crs分片的一个副本
mongo --port 40001
切换数据库
use admin
写配置文件
config = {_id:"crs", configsvr:true, members:[ {_id:0,host:"192.168.31.82:40001"}, {_id:1,host:"192.168.31.82:40002"}, {_id:2,host:"192.168.31.82:40003"} ] }
初始化副本集配置
rs.initiate(config)
如果已经初始化过,使用下面的强制配置
rs.reconfig(config,{force:true})
查看副本集状态
rs.status()
创建2个分片服务(shardsvr),每个shardsvr包含3个副本,其中1个主节点,1个从节点,1个仲裁节点。
docker run -d -p 20001:20001 --privileged=true -v db20001:/data/db --name rs1_c1 mongo:latest --shardsvr --port 20001 --dbpath /data/db --replSet rs1
docker run -d -p 20002:20002 --privileged=true -v db20002:/data/db --name rs1_c2 mongo:latest --shardsvr --port 20002 --dbpath /data/db --replSet rs1
docker run -d -p 20003:20003 --privileged=true -v db20003:/data/db --name rs1_c3 mongo:latest --shardsvr --port 20003 --dbpath /data/db --replSet rs1
任意选择rs1分片的一个副本
mongo --port 20001
切换数据库
use admin
写配置文件
config = {_id:"rs1",members:[ {_id:0,host:"192.168.31.82:20001"}, {_id:1,host:"192.168.31.82:20002"}, {_id:2,host:"192.168.31.82:20003",arbiterOnly:true} ] }
初始化副本集配置
rs.initiate(config)
如果已经初始化过,使用下面的强制配置
rs.reconfig(config,{force:true})
查看副本集状态
rs.status()
结果
rs1:RECOVERING> rs.status()
{
"set" : "rs1",
"date" : ISODate("2016-12-20T09:01:16.108Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.31.82:20001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 7799,
"optime" : {
"ts" : Timestamp(1482224415, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-12-20T09:00:15Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1482224414, 1),
"electionDate" : ISODate("2016-12-20T09:00:14Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.31.82:20002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 71,
"optime" : {
"ts" : Timestamp(1482224415, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-12-20T09:00:15Z"),
"lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"),
"lastHeartbeatRecv" : ISODate("2016-12-20T09:01:15.376Z"),
"pingMs" : NumberLong(1),
"syncingTo" : "192.168.30.200:20001",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.31.82:20003",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 71,
"lastHeartbeat" : ISODate("2016-12-20T09:01:15.016Z"),
"lastHeartbeatRecv" : ISODate("2016-12-20T09:01:11.334Z"),
"pingMs" : NumberLong(0),
"configVersion" : 1
}
],
"ok" : 1
}
创建2个分片服务(shardsvr),每个shardsvr包含3个副本,其中1个主节点,1个从节点,1个仲裁节点。
docker run -d -p 30001:30001 --privileged=true -v db30001:/data/db --name rs2_c1 mongo:latest --shardsvr --port 30001 --dbpath /data/db --replSet rs2
docker run -d -p 30002:30002 --privileged=true -v db30002:/data/db --name rs2_c2 mongo:latest --shardsvr --port 30002 --dbpath /data/db --replSet rs2
docker run -d -p 30003:30003 --privileged=true -v db30003:/data/db --name rs2_c3 mongo:latest --shardsvr --port 30003 --dbpath /data/db --replSet rs2
任意选择rs2分片的一个副本
mongo --port 30001
切换数据库
use admin
写配置文件
config = {_id:"rs2",members:[ {_id:0,host:"192.168.31.82:30001"}, {_id:1,host:"192.168.31.82:30002"}, {_id:2,host:"192.168.31.82:30003",arbiterOnly:true} ] }
初始化副本集配置
rs.initiate(config)
如果已经初始化过,使用下面的强制配置
rs.reconfig(config,{force:true})
查看副本集状态
rs.status()
创建2个路由服务(mongos)
docker run -d -p 50001:50001 --privileged=true --name ctr50001 mongo:latest mongos --configdb crs/192.168.31.82:40001,192.168.31.82:40002,192.168.31.82:40003 --port 50001 --bind_ip 0.0.0.0
docker run -d -p 50002:50002 --privileged=true --name ctr50002 mongo:latest mongos --configdb crs/192.168.31.82:40001,192.168.31.82:40002,192.168.31.82:40003 --port 50002 --bind_ip 0.0.0.0
通过mongos添加分片关系到configsvr。
选择路由服务
mongo --port 50001
切换数据库
use admin
添加shard
db.runCommand({addshard:"rs1/192.168.31.82:20001,192.168.31.82:20002,192.168.31.82:20003"})
db.runCommand({addshard:"rs2/192.168.31.82:30001,192.168.31.82:30002,192.168.31.82:30003"})
查询结果 [仲裁节点不显示]
db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "rs1",
"host" : "rs1/192.168.31.82:20001,192.168.31.82:20002"
},
{
"_id" : "rs2",
"host" : "rs2/192.168.31.82:30001,192.168.31.82:30002"
}
],
"ok" : 1
}
测试示例
设置数据库、集合分片 [说明:并不是数据库中所有集合都分片,只有设置了shardcollection才分片,因为不是所有的集合都需要分片。]
db.runCommand({enablesharding:"mydb"})
db.runCommand({shardcollection:"mydb.person", key:{id:1, company:1}})
测试分片
use mydb
for (i =0; i<10000;i++){
db.person.save({id:i, company:"baidu"})}
测试结果
db.person.stats()
评论 (0)