MongoDB主从集群 + 副本集

主服务器:
mongod --master --dbpath xxx --port xxx

从服务器
mongod --dbpath xxx --port xxx --slave --source ip:port

 

 目前还没有能够从从节点复制的机制,因为从节点不保存oplog.

若干选项

--only   在从节点上指定只复制特定某个数据库(默认复制所有数据库)

--slavedelay 用在从节点上,在应用主节点的操作时增加延时(秒)。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--fastsync 以主节点的数据快照为基础启动从节点。如果数据目录一开始是主节点的数据快照,从节点用这个选项启动要比做完整同步快很多。

 

--autoresync如果从节点与主节点不同步了,则自动重新同步。

--oplogSize 主节点oplog的大小,单位是MB。

 

 

 

如果一个从节点启动时没有加入source,则可以在运行时执行

db.sources.insert({"host":"ip:port"})

然后db.sources.find()就可以看到效果。

~~~~~~~~~~

换句话说,对sources进行增加和删除,可以决定是否同步以及跟谁同步。

 

 

下面说一说副本集,比主从更强大的机制

参考文档 : http://www.myexception.cn/database/1615546.html

http://www.linuxidc.com/Linux/2013-05/84971.htm

PS: cat /etc/hostname 用来找主机名

创建副本集需要使用 --replSet选项。

比如启动两个节点

./mongod --dbpath xxx --port aaa  --replSet 副本集的名字/别的机器的name:别的机器的port,name:port

后面虽然有2个,写1个也是具有同样作用的

这个时候还么有完,连接其中一个服务器,执行命令

db.runCommand(
{"replSetInitiate":
     {
      "_id":"副本集名字",
      "members":
             [
               { "_id":1,"host":"name:port"},
               { "_id":1,"host":"name:port"}
             ]
     }
}

 任何时候,集群只有一个活跃节点,其它都为备份节点。

节点有以下几种类型

.standard

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

.passive

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

 .arbiter

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~··

标准节点和被动节点之间的区别仅仅就是数量的区别,每个参与节点(非仲裁者)有个优先权

优先权为0则是被动的,不能成为活跃节点,优先值不为0,则按照

由大到小选出活跃节点,优先值一样的话则看谁的数据比较新,所以,要是有两个

优先值为1和0.5的节点,最后一个节点只有在前2个都不可用时才能成为活跃节点。

~~~~~~~~~~~~

可以在节点配置中修改priority键,来配置成标准节点或者被动节点。

members.push(

{

 "_id":3, "host":"name:port","priority":40}

}

)默认优先级为1,可以使【0,1000】

"arbiterOnly"指定仲裁节点

 

members.push(

{

 "_id":3, "host":"name:port","priority":40,

"arbiterOnly":true

}

 备份节点会从活跃节点抽取oplog,并执行操作,活跃节点也会写操作到自己的本地oplog.

oplog中的操作包括严格递增的序号来判定数据的时效性。

~~~~~~~~~~~~~

活跃节点使用心跳来跟中集群中有多少节点对其可见,如果不够半数,则自动降为备份节点,这样就可以防止活跃节点一直不放权。

 

不论活跃节点何时变化,新活跃节点的数据被假定为系统的最新数据,对其它节点的操作都会回滚,

即便是之前的活跃节点已经恢复了,为了完成回滚,所有节点连接新的活跃节点后要重新同步,

这些节点会查看自己的oplog,找出其中活跃节点没有执行的操作,然后向活跃节点请求这些操作影响的文档的副本。

正在执行重新同步的节点被视为恢复中,这个过程完成之前不能成为活跃节点候选者。

 

 ~~~~~~~~~~~~再来聊聊主从机制

可以将查询放在从节点上,这样,主节点的负载就减轻了,一般来说,当负载是读取密集型时这非常不错

但如果是写入密集型,则需要分片。

 

这里需要注意的是:需要告诉从服务器可以处理请求,默认不可以,就是slaveOkay.

对于从节点,启动时,只要你愿意,仍然可以添加--master参数。

 

 

关于oplog

主节点的操作称为oplog,存储在一个特殊的数据库中,local.

oplog就在其中的oplog.$main集合里。

里面的每个文档代表主节点上执行的一个操作。

文档格式:

.ts------操作的时间戳,由4字节的时间戳和4字节的递增计数器构成。

.op------操作类型,1字节代码。

.ns------执行操作的命名空间(集合名)

.o------要执行的操作的文档,对插入来说就是插入的文档。

存储在oplog中的操作也不是和主节点的操作完全一样,比如$inc操作会转换成$set.

 

oplog如果超过指定的大小会覆盖。

从节点第一次同步是全量同步,拉取所有文档,然后再根据oplog来拉取部分文档。

查看主节点的所有从节点,可以db.slaves.find()

对于从节点就是:db.sources.find()

~~~~~~~~~~~

在主节点上查看

db.printReplicationInfo()

在从节点上,则

db.printSlaveReplicationInfo()

 

 

 

 

 

 

 

 

你可能感兴趣的:(mongodb)