MongoDB主从复制

本文详细介绍了MongoDB的主从复制设置过程,包括主从复制的好处、数据库目录建立、主库和从库的启动,以及如何测试主从复制的同步效果。通过创建并启动主库和两个从库,确保数据的备份、恢复和读写分离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概述

Mongo是一个高性能,开源,模式自由(schema-free)的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值(key-value)存储方式。Mongo使用C++开发,具有以下特性:

l 面向集合的存储:适合存储对象及JSON形式的数据。

l 动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。

l 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。

l 查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。

l 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。

l 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。

l 自动分片以支持云级别的伸缩性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。

模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。

存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。

MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。

2、主从复制

Ø  主从复制模型图:


Ø  从上面的图形中我们可以分析出这种架构有如下的好处:

  <1>数据备份。

  <2>数据恢复。

  <3>读写分离。

2.1、建立主从数据库目录

mkdir -p /data0/mongodb/masterdb

mkdir -p /data0/mongodb/slavedb_1

mkdir -p /data0/mongodb/slavedb_2

2.2、启动主库服务器

为了方便以后使用,可以创建两个启动脚本文件置放在mongoDB启动路径的bin目录下,这两个文件分别为主库启动脚本和从库启动脚本,首先创建主库启动脚本文件,如下所示:

[root@mongo01bin]# vi master.sh

/usr/local/mongodb/mongodb-linux-x86_64-2.2.0/bin/mongod--dbpath /data0/mongodb/masterdb --port 10000 --master –smallfiles –fork

Ø 前台启动主库服务器

在mongoDB主机启动路径bin目录下输入前台启动命令:

~/bin/mongod--dbpath /data0/mongodb/masterdb --port 10000 --master --smallfiles

【注】后台启动命令如下(建议在实际使用环境中采用后台启动方式):

~/bin/mongod--dbpath /data0/mongodb/masterdb --port 10000 --master –smallfiles --fork

Ø  查看主库服务器前台启动消息

[root@mongo01bin]# ./ mongod --dbpath /data0/mongodb/masterdb --port 10000 --master--smallfiles

Fri Sep 1412:46:00 [initandlisten] MongoDB starting : pid=10515 port=10000dbpath=/data0/mongodb/masterdb master=1 64-bit host=mongo01

Fri Sep 1412:46:00 [initandlisten] db version v2.2.0, pdfile version 4.5

Fri Sep 1412:46:00 [initandlisten] git version: f5e83eae9cfbec7fb7a071321928f00d1b0c5207

Fri Sep 1412:46:00 [initandlisten] build info: Linux ip-10-2-29-402.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64BOOST_LIB_VERSION=1_49

Fri Sep 1412:46:00 [initandlisten] options: { dbpath:"/data0/mongodb/masterdb", master: true, port: 10000, smallfiles:true }

Fri Sep 1412:46:00 [initandlisten] journal dir=/data0/mongodb/masterdb/journal

Fri Sep 1412:46:00 [initandlisten] recover : no journal files present, no recovery needed

Fri Sep 1412:46:01 [initandlisten] preallocateIsFaster=true 12.84

Fri Sep 1412:46:02 [initandlisten] preallocateIsFaster=true 14.8

Fri Sep 1412:46:03 [initandlisten] preallocateIsFaster=true 14.2

Fri Sep 1412:46:03 [initandlisten] preallocateIsFaster check took 3.317 secs

Fri Sep 1412:46:03 [initandlisten] preallocating a journal file/data0/mongodb/masterdb/journal/prealloc.0

Fri Sep 1412:46:06 [initandlisten]            94371840/134217728      70%

Fri Sep 1412:46:07 [initandlisten] preallocating a journal file/data0/mongodb/masterdb/journal/prealloc.1

Fri Sep 1412:46:16 [initandlisten]            104857600/134217728     78%

Fri Sep 1412:46:18 [initandlisten] preallocating a journal file/data0/mongodb/masterdb/journal/prealloc.2

Fri Sep 1412:46:21 [initandlisten]            31457280/134217728      23%

Fri Sep 1412:46:24 [initandlisten]            41943040/134217728      31%

Fri Sep 1412:46:27 [initandlisten]            52428800/134217728      39%

Fri Sep 1412:46:41 [initandlisten]            73400320/134217728      54%

Fri Sep 1412:46:43 [initandlisten] ******

Fri Sep 1412:46:43 [initandlisten] creating replication oplog of size: 944MB...

Fri Sep 1412:46:43 [FileAllocator] allocating new datafile/data0/mongodb/masterdb/local.ns, filling with zeroes...

Fri Sep 1412:46:43 [FileAllocator] creating directory /data0/mongodb/masterdb/_tmp

Fri Sep 1412:46:43 [FileAllocator] done allocating datafile/data0/mongodb/masterdb/local.ns, size: 16MB, took 0.003 secs

Fri Sep 1412:46:44 [FileAllocator] allocating new datafile /data0/mongodb/masterdb/local.0,filling with zeroes...

