学习MongoDB--(9-2):复制(主从复制--进阶)

来源:互联网 发布:华为敏捷网络 编辑:程序博客网 时间:2024/06/07 04:55

受益于MongoDB的简化操作的思想,主从复制的结构搭建比较容易。在搭建过程中有有一些选项可以使用,我们先来了解一下。

【选项】

1》 --only :这个选项在2.0.7版本的MongoDB中无法在启动从服务器时使用。如果要使用该参数,在启动从服务器时不能通过--source选项指定主服务器,启动从服务器后,手动向local.sources集合中插入主服务器信息,并且此时通过键"only"指定需要数据同步的数据库名称即可!代码步骤如下:

        1)启动从服务器,不指定主服务器信息:

E:\mongodb2.0\bin>mongod --dbpath E:\mdbserver2 --port 10001 --logpath E:\mdblog2\log.log --slaveall output going to: E:\mdblog2\log.log

        2)往从服务器的集合local.sources中手动插入主服务器信息,并且指定同步的数据库:

> db.sources.insert({"host":"localhost:10000", "only":"testdb"});

进行第二步时,需要注意在local.sources集合中,同一键"host"的文档不能产生覆盖影响!在2.0.7版本Win平台的MongoDB上测试,只有这样操作才可以指定同步某一个数据库。如果主服务器上数据库特别多,这种方式还是有一定的用处,因为直接指定主服务器启动的从服务器,默认是同步所有的数据库!

2》 --slavedelay :这个选项用在启动从服务器上,指定从服务器从主服务器上同步操作的延时时间,这对于一些无意的删除重要数据或插入垃圾数据有一定的防护作用,通过延时,可暂缓这些不良操作在从服务器上被执行!

E:\mongodb2.0\bin>mongod --dbpath E:\mdbserver2 --port 10001 --logpath E:\mdblog2\log.log --slave --slavedelay 30all output going to: E:\mdblog2\log.log

通过上述命令启动的从服务器,对主服务器的oplog会延时30秒执行!但这里需要注意的是,仅仅是延时处理,在主服务器上的各种改变数据的操作最后都会在从服务器上被执行!

3》 --fastsync :这个选项用在启动从服务器上。表明以主服务器节点的数据快照为基础启动从服务器节点。因为从服务节点启动后,要先完整同步主服务节点上的数据,然后再获取主服务节点的oplog来保持后续的同步。使用这个启动参数,从服务器节点的启动要比完整同步快很多!

4》 --autoresync :这个选项用在启动从服务器节点上。如果从节点与主节点不同步了,则自动重新同步。这个下面会详细讲解一下。

5》 --oplogSize :启动主服务器时显示指定放置oplog的集合所占据的空间大小。MongoDB有一个默认的规则(磁盘分区剩余空间的5%,上篇有提及),这个选项可以优于这个规则来显示指定。

autoresync选项详细解释】

上面提到,使用这个选项启动从服务器,当从服务器停止同步时,会自动启动重新完整同步操作。那从服务器什么情况会停止同步呢?从节点启动时,都会首先进行完整同步,然后再读取主节点的oplog保持数据同步。如果此时主节点数据太多,且写操作频繁,会导致从节点跟不上主节点的操作,有可能当完整同步完成,oplog已经绕了一圈了(固定集合)。这时从节点会停止同步,此时我们可以手动在从节点上执行命令db.runCommand({"resync" : 1})来强制从节点再进行一遍完整同步,使用--autoresync选项启动的从节点这时会自动重新进行一遍完整同步!完整同步代价比较高,应尽量避免,较好的方式就是设置足够大的oplog!

【添加及删除源】

上一篇,我们启动从节点时,直接通过--source选项指定主节点,我们也可以在shell中通过插入一条文档来指明主节点信息,通过删除文档,删除特定的主节点信息。在从节点中,放置主节点(这里可以称为同步数据源)信息的集合为local.sources,插入的文档键"host"指明主节点的ip和端口号,通过“only”键指明同步的数据库(上面提及过)!

通过这种方式可以很灵活的指定或移除从节点的主节点信息,甚至可以为一个从节点指明多个主节点,但这里要注意,多个主节点的集合如果相同,MongoDB会尝试合并,但不会保证合并的正确性!所以尽量在多个主节点上使用不同的命名空间!

【主从结构的作用--读扩展】

用MongoDB扩展读取的一种方式就是将查询放在从节点上,这样主节点的负载就会减轻。当负载是读取密集型时,这是一个不错的方案!扩展读取本身非常简单,像往常一样设置主从结构。唯一的技巧就是查询时显示指明查询选项slaveOkey,告诉从服务器是否可以处理请求(默认不可以)!所有的MongoDB驱动都会有一个机制来设置这个查询选项!

使用主从结构进行读扩展,我们必须清楚主从的数据同步有一定的时间间隙,如果不能承受这个间隙,就无法采用这个方案来减轻主节点数据查询的压力!

【主从结构的作用--用从节点做数据处理源】

从节点的另一个作用就是作为密集型数据处理的数据源,从而避免这种操作影响主节点的性能!此时我们启动从节点,需要同时使用--slave 和 --master选项(如果单纯使用--slave启动的从节点无法执行写操作),这样启动的从节点会从主节点同步数据,并且本身也可以同时进行读写操作!

使用这种技术时,我们必须保证不能对正在复制主节点数据的从节点上的数据库执行写入操作(从节点可以在不用进行同步的数据库上执行写操作)!从节点无法恢复这些操作,就不能正确映射主节点的数据了。

使用这种技术时,从节点第一次启动不能携带需要被复制的同名数据库(主节点上的),要是有的话,这个数据库就不能进行初始的完整同步操作了,只能进行后续的oplog操作!这样容易造成主从数据不一致!


实际应用MongoDB中,一个主节点在配置不超过12个从节点的情况下,都可以运行良好!


 

原创粉丝点击