一、mongodb为什么要做主从


1、数据的备份,有利于故障的恢复


2、读写分离,主节点负责写操作,从节点负责读操作,这样就把读写压力分开,保证系统的稳定性.


二、mongodb主从复制的原理


主节点会记录写有关的操作,读操作不记录。这些操作记录在local数据库中的oplog.$admin这个集合,这个是一个固定大小的集合,可以修改oplogSize大小,单位MB,一般为磁盘剩余空间的5%。当这个集合空间占满之后,新进来的日志会覆盖最旧的日志。这个值的设定必须注意,否则会出现主从未同步日志就已经被覆盖的风险,导致主从数据不一致。 local数据库会有oplog.$admin和slave两个集合。slave记录从节点信息。


从节点会定时去连接主节点,获取主节点的操作日志从而执行主节点一样的操作,从而达到数据同步。从节点的local数据库会有 source、me两个集合。source记录主节点信息,me记录从节点标识。


三、windows环境下一主多从配置


1)配置db数据、日志目录


主数据库配置(E:\mongodb\mongodb\mongo_master.config)


dbpath=E:\mongodb\data\db


logpath=E:\mongodb\data\log\mongodb.log


master=true


port=27017


oplogSize=2048


从数据库配置(E:\mongodb\mongodb\mongo_slave1.config)


dbpath=E:\mongodb\data\db_slave1


logpath=E:\mongodb\data\log_slave1\mongodb.log


2)启动主、从服务器


启动主服务器(默认端口27017):


mongod --config E:\mongodb\mongodb\mongo.config


启动从服务器:


mongod --config E:\mongodb\mongodb\mongo_slave1.config --slave --port 27018 -source 127.0.0.1:27017


3)存在问题:


1)如果主服务器已经有数据了再加入从服务器这样会出现从服务器无法从主服务器同步数据。


解决办法:将mongdb目录复制一份,在这个新的目录下配置db数据、日志目录,启动从服务器则会把主数据库的数据复制到从数据库。


D:\mongodb\mongodb\mongo_slave2.config文件配置如下:


dbpath=D:\mongodb\data\db_slave2


logpath=D:\mongodb\data\log_slave2\mongodb.log


slave=true


port=27019


source=127.0.0.1:27017


autoresync=true


启动命令如下( 将所有的配置信息写到配置文件中,不必在启动时设置一堆配置信息 ):


mongod --config D:\mongodb\mongodb\mongo_slave2.config


2)如果使用同一个目录下的实例,则无法将从服务器设置为windows服务随系统启动而启动服务。


解决办法:目前未发现windows下可以同时设置多个mongodb系统服务。


3)当在客户端连接从数据库时候会报错error: { "$err" : "not master and slaveok=false", "code" : 13435 }


解决办法:命令行输入rs.slaveOk();


四、mongodb主从架构存在的问题


1)主节点挂掉了,那这个架构就失效了。


2)主节点写压力是否会过大。


3)多个从节点从主节点复制数据是否造成主节点压力过大。




五、总结


主从复制存在单点故障问题,如果主节点挂了整个服务都无法正常运行,因此官方已经不推荐这种使用方式,官方推荐一种更合理的高可用方案复制集。



参考:mongodb可复制集实现说明



附件:主从复制配置参数说明


–master 表示主服务器 


–slave 表示从服务器 


–dbpath 表示数据文件路径 


–logpath 表示日志文件,必须为具体的文件 


–source 指定主服务器的ip和端口,格式为ip:port 


还有其他参数可以在master-slave中设置: 


–only 从节点->指定复制某个数据库,默认是复制全部数据库; 


–slavedelay 从节点->设置主数据库同步数据的延迟时间,单位为秒; 


–fastsync 从节点->以主数据库的节点快照为节点,启动从数据库; 


–oplogSize 主节点->设置oplog的大小(主节点操作记录,存储在local数据库的oplog中),默认为当前可用磁盘空间的5%


–autoresync 从节点->当slave上的数据过时,自动进行同步