启用三个 mongod 建立复制集。

MongoDB 版本选择目前最新的稳定版 3.6.2-jessie。

docker run --name mongo0 -d mongo:3.6.2-jessie --replSet "rs0" --bind_ip_all
docker run --name mongo1 -d mongo:3.6.2-jessie --replSet "rs0" --bind_ip_all
docker run --name mongo2 -d mongo:3.6.2-jessie --replSet "rs0" --bind_ip_all

通过 docker inspect 找到三个 mongod 实例的 IPAddress。

比如 docker inspect mongo0 | grep IPAddress,

又由于端口为 mongod 默认的 27017。所以 mongod 的地址为

  • mongo0: 172.17.0.2:27017
  • mongo1: 172.17.0.3:27017
  • mongo2: 172.17.0.4:27017

初始化复制集

rs.initiate( {
_id : "rs0",
members: [
{ _id: 0, host: "172.17.0.2:27017" },
{ _id: 1, host: "172.17.0.3:27017" },
{ _id: 2, host: "172.17.0.4:27017" }
]
})

根据 replica-set-configuration-document,

  • _id:复制集的名称。必须与启动 mongod 的 --replSet 一致
  • members:成员配置文件的列表。
    • members[n]._id:用来识别成员的 id
    • members[n].host:成员对应的 host:port

连接字符串为

mongodb://172.17.0.2:27017,172.17.0.3:27017,172.17.0.4:27017/test?replicaSet=rs0

复制特性

在主节点中插入数据后,从节点中也存在。

mongo mongodb://172.17.0.2:27017,172.17.0.3:27017,172.17.0.4:27017/test?replicaSet=rs0
rs0:PRIMARY> db.order.insert({price: 1})
WriteResult({ "nInserted" : 1 }) mongo --host 172.17.0.3
// 允许当前连接对从库进行读操作
rs0:SECONDARY> db.getMongo().setSlaveOk()
rs0:SECONDARY> db.order.find()
{ "_id" : ObjectId("5a7c5473b74e8cf1bb890979"), "price" : 1 }

重新选举

关闭主节点,会重新选举出新的主节点。

当前主节点为 172.17.0.2:27017

> `rs.status()`

"name" : "172.17.0.2:27017",
"health" : 1,
"stateStr" : "PRIMARY",

通过 docker stop mongo0 关闭它之后,可以看到 172.17.0.2 是不健康状态

"name" : "172.17.0.2:27017",
"health" : 0,
"stateStr" : "(not reachable/healthy)",

主节点变为了 172.17.0.3,期限由 1 变为了 2,表示又经过一次选举,

"term" : NumberLong(2)
...
...
"name" : "172.17.0.3:27017",
"health" : 1,
"stateStr" : "PRIMARY",

docker start mongo0 启动 mongo0 后,172.17.0.2 变为了健康的从节点

"name" : "172.17.0.2:27017",
"health" : 1,
"stateStr" : "SECONDARY",

大部分节点失效

我们关闭两个节点

docker stop mongo0 mongo2

可以看到 172.17.0.2 和 172.17.0.4 都无法连接,而 172.17.0.3 变为了从节点,

整个复制集没有主节点了,无法进行写操作。

"name" : "172.17.0.3:27017",
"health" : 1,
"stateStr" : "SECONDARY", "name" : "172.17.0.2:27017",
"health" : 0,
"stateStr" : "(not reachable/healthy)", "name" : "172.17.0.4:27017",
"health" : 0,
"stateStr" : "(not reachable/healthy)",

设置优先级

先启动之前关闭的节点 docker start mongo0 mongo2

根据 adjust-replica-set-member-priority

将第一个节点的 priority 设置为 2。(需要在主节点中输入以下命令)

cfg = rs.conf()
cfg.members[0].priority = 2
rs.reconfig(cfg)

可以看到不久后,主节点变为 _id: 0 了

"_id" : 0,
"stateStr" : "PRIMARY",

用于生产环境的注意事项

  • mongod 绑定非 localhost 地址前,考虑开启访问控制或者安全清单上的其他措施
  • 复制集成员的关联性应该小,减小同时出问题的几率

