MongoDB---复制简析(三)
个情况,也会在执行完完整同步以后
反生类似的事,因为只要同步的时间太长,同步完成时,oplog可能已经操作了很多.
从节点跟不上同步时,复制就会停下来,从节点需要重新做完整的同步.可以用{"resync":1}命令手动执行从新同步, www.2cto.com
也可以在启动从节点时使用--autoresync选项让其自动重新同步,重新同步的代价很高,应尽量避免,方法是配置
足够大的oplog,配置足够大的oplog能存放相当长的时间操作记录.大的oplog会占用更多的磁盘空间,则需要权衡一下.
默认的oplog大小是剩余磁盘空间的5%.
13.复制状态和本地数据库
本地数据库 用来存储所有内部复制状态,子节点和从节点都有.本地数据库 的名字是local,其内容不会被复制.这样能
确保一个MongoDB服务器只有一个local数据库.local数据库不限于存放MongoDB的内部状态,如果有不想被复制的文档
也可以将其存在local数据库.
主节点上的复制状态还包括从节点的列表(从节点连接主节点时会自行handshake命令进行握手),这个列表存放在
slaves集合中.
从节点也在local数据库中存放状态.在me集合中存放从节点的唯一标识符,在sources集合中存放源或节点的列表.
主节点和从节点都跟中从节点的更新情况,这是通过存放在"syncedTo"中的时间戳来完成的.每次从节点查询主节点
的oplog时,都会用"syncedTo"来确定那些操作需要执行,或者查看是否已经跟不上同步了.
14.阻塞复制
开发者可以用gerLastError的"w"参数来确保数据的同步性.这里运行gerLastError会进入阻塞状态,知道n个
服务器复制了嘴型的写入操作为止
db.runCommand({"gerLastError":1,w:N})
如果没有N,或者小于2命令就会立刻返回,如果N等于2,主节点要等到至少一个从节点复制了上个操作才会响应命令
主节点本身也包括在N里面.主节点使用local.slaves中存放的"syncedTo"信息跟踪从节点的更新情况.
指定"w"选项后,还可以使用"wtimeout"选项,表示以毫秒为单位的超时,gerLastError就能在上一个操作复制到N个 www.2cto.com
节点超时返回错误(默认情况下没有超时)
阻塞复制会导致写操作变慢,尤其"w"的值比较大时.实际上,对重要操作将其值设为2或3就能效率和安全兼备了.
15.管理
MongoDB提供了工具来查看复制的状态,当连接到主节点后,使用
> db.printReplicationInfo()
configured oplog size: 944.1375732421875MB//oplog的大小大致为944M
log length start to end: 3395secs (0.94hrs)//最大大约能放置3395秒的操作.
oplog first event time: Thu Jul 19 2012 21:41:58 GMT+0800
oplog last event time: Thu Jul 19 2012 22:38:33 GMT+0800
now: Thu Jul 19 2012 22:38:38 GMT+0800
oplog的长度至少要能满足一次完整的从新同步.
当连接到从节点时,可以用printSlaveReplicationInfo得到从节点的一些信息
> db.printSlaveReplicationInfo()
source: 127.0.0.1:10000
syncedTo: Thu Jul 19 2012 22:42:13 GMT+0800
= 7 secs ago (0hrs)//数据的滞后时间为7秒
如发现oplog的大小不合适,最简单的做法就是停掉主节点,删除local数据库中的文件,用新的设置(--oplogsize)
重新启动.为大型的oplog预分配空间很耗时,且可能导致主节点停机时间增加,所以尽可能手动预分配数据文件.
重启主节点后,所有从节点得用--autoresync重启,否则需要手动从新同步.
16.复制的认证问题
如果在复制中使用了认证,还要做一些配置,似的从节点能访问主节点的数据.在主节点和从节点上都需要在
local数据库添加用户,每个节点的用户名和口令都是相同的.local数据库的用户类似admin数据库中的用户,
能够读写整个服务器.
从节点连接主节点时,会用存储在local.system.users中的用户进行认证.最此尝试"refactor"用户,如没有此用户,则用 www.2cto.com
local.system.users中的第一个可用用户.所以,按照如下步骤配置主节点和从节点,用户靠的密码替换password,
就能配置认证复制了:
use local
addUser("refactor","password")
从节点之后就可以复制主节点了.
作者 refactor