MongoDB复制原理

MongoDB复制原理

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb各个节点常见的搭配方式为:一主一从、一主多从。

主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

MongoDB复制结构图如下所示:

 

以上结构图总,客户端总主节点读取数据,在客户端写入数据到主节点是, 主节点与从节点进行数据交互保障数据的一致性。

副本集特征:

· N 个节点的集群

· 任何节点可作为主节点

· 所有写入操作都在主节点上

· 自动故障转移

· 自动恢复

MongoDB副本集设置

在本教程中我们使用同一个MongoDB来做MongoDB主从的实验, 操作步骤如下:

1、关闭正在运行的MongoDB服务器。

现在我们通过指定 --replSet 选项来启动mongoDB。--replSet 基本语法格式如下:

mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

实例

mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0

以上实例会启动一个名为rs0的MongoDB实例,其端口号为27017。

启动后打开命令提示框并连接上mongoDB服务。

Mongo客户端使用命令rs.initiate()来启动一个新的副本集。

我们可以使用rs.conf()来查看副本集的配置

查看副本集状态使用 rs.status() 命令

 

副本集添加成员

添加副本集的成员,我们需要使用多条服务器来启动mongo服务。进入Mongo客户端,并使用rs.add()方法来添加副本集的成员。

语法

rs.add() 命令基本语法格式如下:

>rs.add(HOST_NAME:PORT)

实例

假设你已经启动了一个名为mongod1.net,端口号为27017的Mongo服务。 在客户端命令窗口使用rs.add() 命令将其添加到副本集中,命令如下所示:

>rs.add("mongod1.net:27017")>

MongoDB中你只能通过主节点将Mongo服务添加到副本集中, 判断当前运行的Mongo服务是否为主节点可以使用命令db.isMaster() 。

MongoDB的副本集与我们常见的主从有所不同,主从在主机宕机后所有服务将停止,而副本集在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况。

 

MongoDB在不同主机间复制数据库和集合的教程

MongoDB自带了clone一族JavaScript函数来进行数据的复制,这里我们总结了MongoDB在不同主机间复制数据库和集合的教程,列举出了一些主从复制操作中常用的重要函数:

1. db.cloneCollection()
db.cloneCollection(from, collection, query)
在不同的mongodb实例间复制数据,db.cloneCollection是cloneCollection数据库命令的一个外在体现。

1

2

3

4

5

6

7

8

function (from, collection, query) {

 assert( isString(from) && from.length );

 assert( isString(collection) && collection.length );

 collection = this._name + "." + collection;

 query = query || {};

 return this._dbCommand( { cloneCollection:collection, from:from, query:query

} );

}

参数:

1

2

3

from  string  包含需要复制的表的mongodb实例主机名

collection string  数据实例中需要复制的表名,该命令只可以复制远程mongodb实例上相同数据库名称的表

query  document 可选的选项。标准的查询语句过滤掉不需要的文档

db.cloneCollection()不允许通过mongos来复制表,只能通过mongod实例来操作。
示例:
192.168.11.51 mongod实例mydb库,bar集合:

1

2

3

{ "_id" : ObjectId("53687d9df433cf04b788c6d1"), "name" : "dog" }

{ "_id" : ObjectId("53687ff1f433cf04b788c6d2"), "name" : "cat" }

{ "_id" : ObjectId("53687ff4f433cf04b788c6d3"), "name" : "tiger" }

本地mongod实例mydb库,复制远程主机的bar集合中满足查询条件的文档:

1

2

3

db.cloneCollection("192.168.11.52", "bar", {"name" : "tiger"})

db.bar.find();

{ "_id" : ObjectId("53687ff4f433cf04b788c6d3"), "name" : "tiger" }

2. db.cloneDatabase()
db.cloneDatabase("hostname")
复制远程主机的数据库到本地,该命令假设远程mongodb实例中拥有与本地相同的数据库名称。

1

hostname  string  包含需要复制的数据库的mongodb实例主机名

db.cloneDatabase是clone数据库命令的一个外在体现。

1

2

3

4

function (from) {

 assert( isString(from) && from.length );

 return this._dbCommand( { clone: from } );

}

示例:
192.168.11.51 mongod实例mydb库,
本机mongodb实例:

1

2

3

use mydb

db.dropDatabase();

db.cloneDatabase("192.168.11.52");

3. db.copyDatabase()
db.copyDatabase(fromdb, todb, fromhost, username, password)
从远程主机复制数据库到本地,或从本地复制数据库到远程主机。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

db.copyDatabase是copydb数据库命令的一个外在体现。

function (fromdb, todb, fromhost, username, password) {

 assert( isString(fromdb) && fromdb.length );

 assert( isString(todb) && todb.length );

 fromhost = fromhost || "";

 if ( username && password ) {

  var n = this._adminCommand( { copydbgetnonce : 1, fromhost:fromhost } );

 

  return this._adminCommand( { copydb:1, fromhost:fromhost, fromdb:fromdb,

 todb:todb, username:username, nonce:n.nonce, key:this.__pwHash( n.nonce, userna

me, password ) } );

 } else {

  return this._adminCommand( { copydb:1, fromhost:fromhost, fromdb:fromdb,

 todb:todb } );

 }

}

参数:

1

2

3

4

5

fromdb  string  源数据库名称

todb  string  目标数据库名称

fromhost string  可选项,源数据库的主机名。如果是同一主机,忽略该选项

username string  可选项,源主机名用户名

password string  可选项,源主机名用户名对应密码

属性:
1)db.copyDatabase()运行在目标主机的mongod实例上。
2)db.copyDatabase()会创建目标数据库,如果其原来不存在。
3)db.copyDatabase()需要目标机器上有足够的空间进行复制。
4)db.copyDatabase()并不会产生目标数据库的即时快照。如果在复制过程中在源或目标库发生读写操作,会导致数据库不一致。
5)db.copyDatabase()在操作过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值