参考

https://docs.mongodb.com/manual/tutorial/deploy-replica-set/

使用 Docker 部署 MongoDB 复制集的更多相关文章

  1. 部署MongoDB复制集(副本集)

    环境 操作系统:Ubuntu 18.04 MongoDB: 4.0.3 服务器 首先部署3台服务器,1台主节点 + 2台从节点 3台服务器的内容ip分别是: 10.140.0.5 (主节点) 10.1 ...

  2. MongoDB 复制集 (一) 成员介绍

       一 MongoDB 复制集简介          MongoDB的复制机制主要分为两种:          Master-Slave    (主从复制)      这个已经不建议使用       ...

  3. mongodb 复制集

    mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...

  4. Raft与MongoDB复制集协议比较

    在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...

  5. MongoDB复制集

    1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...

  6. MongoDB复制集技术

    复制集搭建 没毛病: https://www.cnblogs.com/nicolegxt/p/6841442.html?utm_source=itdadao&utm_medium=referr ...

  7. mongodb复制集Replica Set使用简介

    MongoDB高可用 对于MongoDB,可以支持使用单机模式提供服务,但是在实际的生产环境中,单机模式将面临很大的风险,一旦这个数据库服务出现问题,就会导致线上的服务出现错误甚至崩溃.因此,在实际生 ...

  8. MongoDB复制集成员及状态转换

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...

  9. 关于 MongoDB 复制集

    为什么要使用复制集 1.备份数据通过自带的 mongo_dump/mongo_restore 工具也可以实现备份,但是毕竟没有复制集的自动同步备份方便. 2.故障自动转移部署了复制集,当主节点挂了后, ...

随机推荐

  1. 解决Odoo访问fonts.googleapis.com导致速度慢的问题

    Odoo中有些css文件引用了谷歌字体,但因为谷歌服务器被墙,导致部分页面加载受影响. 解决方法如下: 360网站卫士常用前端公共库CDN服务把谷歌字体库都存到它的CDN上了,因此我们只需把样式表中谷 ...

  2. MySQL Memory 存储引擎浅析

    原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的MemCache需求,開始想用MemCached(官方网站:http://memcac ...

  3. 算法基础:整数拆分问题(Golang实现)

    一个整数总能够拆分为2的幂的和.比如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 总共同拥有6种不同的 ...

  4. Atitit. 包厢记时系统 的说明,教程,维护,故障排查手册v2 pb25.doc

    Atitit. 包厢记时系统 的说明,教程,维护,故障排查手册v2 pb25.doc 1. 服务器方面的维护1 1.1. 默认情况下,已经在系统的启动目录下增加了 个启动项目1 1.2. 后台服务.保 ...

  5. RapidIO协议(1)

    RapidIO协议 1.概述 1.1介绍 RapidIO是基于包交换互联协议,主要作为系统内部接口使用,如:芯片间.板间的通讯,速度能在GB/S数量级.如连接处理器.内存.内存映射的I/O设备.这些设 ...

  6. SQLServer 存储过程中不拼接SQL字符串实现多条件查询

    以前拼接的写法 set @sql=' select * from table where 1=1 ' if (@addDate is not null) set @sql = @sql+' and a ...

  7. 李洪强经典面试题52-Block

    李洪强经典面试题52-Block   Block Block底层原理实现 首先我们来看四个函数 void test1() { int a = 10; void (^block)() = ^{ NSLo ...

  8. 移动端数据库新王者:realm

    介绍 realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android. 2014年7月发布.由YCombinator孵化的创业团队历时几年打造,是第 ...

  9. 前端js文件添加版本号

    客户端会缓存这些css或js文件,因此每次升级了js或css文件后,改变版本号,客户端浏览器就会重新下载新的js或css文件 ,刷性缓存的作用.大家可能有时候发现修改了样式或者js,刷新的时候不变,就 ...

  10. UI-1-UI入门

    课程要点: 创建一个iOS工程 AppDelegate类 UIKit框架以及UIWindow 在window上添加第一个试图UIView NSTimer(定时器) 创建一个iOS工程 PS:接下来简单 ...