mongo 分布式 docker版示例
本章介绍的mongo指令,主要是管理员用的。包括一些分布式的内容。对于开发者来说,不管副本集还是分片,都是透明的,无需关注。
副本集replica set
## 创建一个副本集,端口10000,名字myrs,数据存放./data
mongod --port 10000 --dbpath ./data --replSet myrs
# 访问这个实例,并初始化
rs.initiate()
# 添加其他实例到副本集
rs.add($HOST_NAME:$PORT)
# 查看副本集信息
rs.conf()
分片
当单台服务器满足不了mongodb的性能要求(内存、磁盘读写)时,我们考虑将数据分布到多台服务器。
当客户端访问我们的门户时,通过算法,找到存储数据的服务器;通过路由访问到这个分片,返回数据。
一个分片集群需要具备以下角色:
- Shard:分片,存储整个库中的数据,由算法决定某条数据该分配到哪个分片。
- Config Server:配置服务器,储存所有分片的元数据,我使用的4.0版本,要求配置服务器必须是副本集,并建议有3个实例。
- mongos(Router):路由,所有分片的访问入口,主要起到路由、分发、合并的作用。对开发来说,这层是可见的。路由需要指定配置服务器、并维护分片。
docker建立一个简单分片集群
因为我本机没装mongodb,所以通过建几个容器来实现一个分片集群。如果使用多台物理机实现集群,道理也是一样的。
mongodb镜像准备 docker pull mongo:4.0
mongos镜像,自己做一个Dockerfile
FROM mongo:4.0
MAINTAINER it_laowu
EXPOSE 27017
ENTRYPOINT ["usr/bin/mongos"]
编译 Docker build -t it_laowu/mongos:4.0 .
开始执行命令:
# docker network
docker network create -d bridge --subnet 172.18.0.0/24 --gateway 172.18.0.1 my_net
# 三个shard,必须加上 --shardsvr ,否则mongos拒绝处理
sudo docker run -d --network my_net --name sh1 mongo:4.0 --shardsvr --port 27017 &&\
sudo docker run -d --network my_net --name sh2 mongo: