mongodb的复制至少须要两个实例。其中一个是主节点master,负责处理客户端请求,其他的都是slave,负责从master上复制数据。html
master写处理:
master负责接收写请求,具体的流程为: sql
注:oplog是幂等的,当有累加操做inc时,会记录成set操做,从而不管重复执行多少次操做得到的结果都是同样的。 mongodb
从节点同步:数据库
注意:当slave同步的速度赶不上master更新的速度时,oplog会由于追加了过多的操做而发生将旧记录覆盖掉,这样slave可能没法保证同步全部的数据,这时,slave会开始从头从新同步。 bash
主从复制是MongoDB最经常使用的复制方式,这种方式很灵活,可用于备份、故障恢复和读扩展等。须要在启动进程时指定master和slave,slave要指定master的地址,这种方式没有自动故障转移功能。 服务器
默认状况下,slave既不能写也不能读,但能够经过配置将slave改成可读模式,从而作到读写分离,提升系统性能。 app
操做能够选择两种方式:命令行和配置文件。 性能
master启动命令命令行
# mongod --config /etc/mongodb.conf --master
slave启动命令rest
# mongod --config /etc/mongodb.conf --slave --autoresync --slavedelay=10 --source master-ip:master-port
master配置:
master = true
slave配置:
slave = true
autoresync = true
slavedelay = 10
-only
在从节点上指定只复制特定的某个数据库(默认是复制全部数据库)。
-slavedelay
用在从节点上,当应用主节点的操做时,从节点增长延时复制(单位秒)。这样就能轻松设置延时从节点,这种节点对用户无心中删除重要文档或者插入垃圾数据等有防御做用,这些不良操做都会被复制到全部的从节点上,经过延时执行操做,能够有个恢复的时间差。
-fastsync
以主节点的数据快照为基础启动从节点。若是数据目录一开始是主节点的数据快照,从节点用这个选项启动要比作完整的同步快的多。
-autoresync
若是从节点与主节点不一样步了,则自动从新同步。
-oplogsize
主节点oplog的大小(单位MB)。默认的oplog大小是剩余磁盘空间的5%。
副本集(Replica Set)就是有自动故障恢复功能的主从集群。主从集群和副本集最明显的区别是副本集没有固定的”主节点”,整个集群会选举出一个”主节点”,当其不能工做时则变动到其余节点.副本集总会有一个活跃节点(primary)和一个或多个备份节点(secondary)。
副本集能够在活跃节点有问题时自动切换。
任什么时候间,集群中只有一个活跃节点,其余的都是备份节点.活跃节点其实是活跃服务器,指定的活跃节点能够随时间而改变。
有几种不一样类型的节点能够存在与副本集中:
standard 标准节点
这是常规节点,它存储一份完整的数据副本,参与选举投票有可能成为活跃节点。
passive 被动结点
存储了完整的数据副本,参与投票,不能成为活跃节点。
arbiter 仲裁者
仲裁者只能参与投票,不接收复制的数据,也不能成为活跃节点。
每一个参与节点(非仲裁)有优先权,优先权按照优先值从大到小,默认优先级为1,能够是0-1000(含)。
在节点配置中修改priority键,来配置标准节点或者被动节点。
> members.push({"_id":3,"host":"127.0.0.1:10002","priority":40})
“arbiterOnly”键能够指定仲裁节点
> members.push({"_id":4,"host":"127.0.0.1:10003","arbiterOnly":true})
备份节点会从活跃节点抽取oplog,并执行操做,就像活跃备份系统中的备份服务器同样.活跃节点也会写操做到本身的本地oplog.oplog中的操做包含严格递增的序号,这个序号来断定数据的时效性。
若是活跃节点出现故障,其他节点会选一个新的活跃节点.选举过程能够由任何非活跃节点发起,新的活跃节点由副本集中的大多数选举产生。其中仲裁节点也参与选举,避免出现僵局。新的活跃节点将是优先级最高的节点,优先级相同则数据较新的节点获胜。
不论活跃节点什么时候变化,新的活跃节点的数据就被假定为系统的最新数据。对其余几点(原来的活跃节点)的操做都会回滚,即使是以前的活跃节点已经恢复工做了。为了完成回滚,全部节点链接新的活跃节点后从新同步。这些节点会查看本身的oplog,找出活跃节点没有的操做,而后向活跃节点请求这些操做影响的文档最新副本。正在执行从新同步的节点被视为恢复中,在完成这个过程以前不能成为活跃节点的候选者。
设置副本集比设置主从集群稍微复杂一点。
先给副本集起个名称,是为了易于与别的副本集区分,也是为了方便将整个集合视为一个总体,这里取名:refactor
启动服务器–replSet的做用是让服务器知道这个“refactor”副本集还有别的同伴,位置在 refactor/127.0.0.1:10001
# mongod --dbpath /data1/mongodb --port 10000 --replSet refactor/127.0.0.1:10001 --logpath /data1/log/mongodb/mongodb.log --rest
以一样的方式启动另外一台:
# mongod --dbpath /data1/mongodb --port 10001 --replSet refactor/127.0.0.1:10000 --logpath /data1/log/mongodb/mongodb.log --rest
若是想要添加第三台,两种方式:
# mongod --dbpath /data1/mongodb --port 10002 --replSet refactor/127.0.0.1:10000 --logpath /data1/log/mongodb/mongodb.log --rest
注:副本集有自动检测功能:在其中指定单台服务器后,MongoDB就会自动搜索并链接其他的节点。
> use admin > db.runCommand( { "replSetInitiate": { "_id":"refactor",//副本集的名称 "members"://副本集中的服务器列表 [ { "_id":1,//每一个服务器的惟一id "host":"127.0.0.1:10000"//指定服务器的主机 }, { "_id":2, "host":"127.0.0.1:10001" } ] } } ) >
在Mongodb中咱们使用mongodump命令来备份MongoDB数据。该命令能够导出全部数据到指定目录中。
mongodump命令能够经过参数指定导出的数据量级转存的服务器。
语法
mongodump命令脚本语法以下:
# mongodump -h dbhost -d dbname -o dbdirectory
mongodb使用 mongorerstore 命令来恢复备份的数据。
语法
mongorestore命令脚本语法以下:
# mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
系统日志在Mongdb数据中很中重要,它记录mongodb启动和中止的操做,以及服务器在运行过程当中发生的任何异常信息。
配置路径:
# mongod --logpath='/data/db/log/server.log' -logappend
Jouranl日志经过预写入的redo日志为mongodb增长了额外的可靠性保障。开启该功能时候,数据的更新就先写入Journal日志,按期集中提交(目前是每100ms提交一次) ,而后在正式数据执行更改。
打开方式:
# mongod --journal
Mongodb的高可用复制策略有一个叫作Replica Sets.ReplicaSet复制过程当中有一个服务器充当主服务器,而一个或多个充当从服务器,主服务将更新写入一个本地的collection中,这个collection记录着发生在主服务器的更新操做,并将这些操做分发到从服务器上。这个日志是Capped Collection。
注:Capped Collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少 使用)规则和插入顺序进行 age-out(老化移出)处理,自动维护集合中对象的插入顺序,在建立时要预先指定大小。
# mongod --oplogSize=1024 #单位是M
慢查询记录了执行时间超过了所设定时间阀值的操做语句。慢查询日志对于发现性能有问题的语句颇有帮助,建议开启此功能并常常分析该日志的内容。
要配置这个功能只须要在mongod启动时候设置profile参数便可。例如想要将超过5s的操做都记录,可使用以下语句:
# mongod --profile=1 --slowms=5