使用Docker创建MongoDB复制集

MongoDB复制集由一组MongoDB实例节点组成,包含一个Primary节点、多个Secondary节点

客户端写入的数据会被写入Primary节点,Secondary节点从Primary节点自动同步数据,保持所有成员的数据相同,提供数据库的高可用性 MongoDB复制集的配置非常简单,只需要指定复制集中包含哪些节点就好了 不需要我们指定哪个节点是Primary,会自动选举出来,其他节点便成为Secondary,自动与Primary同步,当Primary坏掉后,也会自动从多个Secondary中重新选举出Primary 下面使用Docker的MongoDB镜像创建3个MongoDB实例,配置成复制集,然后测试一下数据自动复制的情况,并模拟Primary坏掉的情况 前期准备 安装好Docker,获取MongoDB的镜像 docker pull mongo 建议使用阿里云或者daocloud.io的加速器 配置过程 我们会新建一个专属的Docker容器网络,然后创建3个mongo容器(mongo1 mongo2 mongo3),得到3个mongo实例节点,把他们放入专属网络,再对他们3个进行复制集初始化,这样就完成了复制集的创建,最后简单测试一下

  • 新建docker网络

docker network create mongo-cluster “mongo-cluster” 是这个新建网络的名称,查看一下创建结果 docker network ls

  • 启动3个容器

创建 mongo1 docker run -d \ -p 30001:27017 \ --name mongo1 \ --net mongo-cluster \ mongo mongod --replSet mongo-repliset 说明: docker run 从镜像启动一个容器 -p 30001:27017 端口映射,容器内的端口 27017 映射到本机的端口 30001 --name mongo1 给这个容器起个名字 “mongo1” --net mongo-cluster 把这个容器添加到网络 “mongo-cluster” mongo 要使用的镜像名 mongod --replSet mongo-repliset 容器启动后要运行的命令,执行 mongod 命令,并通过参数指定这个示例加入名为 “mongo-repliset” 的复制集 创建 mongo2 docker run -d -p 30002:27017 --name mongo2 --net mongo-cluster mongo mongod --replSet mongo-repliset 创建 mongo3 docker run -d -p 30003:27017 --name mongo3 --net mongo-cluster mongo mongod --replSet mongo-repliset

查看当前正在运行的容器

docker ps

3个mongo实例成功运行

  • 初始化

现在已经准备好了3个mongo实例,下面就把复制集配置起来 登录到任意一个mongo实例的 shell docker exec -it mongo1 mongo 添加配置信息 > db = (new Mongo('localhost:27017')).getDB('test') test > config = { "_id" : "mongo-repliset", "members" : [ { "_id" : 0, "host" : "mongo1:27017" }, { "_id" : 1, "host" : "mongo2:27017" }, { "_id" : 2, "host" : "mongo3:27017" } ] } config 中第一个 key "_id" 的值 "mongo-repliset" 就是 启动容器时 --replSet 参数的值,"members" 指定了复制集成员的信息 然后使用配置信息初始化复制集 > rs.initiate(config)

执行完成后,复制集就配置完成了,按几次回车键,就会发现shell提示符变了

意味着当前shell 连接的是复制集中的Primary节点 测试

  • 测试数据同步

在Primary中插入了一条测试数据 > db.mycollection.insert({name : 'sample'})

> db.mycollection.find()

然后到其他节点中查看是否包含此数据 退出容器并不让容器停止,使用快捷键 Ctrl+P+Q 登录到mongo2的shell docker exec -it mongo2 mongo > db = (new Mongo('localhost:27017')).getDB('test') > db.setSlaveOk() > db.mycollection.find()

mongo2 中的数据已经同步,可以用同样的方法到mongo3中查看

  • 模拟Primary当掉

停掉mongo1容器 docker stop mongo1 只剩下 mongo2 和 mongo3

分别登录 mongo2 和 mongo3 的 shell

可以看到 mongo3 被选为了Primary MongoDB的复制集配置完成

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2016-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构技术

solr搜索引擎配置使用mongodb作为数据源

  这里我使用的是docker容器管理UI进行操作的,强烈推荐portainer,确实好用;登陆后台管理界面后,直接点击App Templates,找到mong...

27420
来自专栏黑白安全

W8ay 一句话管理网页端

第二版本完成了自定义命令 在include\model\PHPShell_Build_mothod.php中自定义命令即可,将自动完成编码加密过程

18520
来自专栏实战docker

实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署

最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的web...

67950
来自专栏杂七杂八

Anaconda安装与初步使用

Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本...

56150
来自专栏皮振伟的专栏

[kvm][qemu]CPU虚拟化

前言: 这里作者再次自不量力了,以一点微末的道行分析一下KVM的CPU虚拟化部分的代码。 分析: 1,分析具体代码逻辑之前,可以先使用strace大致看一下...

56070
来自专栏轻量级微服务

Kubernetes Pod 生命周期

Pod 的 status 属性是一个 PodStatus 对象,拥有一个 phase 字段。它简单描述了 Pod 在其生命周期的阶段。

18810
来自专栏实战docker

Docker学习笔记之一:准备,安装,初体验

想实践一下Docker,手头是个windows电脑,由于想在linux下实践,所以第一步是装虚拟机,我用的是VMware Workstation 12 Play...

389100
来自专栏数据和云

独家 | 通过Docker技术在macOS上部署3实例MGR环境

自从有了Docker,各种环境部署都简单从容起来,还记得我们曾经分享过:在macOS 上部署Oracle数据库环境,其实MySQL的环境部署起来同样得心应手。 ...

37580
来自专栏Coding01

一步一步搭建 PHP 服务器环境

这两天翻了翻之前的技术文档,发现有一篇文档值得拿出来和大家分享:如何给一台全新的阿里云服务器,搭建环境 —— 来部署 PHP 项目,Node.js 项目等。

53620
来自专栏Debian社区

Debian 光盘安装简易教程

这篇文章我会尽可能详细地说明如何快速安装纯净的Debian 8.2.0,需要懂一点vi编辑器的使用方法。 如果是新手,没用过 vim 编辑器也不用担心,我会尽量...

43420

扫码关注云+社区

领取腾讯云代金券