一、mongodb高可用方案实现
1)主从复制(
不建议使用,会有单点故障的问题
)
2)复制集
(
mongodb官方推荐
)
主从复制会有如下问题
1、主节点挂了能否自动切换连接(目前需要手工切换)。
2、主节点的读写压力过大如何解决
3、从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大
4、数据压力大到机器支撑不了的时候能否做到自动扩展
二、高可用方案之复制集
复制集架构图
副本集特征:
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")
则就完成了仲裁节点的添加。
查看数据节点是否是主节点
db.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})