和Replica Set 类似,都需要一个仲裁节点,但是Sharding 还需要配置节点和路由节点。就三种集
群搭建方式来说,这种是最复杂的。
配置数据节点
mkdir -p /opt/mongodb/shard/replset/replica1/data
mkdir -p /opt/mongodb/shard/replset/replica1/logs
mkdir -p /opt/mongodb/shard/replset/replica2/data
mkdir -p /opt/mongodb/shard/replset/replica2/logs
mkdir -p /opt/mongodb/shard/replset/replica3/data
mkdir -p /opt/mongodb/shard/replset/replica3/logs
vi /opt/mongodb/shard/replset/replica1/mongodb.cfg
dbpath=/opt/mongodb/shard/replset/replica1/data
logpath=/opt/mongodb/shard/replset/replica1/logs/mongodb.log
logappend=true
fork=true
bind_ip=47.107.182.164
port=27001
replSet=shard001
shardsvr=true
vi /opt/mongodb/shard/replset/replica2/mongodb.cfg
dbpath=/opt/mongodb/shard/replset/replica2/data
logpath=/opt/mongodb/shard/replset/replica2/logs/mongodb.log
logappend=true
fork=true
bind_ip=47.107.182.164
port=27002
replSet=shard001
shardsvr=true
vi /opt/mongodb/shard/replset/replica3/mongodb.cfg
dbpath=/opt/mongodb/shard/replset/replica3/data
logpath=/opt/mongodb/shard/replset/replica3/logs/mongodb.log
logappend=true
fork=true
bind_ip=47.107.182.164
port=27003
replSet=shard001
shardsvr=true
2.启动数据节点
mongod -f /opt/mongodb/shard/replset/replica1/mongodb.cfg
#47.107.182.164:27001
mongod -f /opt/mongodb/shard/replset/replica2/mongodb.cfg
#47.107.182.164:27002
mongod -f /opt/mongodb/shard/replset/replica3/mongodb.cfg
#47.107.182.164:27003
3、使数据节点集群生效
mongo 47.107.182.164:27001 #ip 和port 是某个节点的地址
cfg={_id:"shard001",members:[{_id:0,host:'47.107.182.164:27001'},{_i
d:1,host:'47.107.182.164:27002'},{_id:2,host:'47.107.182.164:27003'
}]};
rs.initiate(cfg) #使配置生效
4、配置configsvr(配置节点)
mkdir -p /opt/mongodb/shard/configsvr/config1/data
mkdir -p /opt/mongodb/shard/configsvr/config1/logs
mkdir -p /opt/mongodb/shard/configsvr/config2/data
mkdir -p /opt/mongodb/shard/configsvr/config2/logs
mkdir -p /opt/mongodb/shard/configsvr/config3/data
mkdir -p /opt/mongodb/shard/configsvr/config3/logs
/opt/mongodb/shard/configsvr/config1/mongodb.cfg
dbpath=/opt/mongodb/shard/configsvr/config1/data
configsvr=true
port=28001
fork=true
logpath=/opt/mongodb/shard/configsvr/config1/logs/mongodb.log
replSet=configrs
logappend=true
bind_ip=47.107.182.164
/opt/mongodb/shard/configsvr/config2/mongodb.cfg
dbpath=/opt/mongodb/shard/configsvr/config2/data
configsvr=true
port=28002
fork=true
logpath=/opt/mongodb/shard/configsvr/config2/logs/mongodb.log
replSet=configrs
logappend=true
bind_ip=47.107.182.164
/opt/mongodb/shard/configsvr/config3/mongodb.cfg
dbpath=/opt/mongodb/shard/configsvr/config3/data
configsvr=true
port=28003
fork=true
logpath=/opt/mongodb/shard/configsvr/config3/logs/mongodb.log
replSet=configrs
logappend=true
bind_ip=47.107.182.164
5、启动configsvr 节点
mongod -f /opt/mongodb/shard/configsvr/config1/mongodb.cfg
#47.107.182.164:28001
mongod -f /opt/mongodb/shard/configsvr/config2/mongodb.cfg
#47.107.182.164:28002
mongod -f /opt/mongodb/shard/configsvr/config3/mongodb.cfg
#47.107.182.164:28003
6、使configsvr 节点集群生效
mongo 47.107.182.164:28001 #ip 和port 是某个节点的地址
use admin #先切换到admin
cfg={_id:"configrs",members:[{_id:0,host:'47.107.182.164:28001'},{_i
d:1,host:'47.107.182.164:28002'},{_id:2,host:'47.107.182.164:28003'
}]};
rs.initiate(cfg) #使配置生效
配置路由节点
mkdir -p /opt/mongodb/shard/routesvr/logs
#注意:路由节点没有data 文件夹
vi /opt/mongodb/shard/routesvr/mongodb.cfg
configdb=configrs/47.107.182.164:28001,47.107.182.164:28002,47.107.182.164:28003//配置节点
port=30000
fork=true
logpath=/opt/mongodb/shard/routesvr/logs/mongodb.log
logappend=true
bind_ip=47.107.182.164
7.启动路由节点
./mongos -f /opt/mongodb/shard/routesvr/mongodb.cfg
#47.107.182.164:30000
这里我们没有用配置文件的方式启动,其中的参数意义大家应该都明白。一般来说一个数据节点对应一
个配置节点,仲裁节点则不需要对应的配置节点。注意在启动路由节点时,要将配置节点地址写入到启
动命令里。
4.配置Replica Set
这里可能会有点奇怪为什么Sharding 会需要配置Replica Set。其实想想也能明白,多个节点的数据
肯定是相关联的,如果不配一个Replica Set,怎么标识是同一个集群的呢。这也是人家mongodb 的
规定,咱们还是遵守吧。配置方式和之前所说的一样,定一个cfg,然后初始化配置。
8.配置Sharding
mongo 47.107.182.164:30000 #这里必须连接路由节点
sh.addShard("shard001/47.107.182.164:27001");
sh.addShard("shard002/47.107.182.164:27017");
#shard001、shard002 表示replica set 的名字当把主节点添加到shard 以后,会
自动找到set 里的主,备,决策节点
use testdb
sh.enableSharding("testdb") #testdb is database name
sh.shardCollection("testdb.testcon",{"name":”hashed”})
db.collection.status()
第一个命令很容易理解,第二个命令是对需要进行Sharding 的数据库进行配置,第三个命令是对需要
进行Sharding 的Collection 进行配置,这里的testcon 即为Collection 的名字。另外还有个key,
这个是比较关键的东西,对于查询效率会有很大的影响。
到这里Sharding 也已经搭建完成了,以上只是最简单的搭建方式,其中某些配置仍然使用的是默
认配置。如果设置不当,会导致效率异常低下,所以建议大家多看看官方文档再进行默认配置的修改。
以上三种集群搭建方式首选Replica Set,只有真的是大数据,Sharding 才能显现威力,毕竟备
节点同步数据是需要时间的。Sharding 可以将多片数据集中到路由节点上进行一些对比,然后将数据
返回给客户端,但是效率还是比较低的说。
我自己有测试过,不过具体的机器配置已经不记得了。Replica Set(副本集) 的ips 在数据达到1400W 条时基
本能达到1000 左右,而Sharding 在300W 时已经下降到500 IPS,两者的单位数据大小大概是10kb。
大家在应用的时候还是多多做下性能测试,毕竟不像Redis 有参照。