注:本文讨论mongo主从模式(master/slave)和副本集模式的搭建以及优缺点.
一、master/slave方案
1、搭建master服务器
$:mongod --dbpath=./../data --master --oplogSize 64 --port 5566
2、搭建slave服务器
$:mongod --slave --source 10.10.20.48:5566 --dbpath=./../dataSlave --port 5567 --slavedelay 10 --only test --autoresync
3、尝试从slave插入数据
$:mongod 10.10.20.48:5567
$:use masterSlave
$:db.info.insert({“name”:”luo”})
此处报错:not master
4、尝试从master插入数据,slave查看数据
$: mongod 10.10.20.48:5566
$:use masterSlave
$:db.info.insert({“name”:”luo”})
此处插入数据成功
$:db.info.find()
{ "_id" : ObjectId("548e954b0cd7253b60dc1601"), "name" : "luo" }
从slave查看:
$:mongod 10.10.20.48:5567
$:use masterSlave
$:db.info.find()
{ "_id" : ObjectId("548e954b0cd7253b60dc1601"), "name" : "luo" }
查询成功。
5、结论
能够指定需要备份的数据库,按照设置的时间间隔进行自动备份,slave服务器只能进行查询操作。
优点:无需修改代码。
缺点:不支持故障切换。
二、replicaSets副本集
使用一组3个mongo节点来作为一个set完成副本集工作。
1、在每个节点启动服务
a、mongod --replSet luo/10.10.20.48 --port 27017 --dbpath ./../dataRepl1
b、mongod --replSet luo/10.10.20.48 --port 27018 --dbpath ./../dataRepl2
c、mongod --replSet luo/10.10.20.48 --port 27019 --dbpath ./../dataRepl3
注:a、如果部署在三台不同的机器上,可以全部使用27017端口,本文档所有其他配置过程相同,只需修改IP和PORT即可。
b、推荐使用配置文件的方式启动服务,配置文件名取为mongod.cfg,文件内容(填入你需要的内容即可,字段可选)如下:
1 dbpath=./../dataArbi 2 logpath=./../logFile 3 replSet=luo 4 port=27017 5 keyFile=/home/pds/keyFile
启动命令为:mongod –f mongod.cfg
2、初始化这个set
a、进入任意一个mongo服务的客户端:
$:mongo 10.10.20.48:27017
b、输入配置语句:
$:config = {_id: 'luo', members: [
{_id: 0, host: '10.10.20.48:27017'},
{_id: 1, host: '10.10.20.48:27018'},
{_id: 2, host: '10.10.20.48:27019'}]
}
注:如果配置为2+1的模式(primary+secondary+arbitor),则
$:config = {_id:"luoArbi",members:[
{_id:0,host:"10.10.20.48:28010",priority:4},
{_id:1,host:"10.10.20.48:28011",priority:2},
{_id:2,host:"10.10.20.48:28012",arbiterOnly : true}]
}
控制台输出:
c、 初始化:
$:rs.initiate(config)
d、查看状态:
$:rs.status()
e、primary27017插入数据
$:mongo 10.10.20.48:27017
$:db.info.insert({"name":"luoshuai"})
$:db.info.find()
>{ "_id" : ObjectId("548ea2a16be5003cfeb92f9a"), "name" : "luoshuai" }
f、 secondary27018插入数据
$:mongo 10.10.20.48:27018
$:db.info.insert({"name":"luoshuai"})
报错not master
g、secondary27018查询数据
$:mongo 10.10.20.48:27018
$:db.info.find()
报错:error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
设置secondary可读:
$: db.getMongo().setSlaveOk()
$:db.info.find()
查询结果:{ "_id" : ObjectId("548ea2a16be5003cfeb92f9a"), "name" : "luoshuai" }
h、secondary27019查询数据
和g条结果相同。
i、 关闭primary服务,查看剩余两台secondary运行状态
27017停止运行,27018成为primary
j、 重新启动27017
27017重新启动,成为secondary,27018依旧保持primary不变。
k、 对新的primary27018进行操作,增删查改都可以正确完成
l、 对新的secondary27017进行操作,27017已变成副本集,符合副本集的通用特征。
注:仲裁搭建成功提示(这是在linux系统搭建的服务):
3、结论
一台主服务和两台副本集服务,主服务完成增删查改功能,副本集初始阶段不能进行任何操作,设置之后,能够进行读操作;如果主服务崩溃或者失去连接,自动有一个副本集成为主服务,旧的主服务重新启动之后自动成为副本集服务器,三台服务器重新组成新的完整的副本集服务。
优点:能够应对主服务突然崩溃的情况,自动完成故障转移。
缺点:增加写数据成功判断后可能会延长写入时间。
三、replicaSets副本集模式效率测试和适用结论
1、效率测试(不同环境可能略有不同):
a、写入时(数据总量100,000) 单位:s
写入方式 | 3 | 2+1 |
writeConcern=2 | 210 | 234 |
writeConcern=1 | 22 | 122 |
b、读取时(数据总量100,000,读取数据偏移53343) 单位:ms
查询方式 | windows3 | li3 | li3+index | li2+1 | li2+1+index |
secondaryPreferred() | 48 | 220 | 100 | 240 | 80 |
primary() | 49 | 160 | 80 | 150 | 80 |
2、适用结论:
1:如果需要自动化故障切换和后备支援的话,使用Replica-Set(管理起来很方便);
2:如果使用了--auth(出于安全的原因) 或者 --slavedelay的话,目前推荐使用M/S;
3:如果使用分片,Replica-Set是很适合使用的,特比是对于比较大的集群,效果更好。