现在的位置: 首页 > 综合 > 正文

linux下mongodb的副本集

2013年09月21日 ⁄ 综合 ⁄ 共 4022字 ⁄ 字号 评论关闭

一、节点类型

standard:常规节点,它存储一份完整的数据副本,参与选举投票,有可能成为活跃节点。

passive:存储了完整的数据副本,参与投票,不能成为活跃节点。

arbiter:仲裁节点,只参与投票,不接收复制的数据,也不能成为活跃节点。

二、参数说明
--dbpath   数据文件路径
--logpath  日志文件路径
--port        端口号,默认是27017.我这里使用的也是这个端口号.
--replSet   复制集的名字,一个replica sets中的每个节点的这个参数都要用一个复制集名字,这里是test.
--replSet   这个后面跟的是其他standard节点的ip和端口
--maxConns   最大连接数
--fork       后台运行
--logappend   日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。

注:
1、不需要像mysql一样复制完整数据过去,丛库启动会制动复制主库完整数据。
2、丛库自动配置为只读。
3、mongodb第一次启动时间较长,需要注意等待。
4、管理命令多数都要在admin库中执行use admin

三、创建副本集 
环境说明:

ip:10.0.0.2   master
ip:10.0.0.3   slave
ip:10.0.0.4   slave
ip:10.0.0.5  arbiter

1、创建数据目录:mkdir server1  server2 server3 server4

2、开启mongodb:

首先:我们为副本集取个名字叫:fuben

为10.0.0.2开启:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server1 --logpath=/usr/local/mongodb/dblog1 --replSet fuben:10.0.0.3 --fork

(注::--fork为创建守护进程,--logpath与--fork必须并存)

为10.0.0.3开启:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server2 --logpath=/usr/local/mongodb/dblog2
--replSet fuben:10.0.0.
2 --fork

启动服务后,我们可以通过日志文件观察启动mongodb的信息,并且副本集有一个亮点就是自动检测功能:在其中指定的单台服务器后,mongodb就是自动搜索并连接其余的节点

3、初始化节点

我们连接到其中一个节点上,并使用replSetInitiate命令进行初始化。此命令需要一个配置对象,指定设定的每个成员的名字。

db.runCommand({"replSetInitiate":{

'_id':'fuben',

'members':[

{    
"_id" : 0,    
"host" : "10.0.0
.2"   
  },    
  {    
"_id" : 1,    
  "host" : "10.0.0.
3"   
  }  

]

}

})

或者:

>
>config = {_id:"test",members:[
... {_id:0,host:'10.0.0.2'},
... {_id:1,host:'10.0.0.3'},]
... }
>rs.initiate(config);
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}

在此期间,其中一个节点将当选为主节点。

这样我们就创建了副本集,我们在主数据库中写入数据,那么从就会同步了,但是从服务器不能查看里面的数据,我们可以通过设置将从服务器改为可读

通过日志我们可以查看,从服务器是每十秒钟去读取主服务器下面的local.oplog.rs进行同步

我们可以通过:rs.status()来查看副本集里面的详细信息 ,也可以通过rs.isMaster()来查看该服务器是否为master

4、后期添加从服务器

为10.0.0.4开启:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server3  --logpath=/usr/local/mongodb/dblog--replSet
fuben:10.0.0.
2 --fork

首先,我们开启了10.0.0.4服务器的mongodb

我们在主服务器上添加,rs.add("10.0.0.4:27017"),这样就该服务器添加到了副本集

5、添加仲裁节点

为10.0.0.5开启:/usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/server4  --logpath=/usr/local/mongodb/dblog--replSet
fuben:10.0.0.
2 --fork

首先,我们开启了10.0.0.5服务器的mongodb(Arbiter)

我们在主服务器上添加,rs.addArb("10.0.0.4:27017"),这样就该服务器添加到了副本集的仲裁节点

该节点不参与数据的复制,只是参与投票选择主节点而已

6、mongodb数据库的副本集的同步机制

数据复制的目的是使数据得到最大的可用性,避免单点故障引起的整站不能访问的情况的发生,Mongodb的副本集在同一时刻只有一台服务器是可以写的,副本集的主从复制也是一个异步同步的过程,是slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的),这个日志就是local数据库中的oplog.rs表,默认在64位机器上这个表是比较大的,占磁盘大小的5%,oplog.rs的大小可以在启动参数中设定:--oplogSize 1000,单位是M。在生产环境中建议此值设置的大一些,以防止无法同步的情况发生。

7、查看同步状态

我们使用:db.printSlaveReplicationInfo()来查看信息,这里显示了,同步了多少时间等信息

如:

source:   127.0.0.1:10000
         syncedTo: Tue Jul 16 2013 15:18:52 GMT+0800 (CST)
                 = 5337 secs ago (1.48hrs)
source:   127.0.0.1:10003
         syncedTo: Tue Jul 16 2013 16:05:22 GMT+0800 (CST)
                 = 2547 secs ago (0.71hrs)
source:   127.0.0.1:10002
         no replication info, yet.  State: ARBITER

source:从库的ip和端口

syncedTo:目前的同步情况,以及最后一次同步的时间

从上面可以看出,在数据库内容不变的情况下他是不同步的,数据库变动就会马上同步。

db.printReplicationInfo()查看oplog的大小和oplog中操作的时间范围

如:configured oplog size:   50MB
log length start to end: 9071secs (2.52hrs)
oplog first event time:  Tue Jul 16 2013 14:20:40 GMT+0800 (CST)
oplog last event time:   Tue Jul 16 2013 16:51:51 GMT+0800 (CST)
now:                     Tue Jul 16 2013 17:10:35 GMT+0800 (CST)

这里说明了,oplog配置为50M,日志记录的时间长度等信息

8、删除节点

  出于种种原因把,现在准备删除一个节点,空闲出一台服务器

这时使用命令rs.remove("IP+端口")即可移除该节点

如:rs.remove('10.0.0.3:27017')

输出结果:

Tue Jul 16 16:51:52.180 DBClientCursor::init call() failed
Tue Jul 16 16:51:52.210 JavaScript execution failed: Error: error doing query: failed at src/mongo/shell/query.js:L78
Tue Jul 16 16:51:52.229 trying reconnect to 127.0.0.1:10001
Tue Jul 16 16:51:52.231 reconnect 127.0.0.1:10001 ok

这样:我们用rs.status就可以查看到该节点已经没有了

9、同步文件

主节点的操作记录在oplog里 (operation logs) ,oplog存储在一个特殊的数据库中,叫:local,而oplog就在oplog.rs里面

我们可以通过:db.oplog.rs.find()查看操作日志记录

oplog中每个文档记录了主节点的一个操作:文档中的键:

ts:操作的时间戳,由4个字节的时间戳和4个字节的计数器组成

op:操作类型,只有一个字节的代码(如:u--update,i-insert n--null)

ns:执行操作的命名空间,就是集合名

o:指定了执行的文档,就是要插入的数据,更新的数据等等

10、从节点的同步问题

从节点第一次启动,会对主节点数据进行完整的同步,这样花费大量的时间,如果从节点的操作已经被主节点落下太远了,从节点就会跟不上,因为主节点数据太新了,这里可能是从节点出现故障或者宕机,或者是从节点分担了主节点作为读服务器,这样资源被消耗,疲于应付读取而无法同步,这样从节点的数据就更不上了

我们可以通过:{‘resync’:1}命令来手动执行重新同步,也可以在启动从节点的时候加入参数:--autoresync来重新同步。重新同步代价很高,应尽量避免,方法就是配置足够大的oplog

抱歉!评论已关闭.