mongodb副本集的docker化安装
1. 定义
一般只要生产环境就需要考虑冗余设计,保证在某一台服务器由于某种原因宕机后服务还可以正常运行。
mongo副本集是一组服务器,其中有一个主服务器(primary),用于处理客户端请求;还有多个备份服务器(secondary),用于保存主服务器的数据副本。如果主服务器崩溃了,备份服务器就会自动将其中一个成员升级为新的主服务器。
副本集在选主的过程中有一个很重要的概念叫“大多数(majority)”,选择主节点需要由大多数决定,主节点只有在得到大多数支持时才能继续作为主节点,写操作被复制到大多数成员时,这个写操作就是安全的。这里的大多数被定义为“副本中一半以上成员”。这些副本集中的成员挂了或者不可用,并不会影响“大多数”,因为“大多数”是基于副本集的配置来计算的,如下表:
| 1 | 1 |
| 2 | 2 |
| 3 | 2 |
| 4 | 3 |
| 5 | 3 |
| 6 | 4 |
| 7 | 4 |
副本集中通过设置priority的值来决定优先权的大小,这个值的范围是0--100,值越大,成为主的优先权越高。
目前读写分离的几种模式:
| primary | 主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。 |
| primaryPreferred | 首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点 |
| secondary | 从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。 |
| secondaryPreferred | 首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。 |
| nearest | 最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点 |
2. 安装
有了以上概念,就开始来部署副本集,我们设计3个mongo节点,分别如下:
| 名称 | 数据存储位置 | 优先级 | docker映射端口 | mongo启动端口 |
| mongo1 | /data/mongo/data1 | 1 | 27117 | 27017 |
| mongo2 | /data/mongo/data2 | 0.5 | 27217 | 27017 |
| mongo3 | /data/mongo/data3 | 0.8 | 27317 | 27017 |
那么开始启动mongo容器:
docker run --name mongo1 -v /data/mongo/data1:/data/db -d -p : mongo:3.4. --replSet ms
docker run --name mongo2 -v /data/mongo/data2:/data/db -d -p 27217:27017 mongo:3.4.2 --replSet ms
docker run --name mongo3 -v /data/mongo/data3:/data/db -d -p 27317:27017 mongo:3.4.2 --replSet ms
3个均启动完成,随便进入到一个容器里,如mongo1,并连接到数据库
[root@vhost18 mongo]# docker exec -it mongo1 bash
root@a04f48f03f1e:/#
root@a04f48f03f1e:/# mongo
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2018-12-24T09:06:15.245+0000 I CONTROL [initandlisten]
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten]
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten]
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten]
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-12-24T09:06:15.246+0000 I CONTROL [initandlisten]
>
传入配置并初始化:
config={_id:"ms",members:[{_id:,host:"ip:27117", priority:},{_id:,host:"ip:27217", priority:0.5},{_id:,host:"ip:27317", priority:0.8}]}
rs.initiate(config);
执行成功后是这样的:

