MongoDB主从复制和副本集

 


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 #副本集名称
 
主节点副本集初始化
rs.initiate()
(数秒以后)同时发现rstest:SECONDARY>变为rstest:PRIMARY>
加入新节点
rs.add("10.104.174.247:9000")
rs.add("10.104.174.247:10000")
rs.status() 查看副本集主从节点的状态

"health" : 1, //1 代表正常; 0 代表异常
"state" : 1, // 1 代表是Primary; 2 代表是Secondary;
"stateStr" : "PRIMARY", //代表此机器是主库

rs.isMaster()查看主节点信息
 

副本集也能够经过定义主机集合的方式
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

相关文章
相关标签/搜索