副本集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. PyTorch官方中文文档:torch.optim 优化器参数

    内容预览: step(closure) 进行单次优化 (参数更新). 参数: closure (callable) –...~ 参数: params (iterable) – 待优化参数的iterab ...

  2. java三大循环结构

    用于处理需要重复执行的操作: 根据判断条件的成立与否,决定程序段落的执行次数,而这个程序段落我们称为循环体: while:事先不需要知道循环执行多少次: do  while:同上,只是至少要执行一次( ...

  3. iptablesIP规则的保存与恢复

    iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载 使用命令iptables-save来保存规则.一般用 iptabl ...

  4. Codeforces Round #185 (Div. 1 + Div. 2)

    A. Whose sentence is it? 模拟. B. Archer \[pro=\frac{a}{b}+(1-\frac{a}{b})(1-\frac{c}{d})\frac{a}{b}+( ...

  5. Python--day41--threading中的定时器Timer

    定时器Timer:定时开启线程 代码示例: #定时开启线程 import time from threading import Timer def func(): print('时间同步') #1-3 ...

  6. 四叶草(css)

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <style> . ...

  7. 2019-10-18-WPF-高速书写-StylusPlugIn-原理

    title author date CreateTime categories WPF 高速书写 StylusPlugIn 原理 lindexi 2019-10-18 21:23:46 +0800 2 ...

  8. javaScript通过URL获取参数

    // 函数方法 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=( ...

  9. asp.net core 3.0 JObject The collection type 'Newtonsoft.Json.Linq.JObject' is not supported

    在asp.net core 3.0 中,如果直接在Controller中返回 Jobject 类型,会抛出如下错误: The collection type 'Newtonsoft.Json.Linq ...

  10. windows下Qt编译Qtxlsx库和qtxlsx库的使用方法

    最近接了个项目,合作的学长让用Qt写,而其中最重要的需求是将数据库的数据写入excel表格中和将excel的数据导入到数据库中,自己查阅了和多资料,最后决定使用qtxlsx开源库来操作excel,在编 ...