replicattion set 多台服务器维护相同的数据副本,提升服务器的可用性,总结下来有如下好处:mongodb
数据备份与恢复数据库
读写分离bash
正如上图所示,MongoDB 复制集的架构中,主要分为两部分:主节点(Primary)和从节点(Secondary)。服务器
主节点:在一个复制集中只有而且必须有一个主节点,主节点也是众多实例中惟一能够接收客户端写操做的节点,固然也能够进行读操做;架构
从节点:从节点会复制主节点的操做,以获取彻底一致的数据集。客户端不可以直接对从节点进行写操做,可是能够进行读操做,这个须要经过复制集选项进行设置。app
投票节点:投票节点 并不含有 复制集中的数据集副本,且也 没法 升职为主节点。投票节点的存在是为了使复制集中的节点数量为奇数,这样保证在进行投票的时候不会出现票数相同的状况。若是添加了一个节点后,总节点数为偶数,那么就须要相应的增长一个投票节点。ui
注:MongoDB 3.0 把复制集中的成员数量从原来的12个提高到了50个,可是投票节点的数量仍然保持不变,仍是7个。spa
一个主节点,两个从节点,自动化故障切换的特性
最基本的复制集架构是有3个节点的形式。这样在主节点不可用之后,从节点会进行投票选出一个节点成为主节点,继续工做。以下图所示:日志
三个节点的复制集架构,还有另一种形式:一个主节点,一个从节点,一个投票节点。以下图所示:
一个主节点,一个从节点,一个投票节点
在这种架构中,当主节点不可用时,只有从节点能够升为主节点,而投票节点是不能够成为主节点的。投票节点仅仅在选举中进行投票。以下图所示:code
其余概念
从节点还有集中特殊的设置状况,不一样的设置有不一样的需求:
优先级为0:设置 priority:0 ,那么该结点将不能成为主节点,可是其数据还是与主节点保持一致的,并且应用程序也能够进行读操做。这样能够在某些特殊的状况下,保证其余特定节点优先成为主节点。
隐藏节点:隐藏节点与主节点的数据集一致,可是对于应用程序来讲是不可见的。隐藏节点能够很好的与 复制集 中的其余节点隔离,并应对特殊的需求,好比进行报表或者数据备份。隐藏节点也应该是一个不能升职为主节点的优先级为0的节点。
延时节点:延时节点也将从 复制集 中主节点复制数据,然而延时节点中的数据集将会比复制集中主节点的数据延后。举个例子,如今是09:52,若是延时节点延后了1小时,那么延时节点的数据集中将不会有08:52以后的操做。
因为延时节点的数据集是延时的,所以它能够帮助咱们在人为误操做或是其余意外状况下恢复数据。举个例子,当应用升级失败,或是误操做删除了表和数据库时,咱们能够经过延时节点进行数据恢复。
oplog:全拼 oprations log,它保存有数据库的全部的操做的记录。在复制集中,主节点产生 oplog,而后从节点复制主节点的 oplog 进行相应的操做,这样达到保持数据集一致的要求。所以从节点的数据与主节点的数据相比是有延迟的。
# 建立数据存储目录 mkdir -p /data/r0 /data/r1 /data/r2 # 建立日志文件 touch /var/log/mongo17.log /var/log/mongo18.log /var/log/mongo19.log #启动3个实例,且声明实例属于某复制集 rsa ./bin/mongod --port 27017 --dbpath /data/r0 --smallfiles --replSet rsa --fork --logpath /var/log/mongo17.log ./bin/mongod --port 27018 --dbpath /data/r1 --smallfiles --replSet rsa --fork --logpath /var/log/mongo18.log ./bin/mongod --port 27019 --dbpath /data/r2 --smallfiles --replSet rsa --fork --logpath /var/log/mongo19.log # 进入27017进行配置初始化 ./bin/mongo --port 27017 rsconf = { _id:'rsa', members: [ {_id:0, host:'192.168.42.168:27017' } ] } rs.initiate(rsconf); # 若是之后须要再重载一下config的话,用rs.reconfig(rsconf); # 添加节点 rs.add('192.168.42.168:27018'); rs.add('192.168.42.168:27019'); # 查看状态 rs.status(); # 删除节点 rs.remove('192.168.1.201:27019'); # 主节点插入数据 >use test >db.user.insert({uid:1,name:'lily'}); #链接secondary查询同步状况 ./bin/mongo --port 27019 >show dbs rsa:SECONDARY> show dbs; 2015-08-27T11:39:00.638+0800 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } # 还能够经过isMaster()命令来查看信息; rsa:PRIMARY> db.isMaster(); { "setName" : "rsa", "setVersion" : 5, "ismaster" : true, "secondary" : false, "hosts" : [ "192.168.42.168:27018", "192.168.42.168:27019", "192.168.42.168:27017" ], "primary" : "192.168.42.168:27018", "me" : "192.168.42.168:27018", "electionId" : ObjectId("55dea0cffa0c638625a82486"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-08-27T05:49:13.740Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1 } # 出现上述错误,是由于slave默认不准读写 >rs.slaveOk(); >show dbs; # 执行上面一个语句就能够看到和primary一致的数据,而且能够把读和写分离开来;
以上即是一个最简单的复制集架构,其中若是27017的主节点崩溃,那27018的节点就由从节点变为主节点;注意,若是再添加原来的27017节点进来,那主节点仍是27018;
#!/bin/bash IP='192.168.1.202' NA='rsb' if [ "$1" = "reset" ] then pkill -9 mongo rm -rf /home/m* exit fi if [ "$1" = "install" ] then mkdir -p /home/m0 /home/m1 /home/m2 /home/mlog /usr/local/mongodb/bin/mongod --dbpath /home/m0 --logpath /home/mlog/m17.log --logappend --port 27017 --fork --replSet ${NA} /usr/local/mongodb/bin/mongod --dbpath /home/m1 --logpath /home/mlog/m18.log --logappend --port 27018 --fork --replSet ${NA} /usr/local/mongodb/bin/mongod --dbpath /home/m2 --logpath /home/mlog/m19.log --logappend --port 27019 --fork --replSet ${NA} exit fi if [ "$1" = "repl" ] then /usr/local/mongodb/bin/mongo <<EOF use admin rsconf = { _id:'${NA}', members:[ {_id:0,host:'${IP}:27017'}, {_id:1,host:'${IP}:27018'}, {_id:2,host:'${IP}:27019'}, ] } rs.initiate(rsconf) EOF fi