MongoDB(集群搭建) -----主从、副本集

来源:互联网 发布:淘宝客服安抚顾客语 编辑:程序博客网 时间:2024/05/16 09:56

MongoDb在用于生产环境的三种模式,master/slaves(主从模式);replcation副本集;auto shard 分片模式


在早期的系统设计中,主从模式是比较流行的,将读写分离,在不同的DB上操作,可以有效降低数据库的压力,而且还能实现数据的备份,但是在master节点故障的时候,不能及时的自动的切换到slaves节点,需要手动干预,这个是硬伤。


具体实现主从模式的步骤

1. 主服务器

#创建工作目录[root@test mongodb]# rm -rf data logs[root@test mongodb]# mkdir data logs[root@test mongodb]# vi master.conf#mongodb.confport = 39218#端口号dbpath = /work/db/mongodb/data#数据库路径logpath = /work/db/mongodb/logs/mongodb.log#log路径logappend =true#log追加master = true#主服务器fork = true#后台运行#启动[root@test mongodb]# mongod -f master.conf[root@test mongodb]# mongo

2.从服务器

#创建工作目录[root@bogon mongodb]# rm -rf data logs[root@bogon mongodb]# mkdir data logs[root@bogon mongodb]# vi slave.conf#slave.confport = 39218 #端口号dbpath = /work/db/mongodb/data #数据库路径logpath = /work/db/mongodb/logs/mongodb.log #log路径logappend =true #log追加slave=true #从服务器source=00.00.00.00:39218 #主服务器地址端口fork=true #后台运行#启动[root@test mongodb]# mongod -f slave.conf[root@test mongodb]# mongo


3.启动顺序

主服务器、从服务器、主shell端,从shell端


4.主shell测试

> use testswitched to db test> db.hello.save({'name':'Hello Word'})WriteResult({ "nInserted" : 1 })> db.hello.find(){ "_id" : ObjectId("597834bb77a6282b19f3c3e0"), "name" : "Hello Word" }

5.从shell测试
> rs.slaveOk();> use testswitched to db test> db.hello.find(){ "_id" : ObjectId("597834bb77a6282b19f3c3e0"), "name" : "Hello Word" }


副本集

概述

目前在Mongodb的官方说法中已经不推荐使用master/slave/模式,推荐使用副本集模式,应为该模式不但实现了主从模式的读写分离,而且有自己的一套选举机制,能通过自己的算法,选举出当前最优的节点作为活跃节点,一旦活跃节点宕机,选举出来的新的节点将成为活跃节点对外提供服务,其他节点则继续作为复制节点,当原先的活跃节点恢复,会自动作为非活跃节点(备份节点)存在。

这种模式的最大优点在于Mongodb的自动选举活跃节点的机制,不需要手动干预便可以实现活跃与非活跃的切换,但是它由于数据没有shard,每个节点都是一个完成的备份,则不能使用MongoDb的分布式计算功能,当然,也可以通过程序自己来实现(成本很高),所以就有了Auto shard模式。


  1. A是活跃的B和C是备用的
  2. 当A出现故障的时候,这个集群会根据权重算法推选出B作为活跃的数据库
  3. 当A恢复后他自动会变为备份数据库

实现副本集的步骤

1. A服务器 mongodb.conf

port = 39218dbpath = /work/db/mongodb/datalogpath = /work/db/mongodb/logs/mongodb.logreplSet = test #指定副本集名为testlogappend = truefork = true


2. B、C 服务器 mongodb.conf
port = 39219dbpath = /work/db/secondary/datalogpath = /work/db/secondary/logs/mongodb.logreplSet = test  #指定副本集名为testlogappend = truefork = true


3. 启动 A 服务器
mongod -f mongodb.confmongo --port 39218

4. 启动B、C服务器

mongod -f mongodb.confmongo --port 39219


5. 配置每一台服务器
config={_id:'test',members:[{'_id':0,'host':'192.168.0.1:39218'},{'_id':1,'host':'192.168.0.2:39219'},{'_id':1,'host':'192.168.0.3:39219'}]}rs.initiate(config);rs.status();