当前位置:Gxlcms > 数据库问题 > mongodb replica sets复制集详解

mongodb replica sets复制集详解

时间:2021-07-01 10:21:17 帮助过:3人阅读

和主从复制的原理一样,复制集也是通过读取oplog来进行数据传输.oplog是一个capped collection即固定表,创建表的时候可以指定其大小,当oplog满的时候会删除旧的数据.所以设置oplog的大小非常重要,如果oplog在primary节点被覆盖而尚未被secondary节点读取的话就要重新resync. 一般的使用replica sets复制集使用如下架构,一主一备,还有一个仲裁负责进行failover.仲裁主机不存放数据. 技术分享
技术分享
复制集使用的异步同步方式,复制集成员直接每隔2s发送一次hearbeat(pings).当主节点与其它成员通信超时10s后,一个secondary节点将会被选举为primary节点.在新的版本中,如果存在多个secondary节点,当第一个节点被选举为primary后,其它的secondary节点将从它开始复制数据.

二.创建replica sets

下面是搭建一个一主两从三节点replica sets的具体步骤

(1).添加replSet参数

在你所有节点的mongodb实例添加replSet参数,在一个group中的replSet参数需要一致,有点类似于oracle dg中的db_name参数. 然后启动所有节点的mongodb实例 例如我的主机名为mongodb1的配置文件:
[root@mongodb1 ~]# cat /etc/mongod.conf port=27017dbpath=/data/dblogpath=/data/log/mongod.logfork = trueoplogSize=500replSet = rs0
然后启动所有的实例:
[root@mongodb1 ~]# mongod -f /etc/mongod.conf about to fork child process, waiting until server is ready for connections.forked process: 2722child process started successfully, parent exiting

(2).初始化replica set

使用rs.initiate()来初始化复制集,在一个节点而且只能在一个节点进行初始化,例如我们这里在mongodb1上进行初始化,那么这个节点将会成为primary节点. 这里我们没有配置config参数文件,那么系统会使用默认的配置文件.
> rs.initiate(){	"info2" : "no configuration specified. Using a default configuration for the set",	"me" : "mongodb1:27017",	"ok" : 1}rs0:OTHER> 

当然你也可以先配置一个配置文件,然后使用rs.initiate(rsconf)来初始化,例如:

rsconf = {           _id: "rs0",           members: [                      {                       _id: 0,                       host: "<hostname>:27017"                      }                    ]         }

(3).检查初始化配置文件

使用rs.conf()来查看初始化配置文件:
rs0:OTHER> rs.conf(){	"_id" : "rs0",	"version" : 1,	"protocolVersion" : NumberLong(1),	"members" : [		{			"_id" : 0,			"host" : "mongodb1:27017",			"arbiterOnly" : false,			"buildIndexes" : true,			"hidden" : false,			"priority" : 1,			"tags" : {							},			"slaveDelay" : NumberLong(0),			"votes" : 1		}	],	"settings" : {		"chainingAllowed" : true,		"heartbeatIntervalMillis" : 2000,		"heartbeatTimeoutSecs" : 10,		"electionTimeoutMillis" : 10000,		"getLastErrorModes" : {					},		"getLastErrorDefaults" : {			"w" : 1,			"wtimeout" : 0		},		"replicaSetId" : ObjectId("575647b35e9005faa0e8d690")	}}
可以看到当前的members只有一个,即_id为0的,即我们刚刚初始化的这个节点.

(4).将剩下的成员添加到复制集

使用rs.add()方法将成员添加到复制集.你必须连接到primary节点来执行添加成员的操作.你可以使用rs.status()查看主节点信息:
rs0:PRIMARY> rs.status(){	"set" : "rs0",	"date" : ISODate("2016-06-07T04:16:20.542Z"),	"myState" : 1,	"term" : NumberLong(1),	"heartbeatIntervalMillis" : NumberLong(2000),	"members" : [		{			"_id" : 0,			"name" : "mongodb1:27017",			"health" : 1,			"state" : 1,			"stateStr" : "PRIMARY",			"uptime" : 1184,			"optime" : {				"ts" : Timestamp(1465272244, 1),				"t" : NumberLong(1)			},			"optimeDate" : ISODate("2016-06-07T04:04:04Z"),			"electionTime" : Timestamp(1465272243, 2),			"electionDate" : ISODate("2016-06-07T04:04:03Z"),			"configVersion" : 1,			"self" : true		}	],	"ok" : 1}
添加成员:
rs0:PRIMARY> rs.add("mongodb2:27017"){ "ok" : 1 }rs0:PRIMARY> rs.add("mongodb3:27017"){ "ok" : 1 }

再次查看复制集配置,可以看到members有三个成员了.

rs0:PRIMARY> rs.conf(){	"_id" : "rs0",	"version" : 3,	"protocolVersion" : NumberLong(1),	"members" : [		{			"_id" : 0,			"host" : "mongodb1:27017",			"arbiterOnly" : false,			"buildIndexes" : true,			"hidden" : false,			"priority" : 1,			"tags" : {							},			"slaveDelay" : NumberLong(0),			"votes" : 1		},		{			"_id" : 1,			"host" : "mongodb2:27017",			"arbiterOnly" : false,			"buildIndexes" : true,			"hidden" : false,			"priority" : 1,			"tags" : {							},			"slaveDelay" : NumberLong(0),			"votes" : 1		},		{			"_id" : 2,			"host" : "mongodb3:27017",			"arbiterOnly" : false,
                        
                    

人气教程排行