docker 搭建mongodb分片集群

1.mongodb分片?

1
2
在Mongodb中的另一种集群,用于满足MongoDB数据量大量增长的需求。
当MongoDB存储海量数据时,一台机器不足以存储海量数据,也无法提供可接受的读写吞吐量,通过在多台机器上分割数据,使得数据库性能存储和处理更多的数据。

2.为什么使用分片?

1
2
3
4
5
6
复制所有的写入操作到主节点
延迟的敏感数据会在主节点查询
单个副本集限制在12个节点
当请求量巨大时出现内存不足
本地磁盘不足
垂直扩展价格昂贵

3.docker搭建分片集群

1
2
1.首先安装docker
2.下载mongo最新版本 docker pull mongo

4.创建配置服务副本集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
docker run -itd --name mongo-config-0 mongo mongod --configsvr --replSet config --bind_ip_all
docker run -itd --name mongo-config-1 mongo mongod --configsvr --replSet config --bind_ip_all
docker run -itd --name mongo-config-2 mongo mongod --configsvr --replSet config --bind_ip_all

备注: --configsvr 默认端口为 27019

通过docker inspect 容器 | grep IPAddress 获得容器的ip地址
docker inspect mongo-config-0 | grep IPAddress
docker inspect mongo-config-1 | grep IPAddress
docker inspect mongo-config-2 | grep IPAddress

所以三个服务副本的地址为(IP地址请参考实际情况)
mongo-config-0: 172.17.0.3:27019
mongo-config-1: 172.17.0.4:27019
mongo-config-2: 172.17.0.5:27019

初始化配置服务副本集
docker exec -it mongo-config-0 bash

mongo --host 172.17.0.3 --port 27019

rs.initiate({
_id:"config",
configsvr: true,
members:[
{_id:0, host:"172.17.0.3:27019"},
{_id:1, host:"172.17.0.4:27019"},
{_id:2, host:"172.17.0.5:27019"},
]
})

5.创建分片副本集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
docker run -itd --name mongo-shard-0 mongo mongod --shardsvr --replSet shard --bind_ip_all
docker run -itd --name mongo-shard-1 mongo mongod --shardsvr --replSet shard --bind_ip_all
docker run -itd --name mongo-shard-2 mongo mongod --shardsvr --replSet shard --bind_ip_all


docker run -itd --name mongo-shard-10 mongo mongod --shardsvr --replSet shard1 --bind_ip_all
docker run -itd --name mongo-shard-11 mongo mongod --shardsvr --replSet shard1 --bind_ip_all
docker run -itd --name mongo-shard-12 mongo mongod --shardsvr --replSet shard1 --bind_ip_all
备注: --shardsvr 默认端口为 27018

通过docker inspect 容器 | grep IPAddress 获得容器的ip地址
docker inspect mongo-shard-0 | grep IPAddress
docker inspect mongo-shard-1 | grep IPAddress
docker inspect mongo-shard-2 | grep IPAddress

docker inspect mongo-shard-10 | grep IPAddress
docker inspect mongo-shard-11 | grep IPAddress
docker inspect mongo-shard-12 | grep IPAddress

所以三个服务副本的地址为(IP地址请参考实际情况)
mongo-shard-0: 172.17.0.6:27018
mongo-shard-1: 172.17.0.7:27018
mongo-shard-2: 172.17.0.8:27018

mongo-shard-10: 172.17.0.9:27018
mongo-shard-11: 172.17.0.10:27018
mongo-shard-12: 172.17.0.11:27018

初始化分片副本集

//第一个分片副本集 shard
docker exec -it mongo-shard-0 bash

mongo --host 172.17.0.6 --port 27018

rs.initiate({
_id:"shard",
members:[
{_id:0, host:"172.17.0.6:27018"},
{_id:1, host:"172.17.0.7:27018"},
{_id:2, host:"172.17.0.8:27018"},
]
})

//第二个分片副本集 shard
docker exec -it mongo-shard-10 bash

mongo --host 172.17.0.9 --port 27018

rs.initiate({
_id:"shard1",
members:[
{_id:0, host:"172.17.0.9:27018"},
{_id:1, host:"172.17.0.10:27018"},
{_id:2, host:"172.17.0.11:27018"},
]
})

6.创建mongos服务,并连接mongos到分片集群

1
docker run -itd --name mongo-router -p 27017:27017 mongo mongos --configdb config/172.17.0.3:27019,172.17.0.4:27019,172.17.0.5:27019 --bind_ip_all

7.添加分片到集群

1
2
3
4
5
6
7
docker exec -it mongo-router bash 

mongo --host 172.17.0.12 --port 27017

sh.addShard("shard/172.17.0.6:27018,172.17.0.7:27018,172.17.0.8:27018")

sh.addShard("shard1/172.17.0.9:27018,172.17.0.10:27018,172.17.0.11:27018")

8.数据库启用分片

1
2
3
4
5
use admin

sh.enableSharding("db")

sh.shardCollection("db.collection", {"_id": "hashed"})
-------------本文结束感谢您的阅读-------------
分享不易,请我喝杯咖啡吧~~~