Fri Sep 1412:46:44 [FileAllocator] done allocating datafile/data0/mongodb/masterdb/local.0, size: 511MB, took 0.014 secs

Fri Sep 1412:46:44 [FileAllocator] allocating new datafile /data0/mongodb/masterdb/local.1,filling with zeroes...

Fri Sep 1412:46:44 [FileAllocator] done allocating datafile/data0/mongodb/masterdb/local.1, size: 511MB, took 0.034 secs

2.3、启动两个从库服务器

为了方便以后使用,可以创建两个启动脚本文件置放在mongoDB启动路径的bin目录下,这两个文件分别为主库启动脚本和从库启动脚本,如下所示为从库启动脚本的创建:

[root@mongo01bin]# vi slave.sh

 

/usr/local/mongodb/mongodb-linux-x86_64-2.2.0/bin/mongod--dbpath /data0/mongodb/slavedb_1 --source 192.168.1.36:10000 --smallfiles--slave --port 10001 --fork

/usr/local/mongodb/mongodb-linux-x86_64-2.2.0/bin/mongod--dbpath /data0/mongodb/slavedb_2 --source 192.168.1.36:10000 --smallfiles--slave --port 10002 --fork

Ø 启动从库服务器后,就会看到有日志显示从主服务器复制内容了。

Ø 从库服务器启动是到的相关参数:

--autoresync 当发现从服务器的数据不是最新时,开始从主服务器请求同步数据;

--slavedelay 同步延迟,单位:秒;

--fork 后台启动,建议实际使用环境中使用该参数进行后台启动。

   【注】由于本例是为了演示mongoDB主从复制的详情,所以才采用了不带--fork参数的前台启动方式,正是使用时仍然建议大家使用带--fork参数的后台启动方式。

2.3.1、前台启动10001端口的从库服务器

Ø  输入前台启动命令

./mongod--dbpath /data0/mongodb/slavedb_1 --source 192.168.1.36:10000 --smallfiles--slave --port 10001

【注】后台启动命令如下:

./mongod--dbpath /data0/mongodb/slavedb_1 --source 192.168.1.36:10000 --smallfiles--slave --port 10001 --fork

Ø  查看前台启动信息

[root@mongo01bin]# ./mongod --dbpath /data0/mongodb/slavedb_1 --source 192.168.1.36:10000--smallfiles --slave --port 10001

Fri Sep 1412:48:13 [initandlisten] MongoDB starting : pid=10712 port=10001dbpath=/data0/mongodb/slavedb_1 slave=1 64-bit host=mongo01

Fri Sep 1412:48:13 [initandlisten] db version v2.2.0, pdfile version 4.5

Fri Sep 1412:48:13 [initandlisten] git version: f5e83eae9cfbec7fb7a071321928f00d1b0c5207

Fri Sep 1412:48:13 [initandlisten] build info: Linux ip-10-2-29-402.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64BOOST_LIB_VERSION=1_49

Fri Sep 1412:48:13 [initandlisten] options: { dbpath: "/data0/mongodb/slavedb_1",port: 10001, slave: true, smallfiles: true, source:"192.168.1.36:10000" }

Fri Sep 1412:48:13 [initandlisten] journal dir=/data0/mongodb/slavedb_1/journal

Fri Sep 1412:48:13 [initandlisten] recover : no journal files present, no recovery needed

Fri Sep 1412:48:18 [initandlisten] preallocateIsFaster=true 95.36

Fri Sep 1412:48:19 [initandlisten] preallocateIsFaster=true 14.74

Fri Sep 1412:48:20 [initandlisten] preallocateIsFaster=true 14.6

Fri Sep 1412:48:20 [initandlisten] preallocateIsFaster check took 7.463 secs

Fri Sep 1412:48:20 [initandlisten] preallocating a journal file/data0/mongodb/slavedb_1/journal/prealloc.0

Fri Sep 1412:48:24 [initandlisten]            31457280/134217728      23%

Fri Sep 1412:48:27 [initandlisten]             62914560/134217728      46%

Fri Sep 1412:48:30 [initandlisten]            104857600/134217728     78%

Fri Sep 1412:48:32 [initandlisten] preallocating a journal file/data0/mongodb/slavedb_1/journal/prealloc.1

Fri Sep 1412:48:34 [initandlisten] preallocating a journal file/data0/mongodb/slavedb_1/journal/prealloc.2

Fri Sep 1412:48:35 [websvr] admin web console waiting for connections on port 11001

Fri Sep 1412:48:35 [initandlisten] waiting for connections on port 10001

Fri Sep 1412:48:36 [FileAllocator] allocating new datafile/data0/mongodb/slavedb_1/local.ns, filling with zeroes...

Fri Sep 1412:48:36 [FileAllocator] creating directory /data0/mongodb/slavedb_1/_tmp

