使用 Docker 部署 MongoDB 复制集
启用三个 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:用来识别成员的 idmembers[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 复制集的更多相关文章
- 部署MongoDB复制集(副本集)
环境 操作系统:Ubuntu 18.04 MongoDB: 4.0.3 服务器 首先部署3台服务器,1台主节点 + 2台从节点 3台服务器的内容ip分别是: 10.140.0.5 (主节点) 10.1 ...
- MongoDB 复制集 (一) 成员介绍
一 MongoDB 复制集简介 MongoDB的复制机制主要分为两种: Master-Slave (主从复制) 这个已经不建议使用 ...
- mongodb 复制集
mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...
- Raft与MongoDB复制集协议比较
在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...
- MongoDB复制集
1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...
- MongoDB复制集技术
复制集搭建 没毛病: https://www.cnblogs.com/nicolegxt/p/6841442.html?utm_source=itdadao&utm_medium=referr ...
- mongodb复制集Replica Set使用简介
MongoDB高可用 对于MongoDB,可以支持使用单机模式提供服务,但是在实际的生产环境中,单机模式将面临很大的风险,一旦这个数据库服务出现问题,就会导致线上的服务出现错误甚至崩溃.因此,在实际生 ...
- MongoDB复制集成员及状态转换
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 复制集(Replica Set)是MongoDB核心组件,相比早期版本采用的主从(Master-Slave) ...
- 关于 MongoDB 复制集
为什么要使用复制集 1.备份数据通过自带的 mongo_dump/mongo_restore 工具也可以实现备份,但是毕竟没有复制集的自动同步备份方便. 2.故障自动转移部署了复制集,当主节点挂了后, ...
随机推荐
- 19、Cocos2dx 3.0游戏开发找小三之Action:流动的水没有形状,漂流的风找不到踪迹、、、
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478985 流动的水没有形状.漂流的风找不到踪迹. ...
- Linux 多线程环境下 进程线程终止函数小结(转)
pthread_kill: pthread_kill与kill有区别,是向线程发送signal.,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数. ...
- 读写锁pthread_rwlock_t的使用(转)
读写锁是用来解决读者写者问题的,读操作可以共享,写操作是排他的,读可以有多个在读,写只有唯一个在写,同时写的时候不允许读. 具有强读者同步和强写者同步两种形式 强读者同步:当写者没有进行写操作,读者就 ...
- shll 基础讲解
http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html Shell编程基础 $# 命令行得到的参数个数 $@ 命令行得到的所有参数作 ...
- tony_nginx的安装和配置
yum安装nginx Centos默认的yum源里没有nginx,需要手动添加源,有两种方法: 使用nginx提供的一个源设置安装包 nginx下载页面:http://nginx.org/en/dow ...
- [原创]如何让freeswitch转发客户端自定义的INFO消息
如何让freeswitch转发客户端自定义的INFO消息 英文概述: this article is about how to configure freeswitch to forward self ...
- 串行 RapidIO
https://wenku.baidu.com/view/78666616cf84b9d528ea7ad9.html
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...
- match函数
match(s, r [, a]) Return the position in s where the regular expression r occurs, or 0 if r is not p ...
- MyEclipse 2013安装后要做的几件事
一.Myeclipse 2013修改字体 MyEclipse 2013是基于Eclipse3.7内核,但在Eclipse的Preferences-〉general-〉 Appearance->C ...