利用Docker部署mongodb集群--分片与副本集

环境 Docker version 1.6.2  mongodb 3.0.4

第一步  编写Dockerfile并生成镜像

主意包含两个Dockerfile镜像,一个mongod的,一个mongos(在集群中负责路由)

编写Mongod的Dockerfile:

FROM ubuntu:14.04

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

ENV MONGO_MAJOR 3.0
RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.list

# Install MongoDB
RUN apt-get update
RUN sudo apt-get install -y mongodb-org=3.0.4 mongodb-org-server=3.0.4 mongodb-org-shell=3.0.4 mongodb-org-mongos=3.0.4 mongodb-org-tools=3.0.4

# Create the MongoDB data directory
RUN mkdir -p /data/db

EXPOSE 27017
ENTRYPOINT ["usr/bin/mongod"]

构建上面的Dockerfile 生成镜像:

sudo docker build -t robin/mongod:master .

-t 指定要放的 仓库地址,冒号后面master代表tag,  后面那个点 代表当前目录(含有刚刚编写好的Dockerfile的目录)

编写Mongos的Dockerfile:

FROM  robin/mongod:master
EXPOSE 27017
ENTRYPOINT ["usr/bin/mongos"]

构建镜像:

sudo docker build -t robin/mongos:master .

第二步  启动mongodb集群所需的Docker容器:

创建副本集1

docker run --name rs1_srv1 -p 21117:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs1

docker run --name rs1_srv2 -p 21217:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs1

docker run --name rs1_srv3 -p 21317:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs1

-p 映射宿主机器和容器内部的端口。-d 表示deamon模式运行。

--smallfile 减小初始化数据文件的大小,并限制数据文件最大为512M (reduces the initial size for data files and limits the maximum size to 512 megabytes).

--noprealloc主要是为了节省硬盘,禁掉预先分配硬盘。生产环境不要用该选项,会导致性能下降,产生磁盘碎片。

创建副本集2

docker run --name rs2_srv1 -p 22117:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs2

docker run --name rs2_srv2 -p 22217:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs2

docker run --name rs2_srv3 -p 22317:27017 -d robin/mongod:master --noprealloc --smallfiles --replSet rs2

创建配置容器

docker run --name cfg1 -p 20117:27017 -d robin/mongod:master --noprealloc --smallfiles --configsvr  --dbpath /data/db --port 27017

docker run --name cfg2 -p 20217:27017 -d robin/mongod:master --noprealloc --smallfiles --configsvr  --dbpath /data/db --port 27017

docker run --name cfg3 -p 20317:27017 -d robin/mongod:master --noprealloc --smallfiles --configsvr  --dbpath /data/db --port 27017

创建mongo router

找到配置容器对应的ip 和port

使用mac boot2docker +VirtualBox 一定要注意宿主机的ip是VirtualBox 而不是本机的

运行下边的命令得到容器宿主机器ip

boot2docker ip
docker run --name mongos_router -p 27017:27017 -d robin/mongos:master --configdb <宿主ip>:20117,<宿主ip>:20217,<宿主ip>:20317 --port 27017

这里只创建一台路由服务,这样会存在单点故障问题,可以创建三台来解决问题。

第三步配置副本集与分片

配置副本集1

//连接到rs1_svr1
mongo <宿主ip>:21117
//配置副本集
rs.initiate();
rs.add("<宿主ip>:21217");
rs.add("<宿主ip>:21317");
rs.status();
Fix hostname of primary.
cfg = rs.conf();
cfg.members[0].host = "<宿主ip>:21117";
rs.reconfig(cfg);
rs.status();
//以上命令一个一个执行

配置副本集2

//连接到rs2_svr1
mongo <宿主ip>:22117
//配置副本集
rs.initiate();
rs.add("<宿主ip>:22217");
rs.add("<宿主ip>:22317");
rs.status();
Fix hostname of primary.
cfg = rs.conf();
cfg.members[0].host = "<宿主ip>:22117";
rs.reconfig(cfg);
rs.status();
//以上命令一个一个执行

配置分片

//连接到路由服务器
mongo <宿主ip>:27017

sh.addShard("rs1/<宿主ip>:27017");
sh.addShard("rs2/<宿主ip>:27017");
sh.status();

然后测试OK

如果用mac VirtualBox搭建docker 可能会遇到mongo分配文件空间不足的问题,调下磁盘大小就OK了

转发标注来源:http://my.oschina.net/robinyao/blog/469431

时间: 2025-01-02 16:40:08

利用Docker部署mongodb集群--分片与副本集的相关文章

Mongodb集群架构之副本集

