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. python 进程池的使用

    进程同步 进程的数据是独立存在的,进程也能加锁. from multiprocessing import Process, Lock def f(l,i): l.acquire() print('he ...

  2. [PE格式分析] 3.IMAGE_NT_HEADER

    源代码如下: typedef struct _IMAGE_NT_HEADERS { +00h DWORD Signature; // 固定为 0x00004550 根据小端存储为:"PE.. ...

  3. beifencode

    package com.hesheng.myapplication; import android.content.Context;import android.graphics.Bitmap;imp ...

  4. 【Leetcode】【Easy】Count and Say

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  5. 使用NSURLConnection实现大文件断点下载

    使用NSURLConnection实现大文件断点下载 由于是实现大文件的断点下载,不是下载一般图片什么的.在设计这个类的时候本身就不会考虑把下载的文件缓存到内存中,而是直接写到文件系统. 要实现断点下 ...

  6. Linux入门-1 常用命令

    写在前面 当年初学Linux的时候,在网上找到nash_su大神的一套视频,讲的特别好,基础部分看了好几遍,很多知识点让我受益至今. 十分庆幸当年的选择,也十分感谢nash_su大神,祝你事事顺心,每 ...

  7. pyqt5加载网页的简单使用

    如下初步使用了pyqt5,构造了一个webview来加载网址,呈现网页. 1.安装pyqt5包,可使用douban的源 pip install pyqt5 -i http://pypi.douban. ...

  8. JS 和 Jq 获取客户端各种屏幕宽度和高度

    //javascript 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: documen ...

  9. Spark Broadcast内幕解密:Broadcast运行机制彻底解密、Broadcast源码解析、Broadcast最佳实践

    本课主题 Broadcast 运行原理图 Broadcast 源码解析 Broadcast 运行原理图 Broadcast 就是将数据从一个节点发送到其他的节点上; 例如 Driver 上有一张表,而 ...

  10. hdu5194 DZY Loves Balls 【概率论 or 搜索】

    //yy:那天考完概率论,上网无聊搜个期望可加性就搜到这题,看到以后特别有亲和感,挺有意思的. hdu5194 DZY Loves Balls [概率论 or 搜索] 题意: 一个盒子里有n个黑球和m ...