Mongodb集群之副本集
上篇咱们遗留了几个问题
1主节点是否能自己主动切换连接?
眼下须要手动切换
2主节点读写压力过大怎样解决
3从节点每一个上面的数据都是对数据库全量拷贝,从节点压力会不会过大
4数据压力达到机器支撑不了时候是否能自己主动扩展?
Nosql的产生是为了解决大数据量。高扩展,高性能,灵活数据模型。高可用性。可是光通过主从模型的架构是远远达不到上面几点的。因此。mongodb设计了副本集和分片的功能。咱们以下就来说说副本集
mongodb官方已经不建议使用主从模式,而是副本集进行取代。
IMPORTANT
Replica sets replace master-slave replication for most use cases. If possible, use replicasets rather than master-slave replication for all new production deployments.This documentation remains to support legacy deployments and for archivalpurposes only.
来自 <http://docs.mongodb.org/master/core/master-slave/>
什么是副本集
副本集合(ReplicaSets)。是一个基于主/从复制机制的复制功能。但添加了自己主动故障转移和恢复特性。一个集群最多能够支持7个server。而且随意节点都能够是主节点。
全部的写操作都被分发到主节点。而读操作能够在不论什么节点上进行。
从图中能够发现,client连接到整个副本集,不关系详细哪一台server是否宕机。主server负责整个副本集的读写。
副本集定期同步数据。一旦主节点挂了。副本节点就会选举一个新主机作为主节点。
坏掉的节点修好后会自己主动扩充为副本节点。
怎样配置副本集
在一台机器上创建三个文件用户存放三台数据库,之后分别配置三台数据库,使他们的replset(复制集分别形成闭环)配置启动数据库。
配置启动參数
启动配置文件
mongoA.bat mongod --configa.conf mongoB.bat mongod --configb.conf mongodbC.bat Mongod--config c.conf
登录数据库
ashell.bat mongo 127.0.0.1:9000 b.shell.bat mongo 127.0.0.1:9001 c.shell.bat mongo 127.0.0.1:9002
初始化副本集
在三台机器上随意登陆一台机器输入例如以下命名回车
use admin db.runCommand({"replSetInitiate":{ "_id":'child', "members":[ {"_id":1,"host":"127.0.0.1:9000"}, {"_id":2,"host":"127.0.0.1:9001"}, {"_id":3,"host":"127.0.0.1:9002",}, ] } })
查看集群状态
child:SECONDARY> rs.status() { "set" : "child", "date" : ISODate("2015-08-16T07:43:36Z"), "myState" : 2, "syncingTo" : "127.0.0.1:9002", "members" : [ { "_id" : 1, "name" : "127.0.0.1:9000", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 182, "optime" : Timestamp(1439170908, 1), "optimeDate" : ISODate("2015-08-10T01:41:48Z"), "infoMessage" : "syncing to: 127.0.0.1:9002", "self" : true }, { "_id" : 2, "name" : "127.0.0.1:9001", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 7, "optime" : Timestamp(1439170908, 1), "optimeDate" : ISODate("2015-08-10T01:41:48Z"), "lastHeartbeat" : ISODate("2015-08-16T07:43:36Z"), "lastHeartbeatRecv" : ISODate("2015-08-16T07:43:35Z"), "pingMs" : 2, "lastHeartbeatMessage" : "syncing to: 127.0.0.1:9002", "syncingTo" : "127.0.0.1:9002" }, { "_id" : 3, "name" : "127.0.0.1:9002", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 8, "optime" : Timestamp(1439170908, 1), "optimeDate" : ISODate("2015-08-10T01:41:48Z"), "lastHeartbeat" : ISODate("2015-08-16T07:43:35Z"), "lastHeartbeatRecv" : ISODate("2015-08-16T07:43:36Z"), "pingMs" : 772, "electionTime" : Timestamp(1439711010, 1), "electionDate" : ISODate("2015-08-16T07:43:30Z") } ], "ok" : 1 }
整个部分创建成功
副本集数据库測试
启动三个数据库查看仅仅有一个活跃节点其它为副本节点
停掉活跃点,我们查看活跃点
child:PRIMARY>show dbs
2015-08-16T15:51:21.667+0800Socket recv() errno:10053你的主机中的软件中止了一
个已建立的连接。127.0.0.1:9002
2015-08-16T15:51:21.669+0800SocketException: remote: 127.0.0.1:9002 error: 9001
再次连接数据库发现 活跃点已转移到 9000port
再将9002数据库开启
查看状态 9002数据库为备份点
以上说明我们的副本集已经搭建完毕
小结:
副本集解攻克了我们的故障转义功能。可是我们还是有一些问题 。从节点每一个上面的数据都是对数据库全量拷贝。从节点压力会不会过大?
数据压力大到机器支撑不了的时候是否能做到自己主动扩展?