MongoDB有主从复制和副本集两种主从复制模式,主从复制最大的问题就是没法自动故障转移,MongoDB副本集解决了主从模式没法自动故障转义的特色,所以是复制的首选。
对于简单的主从复制没法自动故障转移的缺陷,各个数据库都在改进,MySQL推出的MGR,Redis的哨兵,Mongodb的复制集。html
对于主从复制模式:
mongodb的主从配置异常简单,
若是是非安全认证模式,只须要在主节点增长master = true,
从节点增长slave = true和source = ip:port两个节点,分别启动便可,无论主节点是否存在数据以及存在多少数据,从节点以slave的方式启动,就会自动同步主节点的数据。
相比MySQL的主从模式(各类缘由致使的主从事务不一致),简单的不是一点半点。mongodb
port=12345 #端口 dbpath= /usr/local/mongodb/db #数据库存文件存放目录 logpath= /usr/local/mongodb/db/mongodb.log #日志文件存放路径 logappend=true #使用追加的方式写日志 fork=true #守护程序的方式启用,false即不在后台运行 maxConns=100 #最大同时链接数 journal=true #每次写入会记录一条操做日志(经过journal能够从新构造出写入的数据)。 storageEngine=wiredTiger #存储引擎有mmapv一、wiretiger、mongorocks bind_ip = 10.104.174.247 #这样就可外部访问了,例如从win10中去连虚拟机中的MongoDB #复制只须要增长master = true master = true #若是开启了安全认证,须要增长以下两个节点。 auth=true #启用验证 keyFile= /usr/local/mongodb/db/keyfile #添加keyfile oplogSize=2048 #oplog大小
安全认证模式:数据库
关于安全认证模式,纠结了很久,mongodb是这样的:
1,对于单实例的mongodb,(建立用户以后)开启安全认证须要增长auth = true配置便可,
2,主从或者副本集模式下,(建立用户以后)若是要开启安全认证,必需要加上keyFile(设置能够file以后auth参数才有效),两者必须同时配置,不然(主从or副本集)就不成功。安全
须要注意的是,若是在主节点建立了用户,主从节点以开启安全认证方式启动,主节点的用户信息一样能够同步到从节点,所以从节点并不须要再从新建立用户信息。app
副本的初始化:编码
mongodb的副本在启动的时候会自动从主节点的oplog中读取数据,从而完成初始化,这一点很是省心。
固然,可能存在主节点数据超过oplog大小或者说主节点oplog发生了重用(覆盖),那么就没法经过oplog自动作到主从的同步,此时能够能够:
1,以autoresync = true的方式重启副本。
2,删除从节点的数据文件而后从新启动从节点。
3,删除从节点的数据文件,直接copy主节点的数据文件到从节点(我的认为这种方式更加简单高效),启动从节点便可。
三种方式均可以达到完整同步主节点数据的目的。spa
以下是mongodb slave节点同步数据的模式,来自于:https://www.cnblogs.com/daizhj/archive/2011/06/20/2050916.html日志
副本集搭建code
因为MongoDB副本会自动从主节点(或者相邻的最近节点)同步数据,不会出现事务冲突之类错误,所以副本集的配置也很简单,这一点要比MySQL的各类配置简单太多。htm
主节点生成keyfile:
openssl rand -base64 100 > /usr/local/mongodb/db/keyfile --文件内容采base64编码,一共100个字符
修改文件权限:
chmod 600 /usr/local/mongodb/db/keyfile
复制改keyfile至各个节点,而后启动各个节点。
搭建副本集须要移除掉主从复制的一些配置项(主节点的master = true,从节点的slave,source等配置项),以下是一个最简单的配置项。
port=8000 #端口 dbpath= /usr/local/mongodb/db #数据库存文件存放目录 logpath= /usr/local/mongodb/db/mongodb.log #日志文件存放路径 logappend=true #使用追加的方式写日志 fork=true #守护程序的方式启用,false即不在后台运行 maxConns=100 #最大同时链接数 auth=true #启用验证 journal=true #每次写入会记录一条操做日志(经过journal能够从新构造出写入的数据)。 #即便宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,而后重放后续的journal日志来恢复。 storageEngine=wiredTiger #存储引擎有mmapv一、wiretiger、mongorocks bind_ip = 10.104.174.247 keyFile= /usr/local/mongodb/db/keyfile #添加keyfile #master = true oplogSize=2048 #oplog replSet = rstest #副本集名称
"health" : 1, //1 代表正常; 0 代表异常
"state" : 1, // 1 代表是Primary; 2 代表是Secondary;
"stateStr" : "PRIMARY", //代表此机器是主库
副本集也能够经过定义主机集合的方式
config_rs1={_id:'rs1',members:[
{_id:1,host:'10.104.174.247:8000',priority:1},
{_id:2,host:'10.104.174.247:9000'},
{_id:3,host:'10.104.174.247:1000'}]}
rs.initiate(config_rs1) //初始化配置
参考:
http://www.javashuo.com/article/p-duzmtenb-ev.html
https://www.cnblogs.com/oubo/archive/2012/03/01/2394669.html
https://www.cnblogs.com/daizhj/archive/2011/06/20/2050916.html