副本集Replica Set是一个术语,定义具有多节点的数据库集群,这些节点具有主从复制(master-slave replication) 且节点之间实现了自动故障转移。

这样的结构通常需要具有奇数个成员的成员(无论是否带有Arbiter节点),以确保正确选出PRIMARY(主)数据库。

选定的DB将处理所有传入的写操作,并将有关它们的信息存储在其oplog,每个辅助(从属)副本成员都可以访问和复制oplog,以应用于它们的数据集。

前置

  1. 为创建一个Replica set, 至少需要三个MongoDB实例,请查看官网安装指南.

  2. 本文会始终使用sudo指令,一般情况请给MongoDB服务创建一个标准用户mongod。

配置网络

为达到数据一致性,每个实例节点需要与集群其他节点通信,以三实例数据传输为例:

① replica set每个成员都使用私有IP,部署在同一数据中心,这也是推荐方式。

② replica set每个节点使用公网ip,节点部署在不同数据中心(在replication时有网络延迟),这种方式一般用于强灾备部署,如果采用这种方式,需要在主机之间配置SSL/TLS或通过vpn通信

replica set节点认证

本节你会使用openssl创建一个用于在集群成员之间认证的key文件,MongoDB推荐使用x.509证书加密连接。

① 产生key文件

openssl rand -base64  > mongo-keyfile

  将生成的key文件拷贝到复制集的每个成员

② 确保复制集成员都能访问同一路径的key文件:

sudo mkdir /opt/mongo
sudo mv ~/mongo-keyfile /opt/mongo
sudo chmod /opt/mongo/mongo-keyfile

③ 默认安装的MongoDB使用标准账户 mongod ,确保mongod对文件有所有权

sudo chown mongod:mongod /opt/mongo/mongo-keyfile

创建Admin用户

登陆你打算设定为 Primary的MongoDB节点,进入admin数据库,创建具有root特权的管理员用户

use admin
db.createUser({user: "mongo-admin", pwd: "password", roles:[{role: "root", db: "admin"}]}) 

配置MongoDB

修改复制集每个成员的mongod.conf:

net:
port:
bindIp: 127.0.0.1,192.0.2.1
security:
keyFile: /opt/mongo/mongo-keyfile
replication:
replSetName: rs0

指定key文件、replication set名称;

重启服务

sudo systemctl restart mongod

启动集群,添加节点

使用之前创建的管理员账户登陆 Primary MongoDB服务节点:

mongo -u mongo-admin -p --authenticationDatabase admin

① 初始化集群添加节点

rs.initiate()
rs.add("mongo-repl-2")
rs.add("mongo-repl-3")

  以上使用hostsname 代替节点ip地址,需要在节点/etc/hosts添加节点的 hosts映射条目。

② 使用rs.conf() 或 rs.status() 验证集群配置和状态

倒腾Replica Set

完成以上步骤,MongoDB 三实例Replica Set已经搭建好了。

登陆Primary节点做一些常规倒腾 (顺便捡漏一些你意想不到的姿势)

① 输入测试数据

use exampleDB
for (var i = ; i <= ; i++) db.exampleCollection.insert( { x : i } )

将会隐式创建exampleDB 和 文档集合exampleCollection。

请注意, 默认创建的Collection是不封顶的。

封顶capped collection 是有固定大小的集合,支持高通量操作,这些操作根据插入顺序插入和检索文档, 以循环缓冲区的形式工作(一旦集合达到分配空间,会通过override 旧的文档来腾挪出新的空间)。

② 观察Secondary节点是否同步到数据

使用创建的管理员账户登陆 Secondary节点,直接查询会报:

因为默认建立的Replica set读写均发生均在Primary节点(Secondary节点的作用是: 冗余备份、故障转移);

不过MongoDB replica set支持在客户端设置read preference(读操作首选项),大部分Driver均支持在连接字符串时指定 read preference读操作首选项,这个设置可实现真正意义的master-slave读写分离。

对应到shell会话,我们需要为本次Secondary会话 开启可读

db.getMongo().setSlaveOk()

使用shell命令的读取首选项

回过头来

实操本文,你已经可以完整搭建MongoDB Replica Set, 并大致掌握了副本集的绝大部分特性:主节点读写、辅助节点冗余备份;支持对辅助节点开启读操作。

后面我们聊一聊 副本集故障转移、副本集心跳保活、异步复制的相关姿势。

