主服务器: 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()