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几个注意点:

  1. 权限不能太大,不然会报“permissions on xxx are too open”
  2. 权限不能太小,不然会报“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化安装的更多相关文章

  1. linux上安装MongoDB副本集(带keyfile安全认证以及用户权限)

    搭建前准备 MongoDB版本:4.0 主要参考搭建MongoDB副本集网站:https://www.jianshu.com/p/f021f1f3c60b 安装之前最好先确定一下几点: 防火墙关闭 M ...

  2. Docker下搭建mongodb副本集

    背景 有需求需要对mongodb做一个容灾备份.根据官网,发现mongodb最新版本(4.0)已经抛弃了主从模式而采用副本集进行容灾.副本集的优势在于:"有自动故障转移和恢复特性,其任意节点 ...

  3. Mongodb 副本集+分片

    mongodb的分片功能是建立在副本集之上的,所以首先我们尝试着配置副本集. docker启动3个已经安装好mongo的镜像 # docker run -idt --name mongodb_01 m ...

  4. MongoDB 副本集的原理、搭建、应用

    概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...

  5. MongoDB副本集学习(一):概述和环境搭建

    MongoDB副本集概述 以下图片摘自MongoDB官方文档:http://docs.mongodb.org/manual/core/replication-introduction/ Primary ...

  6. 创建mongodb副本集操作实例

    一:概念 相关概念及图片引用自这里 mongodb副本集: 副本集是一组服务器,其中一个是主服务器,用于处理客户请求:还有多个备份服务器,用于保存主服务器的数据副本.如果主服务器崩溃了,备份服务器自动 ...

  7. nodejs+mongoose操作mongodb副本集实例

    继上一篇设置mongodb副本集之后,开始使用nodejs访问mongodb副本集: 1:创建项目     express 项目名称 2:npm install mongoose    安装mongo ...

  8. mongodb副本集搭建过程中的问题和解决技巧

    在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天 ...

  9. mongodb副本集原理及部署记录

    工作原理 1.副本集之间的复制是通过oplog日志现实的.备份节点通过查询这个集合就可以知道需要进行复制的操作 2.oplog是节点中local库中的一个固定的集合,在默认情况下oplog初始化大小为 ...

随机推荐

  1. tcp三次握手和四次挥手(2)

      背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进 ...

  2. SQL Server ->> WITH RESULT SETS子句

    SQL Server 2012对EXECUTE子句引入了WITH RESULT SETS选项,用于对EXECUTE语句执行的存储过程或者动态语句结果进行一个指定数据类型的转换,这样可以避免一种情况就是 ...

  3. MySQL案例01:Last_SQL_Errno: 1755 Cannot execute the current event group in the parallel mode

    周五同事监控报警,有个MySQL从库复制状态异常,让我帮忙排查下,经过排查发现是MySQL5.6并行复制的一个Bug所致,具体处理过程如下: 一.错误信息 登录mysql从库服务器,检查复制状态 my ...

  4. MySQL数据操作(借鉴)

    /* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld ...

  5. python全栈学习笔记(三)网络基础之网络设备及架构介绍

       

  6. IERS-OSPF基本工作原理

    IERS-OSPF基本工作原理 一.邻居建立建立过程 1.Router ID 用于在自治系统中唯一标识一台运行OSPF的路由器,每台运行OSPF的路由器都有一个ROUTER ID Route ID 是 ...

  7. kali配置ip,更新源,更新签名

    以下是我在简单玩kali时候碰到的一些问题,然后找到的解决办法,能成功解决我当时碰到的问题,如果你有疑问或者碰到不能解决的问题可以在下面评论 ############################# ...

  8. 记录一个比较少用的容器C++ std::bitset

    bitset存储二进制数位. bitset就像一个bool类型的数组一样,但是有空间优化——bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一. bitset中的每个 ...

  9. JavaScript的DOM_操作表格

    一.使用HTML标签创建表格 thead.tfoot.caption标签在一个表格中只能有一个    tbody.tr.td.th标签在一个表格中可以有N个 <table border=&quo ...

  10. SOJ4478 Easy Problem II(模拟、栈)

    Time Limit: 3000 MS Memory Limit: 131072 K Description 在数据结构中 我们学习过 栈 这种数据结构 通过栈 我们可以将1,2,3,...,n转化成 ...