本文介绍了热门的NoSQL数据库MongoDB的副本集这种分布式架构的一些概念和操作.主要内容包括: MongoDB副本集相关概念 MongoDB副本集环境搭建 MongoDB副本集的读写分离 MongoDB副本集的故障转移 MongoDB副本集的优点 MongoDB副本集的缺点 1.副本集相关概念 主节点. 在一个副本集中,只有唯一一个主节点.主节点可以进行数据的写操作和读操作.副本集中各个节点的增伤改等配置必须在主节点进行. 从节点. 在一个副本集中,可以有一个或者多个从节点.从节点只允许读

mongodb的分布式集群(2、副本集)

概述        副本集是主从复制的一种,是一种自带故障转移功能的主从复制,解决了上述主从复制的缺点,实现主服务器发生故障后,不需人为介入,系统自动从新选举一个新的主服务器的功能. 部署图                该图是copy别人的,有兴趣的可以查看该人的博客,写的非常的棒 副本集配置 <strong> </strong> //启动服务器(登录每台服务器) mongod --dbpath d:/data/ --replSet repset //初始化副本集(登录任意一台服

搭建高可用mongodb集群—— 分片

从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句话概括:分而治之.上图看看就清楚了,如下 taobao岳旭强在infoq中提到的 架构图: 上图中有个TDDL,是taobao的一

MongoDB分布式集群分片

MongoDB高可用集群搭建 一.环境准备 # 启动时需要使用非root用户,所有创建一个mongo用户: useradd mongo # 为mongo用户添加密码: echo 123456 | passwd --stdin mongo # 将mongo添加到sudoers echo "mongo ALL = (root) NOPASSWD:ALL" | tee /etc/sudoers.d/mongo chmod 0440 /etc/sudoers.d/mongo #解决sudo:

mongodb的分布式集群(4、分片和副本集的结合)

概述 前面3篇博客讲了mongodb的分布式和集群,其中第一种的主从复制我们几乎不用,没有什么意义,剩下的两种,我们不论单独的使用哪一个,都会出现相应的问题,比较好的一种解决方案就是,分片和副本集的集合使用,这样就比较完美了. 部署图 在这里,我们需要注意,我们mongos服务器配置成了集群,所以,我们需要在客户端上分别得添加相应的地址,这个和在副本集的那篇博客中将的内容一样,在java客户端程序的具体核心代码,在那篇博客中也给了大家,如果这点不清楚的,可以看看那篇博客. 分片集群的配置 分片集

配置MongoDB3.04集群分片

网上大部分都是的mongo2.x集群分片了,咱写个3.04的. 由于公司采用磁盘阵列冗余存储,所以不考虑数据备份问题只是简单的分片存储数据进行测试的. 配置结构如图: 服务器配置: cpu双核.8G内存./shard目录挂载500G硬盘. 服务器列表: IP 职能 192.168.6.117 config.mongos 192.168.6.118 client 192.168.6.119 client 192.168.6.147 client 192.168.6.160 client 首先打开这

Redis集群分片原理及选举流程

Redis集群分片原理及选举流程 集群分片模式 如果Redis只用复制功能做主从,那么当数据量巨大的情况下,单机情况下可能已经承受不下一份数据,更不用说是主从都要各自保存一份完整的数据.在这种情况下,数据分片是一个非常好的解决办法. Redis的Cluster正是用于解决该问题.它主要提供两个功能: 自动对数据分片,落到各个节点上 即使集群部分节点失效或者连接不上,依然可以继续处理命令 对于第二点,它的功能有点类似于Sentienl的故障转移,在这里不细说.下面详细了解下Redis的槽位分片原理

MongoDB 学习笔记之 分片和副本集混合运用

 分片和副本集混合运用: 基本架构图: 搭建详细配置: 3个shard + 3个replicat set + 3个configserver + 3个Mongos shardrsname Primary Secondary Secondary port bigdata-sh-a bigdata-sh-a1 bigdata-sh-a2 bigdata-sh-a3 28111 bigdata-sh-b bigdata-sh-b2 bigdata-sh-b1 bigdata-sh-b3 28112 bi

docker 部署 mongodb 并且开启远程连接

mongodb 使用 docker 部署 mongodb 拉取镜像 docker pull mongo 可以查看镜像是否下载成功 docker images | grep mongo 应该会有如下的显示 mongo latest 7177e01e8c01 2 months ago 393MB > 2 months ago 和 393MB 取决于镜像的拉取时间和对应版本的大小. 使用 docker 安装 mongodb docker run --name mongodb -v ~/docker/m