Master-Slave架构及副本集
- Master-Slave架构的优点及拓扑图:
- 主要的优点:
- 解决单点故障问题;
- 实现数据的备份和恢复;
- 实现数据的读写分离;
- 拓扑图;
- 使用不同的目录和端口来模拟不同的服务器:
- master:mongod –dbpath=/mongo/master –port=27017 –master;
- slave1:mongod –dbpath=/mongo/slave1 –port=30001 –slave –source=127.0.0.1:27017;
- slave2:mongod –dbpath=/mongo/slave2 –port=30002 –slave;
- 主要的优点:
- 启动Master数据库:mongod –dbpath=/mongo/master –port=27017 –master,在master和slave的服务器上都会有一个local的集合,用来存放内部的复制信息;
- 配置Salve1数据库,并在启动时就与Master数据库保持同步:mongod –dbpath=/mongo/slave1 –port=30001 –slave –source=127.0.0.1:27017,会看到有一个rep1的进程从Master服务器同步数据;
- 把原来的Slave2服务器添加到Master-Slave架构中:
- 首先启动一台Slave2服务器,并不指定Master源:mongod –dbpath=/mongo/slave2 –port=30002 –slave;
- 连接到Slave2服务器,在local数据库下添加Master服务器信息,然后查看,同步完成后会出现同步的时间戳;
- 可以通过观察系统日志或者查看集合的记录数来查看同步的状况;
- 首先启动一台Slave2服务器,并不指定Master源:mongod –dbpath=/mongo/slave2 –port=30002 –slave;
- 查看Master, Slave的状态:
- 查看master服务器的状态:db.printReplicationInfo();
- 查看slave服务器的状态:db.printReplicationInfo();
- 查看master服务器的状态:db.printReplicationInfo();
- 读写分离:
- 默认情况下Salve服务器不支持数据的读取,可以通过驱动中的slaveOkay来显示读取Slave数据库,从而减轻Master服务器的压力;
- 也可以让前端程序直接连接到Slave服务器读取数据;
- 副本集:
- 与Master-Slave不同的是,它没有特定的主数据库,如果哪个主数据库宕机了,集群中就会推选出一个从属的数据库作为主数据库,具有自动故障恢复功能,所以一定要保证副本集为奇数个,否则会发生主节点宕机,其它节点为只读的情况;
- 创建一个名为snda的集群;
- 使用不同的服务器和端口来模拟不同的服务器:
- rep1:mongod –dbpath=/mongo/rep1 –port=30001 –replSet=snda/127.0.0.1:30002,127.0.0.1:30003;
- rep2:mongod –dbpath=/mongo/rep2 –port=30002 –replSet=snda/127.0.0.1:30001,127.0.0.1:30003;
- rep3:mongod –dbpath=/mongo/rep3 –port=30003 –replSet=snda/127.0.0.1:30001,127.0.0.1:30002;
- arbriter:mongod –dbpath=/mongo/arbiter –port=30000 –replSet=snda/127.0.0.1:30001;
- 打开第一个副本服务器rep1:mongod –dbpath=/mongo/rep1 –port=30001 –replSet=snda/127.0.0.1:30002,127.0.0.1:30003,replSet参数表示让服务器知道副本集snda下还有其它的服务器;
- 打开第二个副本服务器rep2:mongod –dbpath=/mongo/rep2 –port=30002 –replSet=snda/127.0.0.1:30001,127.0.0.1:30003,会与其它的副本进行通信,并读取副本集的配置;
- 同样的方法打开第三个副本集rep3:mongod –dbpath=/mongo/rep3 –port=30003 –replSet=snda/127.0.0.1:30001,127.0.0.1:30002;
- 添加副本集的配置信息,在任意一个副本上的admin数据库进行配置,这里选择rep1:db.runCommand({replSetInitiate:{_id:”snda”, members:[{_id:1, host:”127.0.0.1:30001″}, {_id:2, host:”127.0.0.1:30002″}, {_id:3, host:”127.0.0.1:30003″}]}});
- 此时可以从日志看出哪一个副本已经成为了Primary服务器,哪一个副本是Secondary服务器,可以看到rep2和rep3都投票给rep1作为primary服务器;当然也可以通过查看状态查询:rs.status();
- 启动仲裁服务器:mongod –dbpath=/mongo/arbiter –port=30000 –replSet=snda/127.0.0.1:30001;
- 添加仲裁服务器配置,可以通过snda副本集中任意一个副本的admin数据库添加,这里以rep1为例:rs.addArb(“127.0.0.1:30000”);
- 查看副本集群中各个服务器的状态:rs.status();
- 测试自动故障恢复功能,关掉当前的主服务器,之后通过rs.status()查看状态,发现自动投票选择了新的主服务器;
- 当rep1重新修复后加入集群,自动成为了Secondary服务器;
—————————– 已开启的Slave服务器加入到Master-Slave架构中 —————————–
mongo 127.0.0.1:30002/local
db.sources.insert({host:”127.0.0.1:27017″})
db.sources.find()
db.sources.find()
—————————– 已开启的Slave服务器加入到Master-Slave架构中 —————————–
—————————– MongoDB副本集的配置 —————————–
— 1.添加三个副本,并互相告知剩余的成员;
mongod –dbpath=/mongo/rep1 –port=30001 –replSet=snda/127.0.0.1:30002,127.0.0.1:30003;
mongod –dbpath=/mongo/rep2 –port=30002 –replSet=snda/127.0.0.1:30001,127.0.0.1:30003;
mongod –dbpath=/mongo/rep3 –port=30003 –replSet=snda/127.0.0.1:30001,127.0.0.1:30002;
— 2.添加副本集的配置信息;
mongo 127.0.0.1:30001/admin
db.runCommand({replSetInitiate:{_id:”snda”, members:[{_id:1, host:”127.0.0.1:30001″}, {_id:2, host:”127.0.0.1:30002″}, {_id:3, host:”127.0.0.1:30003″}]}})
— 3.启动仲裁服务器;
mongod –dbpath=/mongo/arbiter –port=30000 –replSet=snda/127.0.0.1:30001;
— 4.添加仲裁服务器的配置信息;
mongo 127.0.0.1:30001/admin
rs.addArb(“127.0.0.1:30000”)
— 5.查看副本集各个成员的状态;
rs.status()
—————————– MongoDB副本集的配置 —————————–