mongodb的读写分离使用Replica Sets来实现
对于replica set 中的secondary 节点默认是不可读的。在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。
如果通过shell访问mongo,要在secondary进行查询。会出现如下错误:
imageSet:SECONDARY> db.fs.files.find()error: { "$err" : "not master and slaveOk=false", "code" : 13435 }有两种方法实现从机的查询:第一种方法:db.getMongo().setSlaveOk();第二种方法:rs.slaveOk();上面两行命令即允许此连接从副本读取.
但是这种方式有一个缺点就是,下次再通过mongo进入实例的时候,查询仍然会报错,为此可以通过下列方式vi ~/.mongorc.js增加一行rs.slaveOk();以后每次通过mongo命令进入都可以查询了。
对于切换日志的操作,
>use admin
> db.runCommand({logRotate:1})
副本集rs模式,原理应该是一样的:mongodb比较要注意的是写操作,因为在写的时候会上锁,写的时候,应该只会写primary,但会造成同比,同步的时候,slave其实也是在做写操作,这个时候,其实slave也是上锁的,所以因为写操作造成的上锁,其实是会对你的响应造成影响的,导致查询过慢。
rs模式,pri节点写,数据存入oplog中,sec节点读;同步的话,sec从它相对近的原则,从oplog再写到sec节点,完成同步。
方案优化:
一个方案是通过合理的集合设计,降低锁的命中; 第二个 方案是,高可用数据放在分布式缓存中; 第三个方案用的也比较多,就是用rs模式,部署多些机器,然后每台slave的同步延迟不同,那么可以保证至少有一台或多台可读 .