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.conf
port = 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.conf
port = 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 test
switched 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 test
switched to db test
> db.hello.find()
{ "_id" : ObjectId("597834bb77a6282b19f3c3e0"), "name" : "Hello Word" }
副本集
概述
目前在Mongodb的官方说法中已经不推荐使用master/slave/模式,推荐使用副本集模式,应为该模式不但实现了主从模式的读写分离,而且有自己的一套选举机制,能通过自己的算法,选举出当前最优的节点作为活跃节点,一旦活跃节点宕机,选举出来的新的节点将成为活跃节点对外提供服务,其他节点则继续作为复制节点,当原先的活跃节点恢复,会自动作为非活跃节点(备份节点)存在。
这种模式的最大优点在于Mongodb的自动选举活跃节点的机制,不需要手动干预便可以实现活跃与非活跃的切换,但是它由于数据没有shard,每个节点都是一个完成的备份,则不能使用MongoDb的分布式计算功能,当然,也可以通过程序自己来实现(成本很高),所以就有了Auto shard模式。
- A是活跃的B和C是备用的
- 当A出现故障的时候,这个集群会根据权重算法推选出B作为活跃的数据库
- 当A恢复后他自动会变为备份数据库
1. A服务器 mongodb.conf
port = 39218
dbpath = /work/db/mongodb/data
logpath = /work/db/mongodb/logs/mongodb.log
replSet = test #指定副本集名为test
logappend = true
fork = true
port = 39219
dbpath = /work/db/secondary/data
logpath = /work/db/secondary/logs/mongodb.log
replSet = test #指定副本集名为test
logappend = true
fork = true
mongod -f mongodb.conf
mongo --port 39218
4. 启动B、C服务器
mongod -f mongodb.conf
mongo --port 39219
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();