一、mongodb高可用方案实现


1)主从复制( 不建议使用,会有单点故障的问题


2)复制集 ( mongodb官方推荐 )


主从复制会有如下问题


1、主节点挂了能否自动切换连接(目前需要手工切换)。


2、主节点的读写压力过大如何解决


3、从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大


4、数据压力大到机器支撑不了的时候能否做到自动扩展


二、高可用方案之复制集


复制集架构图


mongodb高并发写入会有瓶颈吗 mongodb 高可用_复制集



副本集特征:


1、N 个节点的集群


2、何节点可作为主节点


3、所有写入操作都在主节点上


4、自动故障转移


5、自动恢复


副本集的作用:


1、用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本


2、当主库(primary)宕机时在不需要用户干预,自动切换其他从库(secondary)做主库


3、利用副本服务器做只读服务器,实现读写分离,提高负载。


三、windows环境复制集合配置


步骤1)配置文件


D:\mongodb_1\mongodb\mongo.config


dbpath=D:\mongodb_1\data\db


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


port=28001


replSet=test


logappend=true


D:\mongodb_1\mongodb\mongo.config


dbpath=D:\mongodb_2\data\db


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


port=28002


replSet=test


logappend=true


D:\mongodb_1\mongodb\mongo.config


dbpath=D:\mongodb_3\data\db


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


port=28003


replSet=test


logappend=true


步骤2)启动服务


#服务1


cd D:\mongodb_1\mongodb\bin


mongod --config D:\mongodb_1\mongodb\mongo.config


#服务2


cd D:\mongodb_2\mongodb\bin


mongod --config D:\mongodb_2\mongodb\mongo.config


#服务3


cd D:\mongodb_3\mongodb\bin


mongod --config D:\mongodb_3\mongodb\mongo.config


步骤3)关联三个服务


config_test={"_id":"test",members:[{_id:0,host:"127.0.0.1:28001"},{_id:1,host:"127.0.0.1:28002"},{_id:2,host:"127.0.0.1:28003"}]}


步骤4)初始化


rs.initiate(config_test)


步骤5)命令行测试


#查看副本集状态


rs.status()


#插入一条数据


db.test.insert({"username":"test2"})


#查询数据


db.test.find()


#设置副本节点为可读


db.getMongo().setSlaveOk();//对整个节点生效


rs.slaveOk();//只对当前连接生效


四、仲裁节点(在复制集中非必须添加的节点)


在复制集中存在 第一选择节点第二选择节点 以及 仲裁节点裁节点 只负责投票不进行数据存储,也不能成为活跃节点。


添加仲裁节点:在第一节点输入命令: rs.addArb("192.168.158.132:27017") 则就完成了仲裁节点的添加。


查看数据节点是否是主节点


d

b.isMaster()
 
"ismaster" : true/false true代表是第一节点/false表示不是第一节点
 
"secondary" : true/false true代表是第二节点/false表示不是第二节点
 
如果上面两个参数都是false则表示这个节点是 
 仲裁节点 
 ,
 
五、复制集使用总结
 
复制集相比较与主从复制不会主节点出现问题引起的单点故障,如上会有1个PRIMARY节点 2个SECONDARY,如果PRIMARY节点服务关闭,则会将SECONDARY中的一个节点提升为PRIMARY节点。当之前挂掉的节点启动完成则自动挂载为SECONDARY节点,同时会同步最新的数据。
 
六、常见应用
 
1)手动指定primary节点
 
#在当前主节点,查看节点配置信息
 
cfg=rs.conf()
 
#将指定members下标的优先级设置为2,默认为1
 
cfg.members[1].priority=2
 
#重新加载配置文件,强制了副本集进行一次选举,优先级高的成为Primary。在这之间整个集群的所有节点都是secondary
 
rs.reconfig(cfg)
 
rs.status()
 
2)增删副本节点(在主节点操作)
 
rs.add("192.168.200.25:27017")
 
rs.remove("192.168.200.25:27017")
 
3)查看复制情况(在主节点操作)
 
db.printSlaveReplicationInfo()
 
source: 192.168.200.245:27017 syncedTo: Tue Feb 18 2014 13:02:35 GMT+0800 (CST) = 145 secs ago (0.04hrs) source: 192.168.200.25:27017 syncedTo: Tue Feb 18 2014 13:02:35 GMT+0800 (CST) = 145 secs ago (0.04hrs)
 
source:从库的ip和端口。
 
syncedTo:目前的同步情况,以及最后一次同步的时间。
 
4)查看副本集状态和配置
 
rs.status()
 
rs.conf()/rs.config()
 
5)添加备份节点
 
此机器在读写中都不可见,并且 
 不会被选举为Primary 
 , 
 但是 
 可以投票 
 ,一般用于备份数据。
 
rs.add({"_id":3,"host":"192.168.200.25:27017","priority":0,"hidden":true})
 
6)添加延迟节点
 
主要用于处理误删除数据马上同步到从节点导致的不一致问题。延迟单位秒。
 
rs.add({"_id":3,"host":"192.168.200.25:27017","priority":0,"hidden":true,"slaveDelay":60})