第五部分 架构篇
主从复制
副本集
主从复制
MongoDB支持在多个机器中通过异步复制达到故障转移和实现冗余,多机器中同一时刻只有一台是用于写操作,正是由于这个情况,为MongoDB提供了数据一到致性的保障,担当Primary角色的机器能把读操作分发给slave
MongoDB的主从集群分为两种:
Master-Slave复制(主从)
Replica Sets复制(副本集)
Master-Slave复制(主从)
只需要在某一个服务启动时加上-master参数,而另一个服务加上-slave与-source参数,即可实现同步,MongoDB是最新版本已经不推荐使用这种方法了
加载主服务器
mongod --master --dbpath=D:\MongoDB\data\ --logpath=../log.log --port 20001
从服务器加载
mongod --slave --source 127.0.0.1:20001 --dbpath=D:\MongoDB\data2\ --logpath=../log2.log --port 20002
妈的,wind下开两个老是出错,疯了,看样式子不行啊
Linux下面的实例:
KillAll mongod
启动一台
./mongod --master --dbpath=/usr/local/mongodb/data1/ --lo
gpath=/usr/local/mongodb/dblog1 --fork --port 20001
查看是否成功:
netstat -tunpl | grep :20001
启动从服务器
./mongod --slave --source 127.0.0.1:20001 --dbpath=/usr/local/mongodb/data2/ --logpath=/usr/local/mongodb/dblog2 --fork --port 20002
测试成功!
注意,从服务只能读的,不能进行写操作
主服务器进行写跟修改操作
从服务器用于读取操作
===记得如果备份的话要在从服务器上进行备分,在dump后面加上主机跟端口号就行了
Replica Sets 复制(副本集)
MongoDB在1.6版本开发了replica set,主要增加了帮障自动切换和自动修复成员节点各个DB之间数据完全一致,最为显示著的区另在于,副本集没有固定的主节点,它是整个集群选举出得一个主节点,当其不工作时变更其他节点强烈推荐使用
部署Replica Sets
启动两个实例:
1: 创建数据文件存储路径
mkdir usr/local/mongodb/data/data1
mkdir usr/local/mongodb/data/data2
2: 创建日志文件路径
mkdir usr/local/mongodb/log/dblog1
mkdir usr/local/mongodb/log/dblog2
3 创建主从key文件用于标识集群的私钥的完整路径,如果各个实例的key_file内容不一致,程序将不能正常用
mkdir /usr/local/mongodb/key
cd /usr/local/mongodb/key/
touch key1
touch key2
//导入一串密钥进去
echo "123456" < key1;
echo "123456" < kye2;
把key1 key2设置为600
chmod 600*
4 启动二个实例
[root@localhost bin]# ./mongod --replSet rsl --keyFile=/usr/local/mongodb/key/key1 --port 20001 --dbpath=/usr/local/mongodb/data/data1/ --logpath=/usr/local/m
ongodb/log/dblog1 --fork
启动第一台服务器
--replSet rsl 指副本集的名称
启动第二台
[root@localhost bin]# ./mongod --replSet rsl --keyFile=/usr/local/mongodb/key/key2 --port 20002 --dbpath=/usr/local/mongodb/data/data2/ --logpath=/usr/local/mongodb/log/dblog2 --fork
5 配置及初始化Replica Sets
[root@localhost bin]# ./mongo --port 20001
MongoDB shell version: 2.2.2
connecting to: 127.0.0.1:20001/test
//设置配置Replica文件
> config_rsl={
... _id:"rsl",
... members:[
... {_id:0,host:"localhost:20001",priority:1},
... {_id:1,host:"localhost:20002",priority:2}
... ]
... };
{
"_id" : "rsl",
"members" : [
{
"_id" : 0,
"host" : "localhost:20001",
"priority" : 1
},
{
"_id" : 1,
"host" : "localhost:20002",
"priority" : 2 //值越大,级别越高
}
]
}
初始化配置文件
> rs.initiate(config_rsl);
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
6 查看复本集状态
rs.status();
rsl:PRIMARY> rs.status();
{
"set" : "rsl",
"date" : ISODate("2013-01-12T14:41:55Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "localhost:20001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 781,
"optime" : Timestamp(1358001642000, 1),
"optimeDate" : ISODate("2013-01-12T14:40:42Z"),
"lastHeartbeat" : ISODate("2013-01-12T14:41:54Z"),
"pingMs" : 0
},
{
"_id" : 1,
"name" : "localhost:20002",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1196,
"optime" : Timestamp(1358001642000, 1),
"optimeDate" : ISODate("2013-01-12T14:40:42Z"),
"self" : true
}
],
"ok" : 1
}
将在次登陆以后,会出现
rsl:PRIMARY> 这样的提示
主从操作日志oplog
MongoDB的Replica Set架构是通过一个日志来存储写操作的,这个日志就叫做"oplog".
oplog.rs是一个固定长度的capped collection.
它存在于"local"数据库中,用于记录Replica Sets操作日志
oplog的大小是可以通过mongod的参数--oplogSize来改变oplog的日志大小
Oplog内容样例:
字段说明:
ts:某个操作的时间戳
op: 操作类:如下
i:insert d:delete u:update
ns: 命名空间,也就是操作的collection name
o:document的内容
管理维护Replica Sets
读写分离
从库要是进行查询,分担主库的大量的查询请求
1 先向主库中插入一条测试数据
2 在从库进行查询等操作
当查询报错了,说明这个从库且不能执行查询的操作
3 让从库可以读,分担主库的压力
执行db.getMongo().setSlaveOk().我们就可以查询从库了
或rs.slaveOk();
故障转移
副本集比传统的Master-Slave有改进的地方就是它可以进行故障的自动转移,如果我们停掉复制集中的一个成员,那么剩余成员再自动选举一个成员,做为主库