部署副本集概述
副本集是一组维护相同数据集的 MongoDB 部署。副本集提供冗余和高可用性,是所有生产部署的基础。
什么是MongoDB副本集?
属于某个副本集的每个MongoDB实例都是一个成员。每个副本集都需要有一个主要成员和至少一个辅助成员。
主要成员是与副本集进行交易的主要访问点。它也是唯一可以接受写操作的成员。副本首先复制主成员的OPLOG(操作日志)。接下来,它在第二层的各自数据集上重复记录的变化。因此,每个副本集在同一时间只能有一个主要成员。不同的主站接受写操作会导致数据冲突。
通常情况下,应用程序只查询主要成员的写和读操作。你可以设计你的设置,从一个或多个辅助成员中读取。异步数据传输会导致二级节点的读取为旧数据服务。因此,这样的安排并不是每个用例的理想选择。
副本集的特点
自动故障转移机制使MongoDB的副本集在其竞争中脱颖而出。在没有主节点的情况下,副节点之间的自动选举会选出一个新的主节点。
MongoDB中的副本是如何工作的?
在MongoDB中,你将写操作发送到主服务器(节点)。主服务器将这些操作分配到次服务器上,复制数据。
在三种类型的MongoDB节点中,有两种曾经出现过:主节点和次节点。第三种在复制过程中派上用场的MongoDB节点是一个仲裁者。仲裁者节点没有数据集的副本,不能成为主节点。虽然如此,仲裁者确实参与了主节点的选举。
我们之前提到过当主节点瘫痪时会发生什么,但如果次要节点被咬了怎么办?在这种情况下,主节点变成了次要节点,数据库变得无法访问。
环境准备
在MongoDB中部署一个复制集需要至少三个节点,首先配置副本路径,也就是配置三个实例,在配置之前先停止正在运行的mongo.exe,也就是我们的服务。
将之前配置好的MongoDB里的bin复制到Mongodb1,在MongoDB1中新建db文件夹和log文件夹存在对应的数据库数据以及日志数据。
启动三个实例
需要使用replSet命令,在每个bin目录下启动,注意路径不要写错
mongod -port 27017 -dbpath E:\XL\MongoDB\data -logpath E:\XL\MongoDB\log\mongo.log -logappend -replSet rs0
mongod -port 27018 -dbpath E:\XL\MongoDB1\data -logpath E:\XL\MongoDB1\log\mongo1.log -replSet rs0
mongod -port 27019 -dbpath E:\XL\MongoDB2\data -logpath E:\XL\MongoDB2\log\mongo2.log -replSet rs0
第一个案例
第二个案列
第三个案例
注意:
启动案例的方法和教程1中安装MongoDB的方法一致,都是一次性的服务,每次打开某个案列都需要启动服务才可以,如果要创建永久服务则需要安装服务。
配置集群
进入MongoDB,配置设置
1.先进入MongoDB,再切换到admin数据库
2.配置节点优先级
priority为节点优先级,数字越高,优先级越高
使用命令来查看复制集状态
rs.status()
最后出现PRIMARY表示状态是正确的,当前节点是主节点
我们现在已经完成复制集的搭建
验证MongoDB复制集
需要验证一下复制集的数据同步
在主节点27017上的test库collection集合c1中插入数据
use test
db.c1.insert({name:"xjt",age:1})
登录另一个节点27018验证是否同步
我们需要运行命令:副本集的从库持久设置
rs.slaveOk()
MongoDB复制集数据同步就完成了。
故障转移
比如关闭主节点案列(前面一直不关闭的窗口第一个)
登录27018端口,会发现,他变成了主节点
重新再启动27017节点时候,27018会转换成从节点
到这里部署副本集就完成了