Fri Sep 1412:48:36 [FileAllocator] done allocating datafile /data0/mongodb/slavedb_1/local.ns,size: 16MB,  took 0.003 secs

Fri Sep 1412:48:36 [FileAllocator] allocating new datafile/data0/mongodb/slavedb_1/local.0, filling with zeroes...

Fri Sep 1412:48:36 [FileAllocator] done allocating datafile/data0/mongodb/slavedb_1/local.0, size: 16MB, took 0.002 secs

Fri Sep 1412:48:36 [FileAllocator] allocating new datafile/data0/mongodb/slavedb_1/local.1, filling with zeroes...

Fri Sep 1412:48:36 [replslave] build index local.sources { _id: 1 }

Fri Sep 1412:48:36 [replslave] build index done. scanned 0 total records. 0.131 secs

Fri Sep 1412:48:36 [FileAllocator] done allocating datafile/data0/mongodb/slavedb_1/local.1, size: 32MB, took 0.224 secs

2.3.2、前台启动10002端口的从库服务器

Ø  输入前台启动命令

./mongod --dbpath/data0/mongodb/slavedb_2 --source 192.168.1.36:10000 --smallfiles --slave--port 10002

【注】后台启动命令如下:

./mongod--dbpath /data0/mongodb/slavedb_2 --source 192.168.1.36:10000 --smallfiles--slave --port 10002 --fork

Ø  查看前台启动信息

[root@mongo01bin]# ./mongod --dbpath /data0/mongodb/slavedb_2 --source 192.168.1.36:10000 --smallfiles--slave --port 10002

Fri Sep 1412:48:13 [initandlisten] MongoDB starting : pid=10712 port=10002dbpath=/data0/mongodb/slavedb_2 slave=2 64-bit host=mongo01

Fri Sep 1412:48:13 [initandlisten] db version v2.2.0, pdfile version 4.5

Fri Sep 1412:48:13 [initandlisten] git version: f5e83eae9cfbec7fb7a071321928f00d1b0c5207

Fri Sep 1412:48:13 [initandlisten] build info: Linux ip-10-2-29-402.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64BOOST_LIB_VERSION=1_49

Fri Sep 1412:48:13 [initandlisten] options: { dbpath: "/data0/mongodb/slavedb_2",port: 10001, slave: true, smallfiles: true, source:"192.168.1.36:10000" }

Fri Sep 1412:48:13 [initandlisten] journal dir=/data0/mongodb/slavedb_2/journal

Fri Sep 1412:48:13 [initandlisten] recover : no journal files present, no recovery needed

Fri Sep 1412:48:18 [initandlisten] preallocateIsFaster=true 95.36

Fri Sep 1412:48:19 [initandlisten] preallocateIsFaster=true 14.74

Fri Sep 1412:48:20 [initandlisten] preallocateIsFaster=true 14.6

Fri Sep 1412:48:20 [initandlisten] preallocateIsFaster check took 7.463 secs

Fri Sep 1412:48:20 [initandlisten] preallocating a journal file/data0/mongodb/slavedb_1/journal/prealloc.0

Fri Sep 1412:48:24 [initandlisten]            31457280/134217728      23%

Fri Sep 1412:48:27 [initandlisten]            62914560/134217728      46%

Fri Sep 1412:48:30 [initandlisten]            104857600/134217728     78%

Fri Sep 1412:48:32 [initandlisten] preallocating a journal file /data0/mongodb/slavedb_2/journal/prealloc.1

Fri Sep 1412:48:34 [initandlisten] preallocating a journal file /data0/mongodb/slavedb_2/journal/prealloc.2

2.4、测试主从复制

2.4.1、在主库服务器中新建数据库testdb

在主库服务器的mongoDB启动路径bin目录下进行一下操作:

./mongo --port10000

> showdbs

local   1.01513671875GB

> usetestdb

switchedto db testdb

>db.blog.save({title:"new article"})

> showdbs

local   1.01513671875GB

testdb  0.0625GB

> usetestdb

switchedto db testdb

> showcollections

blog

system.indexes

>db.blog.find()

{"_id" : ObjectId("5052b7e65583a0aa65c95939"),"title" : "new article" }

2.4.2、主从同步

在主库新建testdb数据库并添加了数据内容后,返回从库服务器前台并查看输入的消息,显示如下内容:


出现上图红色边框内的内容后,说明主从同步已完成,此时返回从库查看该库中是否存在testdb数据库及数据,如果存在,则说明主从同步成功,反之则失败。如下所示:

[root@mongo01bin]# ./mongo --port 10001

MongoDBshell version: 2.2.0

connectingto: 127.0.0.1:10001/test

> showdbsshow dbs

local   0.0625GB

testdb  0.0625GB

> usetestdbuse testdb

switchedto db testdb

> showcollectionsshow collections

blog

system.indexes

>db.blog.find()db.blog.find()

{"_id" : ObjectId("5052b7e65583a0aa65c95939"),"title" : "new article" }

>

#此为同步过来的数据,测试成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值