(1)解锁 MongoDB replica set核心姿势的更多相关文章

  1. 关于MongoDb Replica Set的故障转移集群——实战篇

    如果你还不了解Replica Set的相关理论,请猛戳传送门阅读笔者的上一篇博文. 因为Replica Set已经属于MongoDb的进阶应用,下文中关于MongoDb的基础知识笔者就不再赘述了,请参 ...

  2. MongoDb Replica Set中使用的地址

    Unable to connect to a member of the replica set matching the read preference Primary 今天尝试使用MongoDB ...

  3. MongoDB 学习笔记(三) MongoDB (replica set) 集群配置

    MongoDB Replica Sets的结构类似于以集群,完全可以把他当成一个集群,因为他确实与集群实现的作用是一样的:如果其中一个节点出现故障,其他的节点会马上将业务接管过来.而无需停机操作 Mo ...

  4. 解锁redis锁的正确姿势

    解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...

  5. mongodb replica set 和 nodejs中使用mongoose连接replica

    一.mongodb replication 介绍 官网上的第一句话就是Replication is the process of synchronizing data across multiple ...

  6. MongoDB Replica Set搭建集群

    MongoDB做集群,版本3.2官网推荐的集群方式Replica Set 准备服务器3台 两个standard节点(这两个节点直接可以互切primary secondary). 一个arbiter节点 ...

  7. mongodb replica set 配置高性能多服务器详解

    mongodb的多服务器配置,以前写过一篇文章,是master-slave模式的,请参考:详解mongodb 主从配置.master-slave模式,不能自动实现故障转移和恢复.所以推荐大家使用mon ...

  8. MongoDB replica set IDs do not match

    在搭建MongoDB(版本 3.2.9)的Replica Set时,使用 rs.status() 查看Replica Set的状态,发现一个成员异常:replica set IDs do not ma ...

  9. MongoDB Replica Set 选举过程

    什么是选举? 选举是副本集选择某个成员成为primary的过程.primary是一个副本集中唯一能够接收写操作的成员. 下面的事件能够引发一次选举: 第一次初始化一个副本集 Primary失效.rep ...

随机推荐

  1. codeforces 1214

    D 比赛的时候居然看漏了条件... 若在(x, y)格子,那么只能移动到(x+1, y)或(x, y+1) 这样的话就好做了,直接dp,然后统计每一种路径长度经过的点数. #include<cs ...

  2. PHP 面试题 一

    1.用PHP打印出前一天的时间格式是2017-5-10 22:21:21(2分) 月,日没有前导零:2017-5-1 22:21:21echo date("Y-n-j H:i:s" ...

  3. 困扰的问题终于解决了-docker时区不正确的问题修改记

    前一阵子有一台服务器,mysql的时间比北京时间晚了8个小时.我知道是时区的问题,但是不知道为什么弄成这样,宿主机没有问题,后来一看mysql的docker,时区是错的. mybatis-plus打印 ...

  4. 【t085】Sramoc问题

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] Sramoc(K,M)表示用数字0,1,2,...,K-1组成的自然数中能被M整除的最小数.给定K,M ...

  5. jieba—parallel

    jieba 并行处理进行测试,注意:并行分词仅支持默认分词器 jieba.dt 和 jieba.posseg.dt import sys import time import jieba jieba. ...

  6. idea运行项目时报错:Error:java无效的源发行版:1.8

    解决办法:project structure中设置 JDK 和language 匹配即可.如图: 另外如果有maven,需要把maven中JDK版本设置成一样的.

  7. Linux 内核总线方法

    有几个给 bus_type 结构定义的方法; 它们允许总线代码作为一个设备核心和单独驱动之 间的中介. 在 2.6.10 内核中定义的方法是: int (*match)(struct device * ...

  8. java 环境 笔记

    1. 下载idea https://blog.csdn.net/yl1712725180/article/details/80309862   破解方法:                   针对20 ...

  9. 2018-2-13-win10-uwp-模拟网页输入

    title author date CreateTime categories win10 uwp 模拟网页输入 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 1 ...

  10. 基于bootstrap3.3.4的简单框架搭建(左侧导航收起滚动)

    前提:博主本人做.net方向的2年多了 去年的后半年公司要做基于bootstrap框架的后台,由于没有经验,然后跟公司美工一块从0开始折腾,对这个框架不是太熟悉,然后就开始各种自己写js写css的往里 ...