0%

分布式系统实例之mongo集群之集群搭建

[TOC]

副本集(replica)

mongodb副本集是一组拥有相同数据的mongodb实例,主mongodb接受所有的写操作,所有的其他实例可以接受主实例的操作以保持数据同步。

docker 搭建

参看: go-mod/k8s/docker/mongo/replication

验证主从同步

1
2
3
4
5
6
7
8
9
10
11
# 进入mymongo1: docker exec -it mymongo1 mongo
use test
db.people.insert({"name": "percy1", "age": 18})
db.people.insert({"name": "percy2", "age": 19})

# 进入mymongo2: docker exec -it mymongo1 mongo
db.getMongo().setSlaveOk()
use test
mongoreplset:SECONDARY> db.people.find()
{ "_id" : ObjectId("5f3b810824e755927a408da7"), "name" : "percy1", "age" : 18 }
{ "_id" : ObjectId("5f3b810924e755927a408da8"), "name" : "percy2", "age" : 19 }

验证故障转移

副本集模式下,如果Primary不可用,整个集群将会选举出新的Primary来继续对外提供读写服务,一起来验证一下 mymongo1 不可用的时候的状况:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 停止 master
docker stop mymongo1

# 进入 mymongo2, 发现 mymongo2 已切换为 master
docker exec -it mymongo2 mongo

# 重新启动 mymongo1
docker start mymongo1

# 查看 mymongo1 的状态
rs.status()
# 可以看到 mymonogo1 重新连入了副本集,但是是作为secondry,primary仍然是 mymongo2
# 查看 members 可以看到有三个节点,且能看到各个节点的信息

分片集群 (sharding)

docker 搭建

参看: go-mod/k8s/docker/mongo/sharding

验证数据分片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 进入 mongos
docker exec -it mymongo_mongos1 mongo --port 27017

# 首先在mongos配置一个database并启动分片
sh.enableSharding("mapp")

# 对order集合设置分片规则
sh.shardCollection("mapp.order", {"_id": "hashed" })

# Mock 数据
use mapp
for (i = 1; i <= 1000; i=i+1){
db.order.insert({'price': 1})
}
db.order.find().count()

# 在两个分片集群中查看
docker exec -it mymongo_shard1 mongo --port 27018
use mapp
db.order.find().count()
454

explain 分析查询

参看: go-mod/k8s/docker/mongo/sharding

参考

docker 搭建副本集集群

docker 搭建分片集群

mongodb 分片使用