上篇咱们遗留了几个问题
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个服务器,并且任意节点都可以是主节点。所有的写操作都被分发到主节点,而读操作可以在任何节点上进行。
从图中可以发现,客户端连接到整个副本集,不关系具体哪一台服务器是否宕机。主服务器负责整个副本集的读写。副本集定期同步数据,一旦主节点挂了,副本节点就会选举一个新主机作为主节点。坏掉的节点修好后会自动扩充为副本节点。
在一台机器上创建三个文件用户存放三台数据库,之后分别配置三台数据库,使他们的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
再次连接数据库发现 活跃点已转移到 9000端口
再将9002数据库开启
查看状态 9002数据库为备份点
以上说明我们的副本集已经搭建完成
副本集解解决了我们的故障转义功能,但是我们还是有一些问题 ,从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大?
数据压力大到机器支撑不了的时候能否做到自动扩展?