节点在经过短暂的同步后,登陆mongo的控制台会显示成ms:PRIMARY,备份节点会显示成ms:SECONDARY,此时副本集就安装好了。
3. 验证
进入primary服务器,随便创建一个测试数据库和测试表数据:
ms:PRIMARY> use test
switched to db test
ms:PRIMARY> db.testCollection.insert({"key":"value"})
WriteResult({ "nInserted" : })
ms:PRIMARY> db.testCollection.find()
{ "_id" : ObjectId("5c20a3d7c5d174307dc3d516"), "key" : "value" }
然后进入secondary服务器查一下数据,会出现如下结果:
ms:SECONDARY> use test
switched to db test
ms:SECONDARY> db.testCollection.find()
Error: error: {
"ok" : ,
"errmsg" : "not master and slaveOk=false",
"code" : ,
"codeName" : "NotMasterNoSlaveOk"
}
这是因为secondary服务器在写多读少的应用使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由secondary来分担读的压力,primary只承担写操作
此时为了检测设置为slaveOk,并重新查询一下,会出现如下结果:
ms:SECONDARY> rs.slaveOk()
ms:SECONDARY> db.testCollection.find()
{ "_id" : ObjectId("5c20a3d7c5d174307dc3d516"), "key" : "value" }
可以检测到副本集生效了。
这时候主动把primary宕机或者删除,就可以看到主节点转移到mongo3了,为什么呢,因为我们配置的时候mongo3的priority比mongo2高。
4. 开启密码验证
副本集的验证与mongo单机开启验证不同:
mongo单机版本只需要在admin库中的system.user表里加好用户后就默认开启了验证模式。
mongo副本集在admin库中的system.user表里加好用户后,需要显示开启验证模式(启动参数添加:--auth),那么副本集之间的互相反问就需要用到keyFile了。
keyFile几个注意点:
- 权限不能太大,不然会报“permissions on xxx are too open”
- 权限不能太小,不然会报“permission denied”
因此我们在创建keyFile的时候首要先把权限赋值好:
openssl rand -base64 > mongodb.key
chmod mongodb.key
#docker启动需要把赋为999
chown mongodb.key
添加用户,需要到主节点上进行添加
docker exec -it mongo1 bash
mongo
use admin
db.createUser({user: "admin",pwd: "password",roles: [ { role: "root", db: "admin" } ]})
添加好用户后重启副本集,启动带上验证和keyFile
docker rm -f mongo1 mongo2 mongo3 docker run --name mongo1 -v /data/mongo/data1:/data/db -v /data/mongo/config/mongodb.key:/mongodb.key -d -p 27117:27017 mongo:3.4.2 --replSet ms --keyFile=mongodb.key --auth docker run --name mongo2 -v /data/mongo/data2:/data/db -v /data/mongo/config/mongodb.key:/mongodb.key -d -p 27217:27017 mongo:3.4.2 --replSet ms --keyFile=mongodb.key --auth docker run --name mongo3 -v /data/mongo/data3:/data/db -v /data/mongo/config/mongodb.key:/mongodb.key -d -p 27317:27017 mongo:3.4.2 --replSet ms --keyFile=mongodb.key --auth
重启完成后进行验证,与上一步的验证一致。
这样带有权限验证的mongo副本集就创建完毕了。
mongodb副本集的docker化安装的更多相关文章
- linux上安装MongoDB副本集(带keyfile安全认证以及用户权限)
搭建前准备 MongoDB版本:4.0 主要参考搭建MongoDB副本集网站:https://www.jianshu.com/p/f021f1f3c60b 安装之前最好先确定一下几点: 防火墙关闭 M ...
- Docker下搭建mongodb副本集
背景 有需求需要对mongodb做一个容灾备份.根据官网,发现mongodb最新版本(4.0)已经抛弃了主从模式而采用副本集进行容灾.副本集的优势在于:"有自动故障转移和恢复特性,其任意节点 ...
- Mongodb 副本集+分片
mongodb的分片功能是建立在副本集之上的,所以首先我们尝试着配置副本集. docker启动3个已经安装好mongo的镜像 # docker run -idt --name mongodb_01 m ...
- MongoDB 副本集的原理、搭建、应用
概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...
- MongoDB副本集学习(一):概述和环境搭建
MongoDB副本集概述 以下图片摘自MongoDB官方文档:http://docs.mongodb.org/manual/core/replication-introduction/ Primary ...
- 创建mongodb副本集操作实例
一:概念 相关概念及图片引用自这里 mongodb副本集: 副本集是一组服务器,其中一个是主服务器,用于处理客户请求:还有多个备份服务器,用于保存主服务器的数据副本.如果主服务器崩溃了,备份服务器自动 ...
- nodejs+mongoose操作mongodb副本集实例
继上一篇设置mongodb副本集之后,开始使用nodejs访问mongodb副本集: 1:创建项目 express 项目名称 2:npm install mongoose 安装mongo ...
- mongodb副本集搭建过程中的问题和解决技巧
在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天 ...
- mongodb副本集原理及部署记录
工作原理 1.副本集之间的复制是通过oplog日志现实的.备份节点通过查询这个集合就可以知道需要进行复制的操作 2.oplog是节点中local库中的一个固定的集合,在默认情况下oplog初始化大小为 ...
随机推荐
- react-native-splash-screen
react-native-splash-screen在GitHub上的地址:https://github.com/crazycodeboy/react-native-splash-screen rea ...
- tomcat + jdk 快速部署
环境: apache-tomcat-7.0.73 java version "1.8.0_112" 注释:创建普通用户,使用 sudu进行操作,本文略写. 1.JDK 1.jdk配 ...
- 并发包CallableAndFuture
/** * * @描述: Callable Future * * 程序运行一个线程,线程运行结束后,我们可以获取另一个线程的结果 * * @作者: Wnj . * @创建时间: 2017年5月16日 ...
- golang构造函数
http://blog.jobbole.com/107442/?utm_source=blog.jobbole.com&utm_medium=relatedPosts https://gocn ...
- eclipse 实用快捷键(最全)
注释: (1)Ctrl+Space 说明:内容助理.提供对方法,变量,参数,javadoc等得提示, 应运在多种场合,总之需要提示的时候可先按此快捷键. 注:避免输入法的切换设置与此设置冲突 ( ...
- skype for business server2015部署向导启动服务失败
命令行执行start-cspool失败 解决: 1.cmd执行servers.msc打开服务列表,将所有skype服务启动,默认是延迟启动 2.用管理员权限打开cmd,而不是普通权限 重新执行启动服务 ...
- win10下Java环境配置
JAVA_HOME : E:\ensoft\jdk(这个是jdk安装路径) CLASSPATH : .;E:\ensoft\jdk\lib;E:\ensoft\jdk\lib\dt.jar;E:\en ...
- Spring学习总结之---装配Bean
Spring配置的可选方案 前言:Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,作为开发人员,你需要告诉Spring容器要创建那些Bean,以哪种方式创建,并且如何将 ...
- Native广告月入万刀的全部细节!
一步一步跑Native原生广告: 第一步:跑native前期的准备工作 第二步:阅读大神的Native文档(100多页,英文,建议找一个支持在线翻译功能的app来阅读) 第三步:阅读我的几十条经验总结 ...
- SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践
培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...