当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据
为什么使用分片
- 复制所有的写入操作到主节点
- 延迟的敏感数据会在主节点查询
- 单个副本集限制在12个节点
- 当请求量巨大时会出现内存不足。
- 本地磁盘不足
- 垂直扩展价格昂贵
主要组件:
- Shard:
用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障
- Config Server:
mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
- Query Routers:
前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
* 提前建好data路径,和log路径
启动 mongo脚步如下:
#!/bin/bash
#this is mongo sharding cluser start shell
./bin/mongod --port 27021 --dbpath=data/shard1/ --logpath=log/shard1.log --logappend --fork
echo "shard1 start"
./bin/mongod --port 27022 --dbpath=data/shard2/ --logpath=log/shard2.log --logappend --fork
echo "shard2 start"
./bin/mongod --port 27023 --dbpath=data/shard3/ --logpath=log/shard3.log --logappend --fork
echo "shard3 start"
./bin/mongod --port 27100 --dbpath=data/config/ --logpath=log/config.log --logappend --fork
echo "config start"
./bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=log/route.log --chunkSize 500
echo "route start"
* kill 所有 mongo进程
#this is mongo sharding cluser start shell
./bin/mongod --port 27021 --dbpath=data/shard1/ --logpath=log/shard1.log --logappend --fork
echo "shard1 start"
./bin/mongod --port 27022 --dbpath=data/shard2/ --logpath=log/shard2.log --logappend --fork
echo "shard2 start"
./bin/mongod --port 27023 --dbpath=data/shard3/ --logpath=log/shard3.log --logappend --fork
echo "shard3 start"
./bin/mongod --port 27100 --dbpath=data/config/ --logpath=log/config.log --logappend --fork
echo "config start"
./bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=log/route.log --chunkSize 500
echo "route start"
* kill 所有 mongo进程
kill -3 ` ps -ef| grep mongod| grep -v grep| awk '{print $2}' `