mongodb分片集可以将数据分布到多台机器多个mongo实例中, 实现横向扩展, 解决单机容量不足的问题. 今天用docker试验了在单机部署分片集, 记录一下方法.

0. 简介

Shard和ConfigServer本质上都是mongod实例, 配置文件中sharding.clusterRole不同 这里, 我们创建Shard启动2个副本集(rs0, rs1), 每个副本集有3个实例, 创建ConfigServer启动1个副本集(cfg), 包含3个实例. 即, 共有9个mongod实例, 其中6个用于Shard, 3个用于ConfigServer.

1. 创建Shard副本集(shardsvr)

创建三个mongod实例(27018, 27019, 27020)作为副本集rs0

1
mkdir -p /home/nolan/mongo/m_27018

在上述目录添加配置文件mongod.conf, 内容如下

1
2
3
4
5
6
7
net:
    port: 27018
    bindIp: 0.0.0.0    
replication:
    replSetName: rs0
sharding:
    clusterRole: shardsvr

启动三个实例

1
2
3
docker run -p 27018:27018 --restart always -v /home/nolan/mongo/m_27018:/data -v /home/nolan/mongo/m_27018/db:/data/db --name m_27018 -d mongo mongod -f /data/mongod.conf --bind_ip_all
docker run -p 27019:27019 --restart always -v /home/nolan/mongo/m_27019:/data -v /home/nolan/mongo/m_27019/db:/data/db --name m_27019 -d mongo mongod -f /data/mongod.conf --bind_ip_all
docker run -p 27020:27020 --restart always -v /home/nolan/mongo/m_27020:/data -v /home/nolan/mongo/m_27020/db:/data/db --name m_27020 -d mongo mongod -f /data/mongod.conf --bind_ip_all

m_27019, m_27020方法同上, 在相应配置中修改端口

同上, 再创建三个mongod实例(27021, 27022, 27023)作为副本集rs1 (注意在相应配置中修改端口和replSetName)

启动三个实例

1
2
3
4
docker run -p 27021:27021 --restart always -v /home/nolan/mongo/m_27021:/data -v /home/nolan/mongo/m_27021/db:/data/db --name m_27021 -d mongo mongod -f /data/mongod.conf --bind_ip_all
docker run -p 27022:27022 --restart always -v /home/nolan/mongo/m_27022:/data -v /home/nolan/mongo/m_27022/db:/data/db --name m_27022 -d mongo mongod -f /data/mongod.conf --bind_ip_all
docker run -p 27023:27023 --restart always -v /home/nolan/mongo/m_27023:/data -v /home/nolan/mongo/m_27023/db:/data/db --name m_27023 -d mongo mongod -f /data/mongod.conf --bind_ip_all

2. 创建ConfigServer副本集(configsvr)

1
mkdir -p /home/nolan/mongo/c_27024

在上述目录添加配置文件mongod.conf, 内容如下

1
2
3
4
5
6
7
net:
    port: 27024
    bindIp: 0.0.0.0    
replication:
    replSetName: cfg
sharding:
    clusterRole: configsvr

c_27025, c_27026方法同上, 在相应配置中修改端口

启动三个实例

1
2
3
docker run -p 27024:27024 --restart always -v /home/nolan/mongo/c_27024:/data -v /home/nolan/mongo/c_27024/db:/data/db --name c_27024 -d mongo mongod -f /data/mongod.conf --bind_ip_all
docker run -p 27025:27025 --restart always -v /home/nolan/mongo/c_27025:/data -v /home/nolan/mongo/c_27025/db:/data/db --name c_27025 -d mongo mongod -f /data/mongod.conf --bind_ip_all
docker run -p 27026:27026 --restart always -v /home/nolan/mongo/c_27026:/data -v /home/nolan/mongo/c_27026/db:/data/db --name c_27026 -d mongo mongod -f /data/mongod.conf --bind_ip_all

3. 创建mongos

1
/home/nolan/mongo/s_27027

在上述目录添加配置文件mongos.conf, 内容如下, 注意修改IP为所在机器内网IP

1
2
3
4
5
net:
    port: 27027
    bindIp: 0.0.0.0    
sharding:
    configDB: cfg/172.24.29.128:27024,172.24.29.128:27025,172.24.29.128:27026

启动mongos

1
docker run -p 27027:27027 --restart always -v /home/nolan/mongo/s_27027:/data -v /home/nolan/mongo/s_27027/db:/data/db --name s_27027 -d mongo mongos -f /data/mongos.conf --bind_ip_all

4. 初始化副本集

rs0

1
2
docker exec -it m_27018 mongo --port 27018
rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "172.24.29.128:27018" }, { _id: 1, host: "172.24.29.128:27019" }, { _id: 2, host: "172.24.29.128:27020" } ] })

rs1

1
2
docker exec -it m_27021 mongo --port 27021
rs.initiate( { _id : "rs1", members: [ { _id: 0, host: "172.24.29.128:27021" }, { _id: 1, host: "172.24.29.128:27022" }, { _id: 2, host: "172.24.29.128:27023" } ] })

cfg

1
2
docker exec -it c_27024 mongo --port 27024
rs.initiate( { _id : "cfg", members: [ { _id: 0, host: "172.24.29.128:27024" }, { _id: 1, host: "172.24.29.128:27025" }, { _id: 2, host: "172.24.29.128:27026" } ] })

5. 初始化mongos

1
2
3
4
docker exec -it s_27027 mongo --port 27027
use admin
db.runCommand({ addshard : "rs0/172.24.29.128:27018,172.24.29.128:27019,172.24.29.128:27020", name:"shard0"}) 
db.runCommand({ addshard : "rs1/172.24.29.128:27021,172.24.29.128:27022,172.24.29.128:27023", name:"shard1"})

6 命令参考

创建索引

1
2
use 数据库名
db.users.createIndex({ 字段名:1 })

开启分片功能

1
2
db.runCommand({ enablesharding : "数据库名" })
db.runCommand({ shardcollection : "数据库名.集合名", key : {字段名:1} })

查看分片功能

1
sh.status()