Mongodb 3.4 Replication

官方文档:https://docs.mongodb.com/manual/replication/ 关于ReplSet的文档

https://docs.mongodb.com/manual/reference/configuration-options/#replication-options 关于ReplSet的设置的文档

参考文章:[MongoDB] 安装MongoDB配置Replica Set

Replication:主从结构,一个Primary,多个Secondary,可能会有Arbitry。
Primary挂掉之后,会选举出一个Secondary作为Primary,与zookeeper类似。
Arbitry上面不存数据,只是为了凑数。选举算法要求节点数必须是奇数个,如果Primary+Secondary不是奇数个,就要用Arbitry凑数。
写数据只能在Primary,读数据默认也在Primary,可以配置成从Secondary读,可以选最近的节点。
数据在Primary上写成功之后,会将操作记录在oplog中,Secondary将oplog拷贝过去,然后照着操作一遍,就有数据了。
Primary和Secondary上面的数据保证最终一致性,可以为写操作配置write concern,有几个级别:在Primary上写完就认为写成功;写到oplog后认为写成功;写到一个/多个/某个/某几个Secondary之后认为写成功,等等。

前提:已经有若干台Ubuntu服务器已经安装了mongodb服务,并且已经打开了服务器外访问,关于Ubuntu安装mongodb服务,请参考《Ubuntu 16.04 LTS 安装Mongodb 3.4

服务器IP      ==》新IP        服务器名        节点  

192.168.31.209==》192.168.31.210    mongodbServer01    主节点

192.168.31.198==》192.168.31.211    mongodbServer02    副节点 

192.168.31.171==》192.168.31.212    mongodbServer03    副节点

设置固定IP配置文件

auto enp0s3
iface enp0s3 inet static #固定IP
address 192.168.31.210 #IP地址
netmask 255.255.255.0 #子网掩码
gateway 192.168.31.1 #网关
dns-nameservers 192.168.31.1 #DNS,我目前使用的是小米的路由器,以上为我的配置

借用官方的图


第一步:修改mongod配置文件(三台服务器都需要操作)

sudo vi /etc/mongod.conf

需要增加的内容即复制集设置中的内容

repliocation:
  oplogSizeMB: 1024
  replSetName: wesDemoRS

参数说明:

replication.oplogSizeMB

  数字,复制操作日志的最大大小(M),该mongod过程基于最大可用空间量创建一个oplog,对于64位系统,oplog通常是可用磁盘的5%,一旦mongod第一次创建了oplog,更改replication.oplogSizeMB将不会影响oplog的大小

replication.replSetName

  字符,作为其mongod部分副本集的名称,副本集中的所有主机都必须具有相同的名称,如果应用程序连接到多个副本集,则每个集合应具有不同的名称,某些驱动程序组副本通过副本集名称设置连接

replication.secondaryIndexPrefetch

  字符,仅适用于mmapv1存储引擎,在从oplog应用操作之前,副本集的辅助成员加载到内存中的索引,默认情况下,在从oplog应用操作之前,二进制文件将与操作相关的所有索引加载到内存中,可选的值有none/all/_id_only,该设置仅适用于mongod
replication.enableMajorityReadConcern

  布尔值,默认为False,版本3.2后的新功能


第二步:重新启动mongodb服务(三台服务器都需要操作)

sudo service mongod restart
sudo service mongod status


第三步:在mongodb主服务器(192.168.31.210)运行命令,启动复制集

#连接mongodb
mongo #使用admin数据库 use admin #查看当前的ReplSet的状态 rs.status()

初始化复制集并查看复制集状态,请参考《mongodb复制集搭建

#初始化ReplSet复制集
rs.initiate({_id:'wesDemoRS',members:[{_id:1,host:'192.168.31.210:27017'}]})
#查看ReplSet复制集状态 rs.status()


第四步:复制集群增加其他服务器(192.168.31.211)

rs.add("192.168.31.211:27017");
rs.add("192.168.31.212:27017");
rs.status();


 第五步:测试数据复制集效果,在主节点(192.168.31.210)上插入数据测试

use test
for(var i =0; i <4; i ++){db.user.insert({userName:'wes'+i,age:i})}

查看数据集,三个数据库都有数据,复制数据功能已经运行成功!!


第六步:如主节点掉线,是否会故障转移

现时是

192.168.31.210 主

192.168.31.211 副

192.168.31.212 副

模拟关闭主节点,在主节点,使用db.shutdownServer()命令

在两个副节点查看现时的状态,192.168.31.211变成了主节点,成功实现了故障转移!!

当把原来的主节点重新启动,查看复制集的状态,原来的主节点31.210会变成副节点,主节点依然是原来的31.211

注意192.168.31.210作为初始化时候的主节点,待服务器全部都重启之后,192.168.31.210依然会变回主节点


其他:我们现时只能在主节点查询数据,但如果想在副节点查询到数据应该怎么做呢?可以在副节点运行以下命令

#在当前连接让secondary可以提供读操作  
rs.slaveOk()

如果没有运行命令之前,会出现以下错误

wesDemoRS:SECONDARY> show collections
2017-09-01T21:14:54.665-0700 E QUERY [thread1]Error: listCollections failed:{
"ok":0,
"errmsg":"not master and slaveOk=false",
"code":13435,
"codeName":"NotMasterNoSlaveOk"
}

参考:

原文地址:https://www.cnblogs.com/weschen/p/7416974.html