阅读本文大约须要 9 分钟node
若是对 Docker 不太懂,能够看看我以前的文章。 这篇文章主要讲如下四个内容:mongodb
原本是想用 MongoDB 的 Docker 最新镜像的,可是 最新镜像默认绑定了 localhost (详见官网)才能链接数据库,固然,咱们也能够进行修改。那我这边为了方便,就直接使用 mongo 3.4 ,由于 3.4 的版本没有绑定 localhost 省去一部分麻烦。docker
在学习集群以前,咱们来聊聊数据库的升级方案,我我的认为有以下一些阶段,若是个人认知有错误,也烦请读者朋友指出。shell
阶段一
描述:开发初期,应用程序与数据库在同一台服务器
缺点:
- 应用程序与数据库争夺资源
- 数据库挂掉,应用程序也没法提供服务
- 没法提供数据容灾备份
- 读写在同一个节点,压力大
- 吞吐量小,提供服务能力有限
- 无端障恢复功能
复制代码
阶段二
描述:数据库独立到一台服务器,与应用程序分离
缺点:
- 数据库挂掉,应用程序也没法提供服务
- 没法提供数据容灾备份
- 读写在同一个节点,压力大
- 吞吐量小,提供服务能力有限
- 无端障恢复功能
复制代码
阶段三
描述:数据库有主从结构,一台主要,一台副本
缺点:
- 数据库挂掉,应用程序也没法提供服务
- 读写在同一个节点,压力大
- 吞吐量小,提供服务能力有限
- 无端障恢复功能
复制代码
阶段四
描述:一主两(多)从,读写分离
缺点:
- 吞吐量小,提供服务能力有限
- 数据库节点多,经济成本相对增大
复制代码
阶段五
描述:分片,横向扩展
缺点:
- 数据库节点多,经济成本相对增大
复制代码
version: '2'
services:
master:
image: mongo:3.4
volumes:
- /data/mongodbml/master:/data/db
command: mongod --dbpath /data/db --master
slaver:
image: mongo:3.4
volumes:
- /data/mongodbml/slaver:/data/db
command: mongod --dbpath /data/db --slave --source master:27017
links:
- master
复制代码
不用新建相应文件目录,直接运行 yml 文件便可。 在运行 yml 文件以后,执行如下初始化操做: 进入 master 的 mongo 命令行:数据库
docker-compose exec master mongo
复制代码
插入一条数据:bash
use test
db.test.insert({msg: "this message is from master", ts: new Date()})
复制代码
进入 slaver 的 mongo 命令行:服务器
docker-compose exec slaver mongo
复制代码
查看副本集信息:微信
rs.slaveOk()
use test
db.test.find()
复制代码
rs.slaveOk() 的功能学习
db.getMongo().setSlaveOk()
This allows the current connection to allow read operations to run on secondary members. See the readPref() method for more fine-grained control over read preference in the mongo shell.
复制代码
db.test.insert({msg: 'this is from slaver', ts: new Date()})
复制代码
插入失败,显示报错信息。测试
优缺点: master-slave 结构,当 master 挂了,slave 不会被选举为 master,因此这种结构只起到了备份数据的做用
version: '2'
services:
rs1:
image: mongo:3.4
volumes:
- /data/mongodbtest/replset/rs1:/data/db
command: mongod --dbpath /data/db --replSet myset
rs2:
image: mongo:3.4
volumes:
- /data/mongodbtest/replset/rs2:/data/db
command: mongod --dbpath /data/db --replSet myset
rs3:
image: mongo:3.4
volumes:
- /data/mongodbtest/replset/rs3:/data/db
command: mongod --dbpath /data/db --replSet myset
复制代码
不用新建相应文件目录,直接运行 yml 文件便可。 在运行 yml 文件以后,执行如下初始化操做:
docker-compose exec rs1 mongo
复制代码
初始化各个节点:
rs.initiate()
rs.add('rs2:27017')
rs.add('rs3:27017')
复制代码
查看配置与副本级状态
rs.conf()
rs.status()
复制代码
插入信息到主节点:
docker-compose exec rs1 mongo
use test
db.test.insert({msg: 'this is from primary', ts: new Date()})
复制代码
在副本集中检测信息是否同步:
docker-compose exec rs2 mongo
rs.slaveOk()
use test
db.test.find()
复制代码
docker-compose exec rs3 mongo
rs.slaveOk() //副本集默认仅primary可读写
use test
db.test.find()
复制代码
故障测试:
docker-compose stop rs1
复制代码
分别查看其它节点的信息:注意进入 mongo 命令行后的主从标识符
docker-compose exec rs2 mongo
复制代码
docker-compose exec rs3 mongo
复制代码
优缺点:
version: '2'
services:
master:
image: mongo:3.4
volumes:
- /data/mongodb3node/replset/rs1:/data/db
command: mongod --dbpath /data/db --replSet newset --oplogSize 128
slave:
image: mongo:3.4
volumes:
- /data/mongodb3node/replset/rs2:/data/db
command: mongod --dbpath /data/db --replSet newset --oplogSize 128
myarbiter:
image: mongo:3.4
command: mongod --dbpath /data/db --replSet newset --smallfiles --oplogSize 128
复制代码
不用新建相应文件目录,直接运行 yml 文件便可。 在运行 yml 文件以后,执行如下初始化操做:
docker-compose exec rs1 mongo
复制代码
初始化各个节点:
rs.initiate()
rs.add('slave:27017')
rs.add('myarbiter:27017',true)//设置为仲裁节点
复制代码
查看配置与副本级状态
rs.conf()
rs.status()
复制代码
插入信息到主节点:
docker-compose exec rs1 mongo
use test
db.test.insert({msg: 'this is from primary', ts: new Date()})
复制代码
在副本集中检测信息是否同步:
docker-compose exec rs2 mongo
rs.slaveOk()
use test
db.test.find()
复制代码
docker-compose exec rs3 mongo
rs.slaveOk() //副本集默认仅primary可读写
use test
db.test.find()
复制代码
故障测试:
docker-compose stop master
复制代码
分别查看其它节点的信息:
docker-compose exec slave mongo
复制代码
docker-compose exec myarbiter mongo
复制代码
优缺点:
下一篇文章来讲说 MongoDB 分片,欢迎关注