MongoDB---复制简析
MongoDB---复制简析
1.主从复制
主从复制是MongoDB最常用的复制方式,这种方式很灵活.可用于备份,故障恢复,读扩展等.
最基本的设置方式就是建立一个主节点和一个或多个从节点,每个从节点要知道主节点的地址.
运行mongod --master就启动了主服务器,运行mongod --slave --source master_address
就启动了从服务器.其中master_address是主节点的地址.
生产环境下会有多台服务器的,这里用一台机器来测试.
首先给主节点建立数据目录:
mongod --dbpath "F:\mongo\dbs\master" --port 10000 --master
--logpath "F:\mongo\logs\master\MongoDB.txt" --rest
www.zzzyk.com
设置从节点:
mongod --dbpath "F:\mongo\dbs\slave" --port 10001 --slave --source 127.0.0.1:10000 --logpath "F:\mongo\logs\slave\MongoDB.txt" --rest
现在向主节点服务器添加数据:
在从节点服务器查询数据:
所有的从节点都从主节点复制内容.
一个集群中有多少个从节点并没有明确的限制.最好是不超过12个从节点数据库的集群.
2.主从复制的选项
--only
在从节点上指定只复制特定的某个数据库(默认是复制所有数据库)
--slavedelay
用在从节点上,当应用主节点的操作时,从节点增加延时复制(单位秒).这样就能轻松设置延时从节点,这种节点对用户
无意中删除重要文档或者插入垃圾数据等有防护作用,这些不良操作都会被复制到所有的从节点上,通过延时执行操作,
可以有个恢复的时间差.
--fastsync
以主节点的数据快照为基础启动从节点.如果数据目录一开始是主节点的数据快照,从节点用这个选项启动要比
做完整的同步快的多.
--autoresync
如果从节点与主节点不同步了,则自动重新同步
--oplogsize www.zzzyk.com
主节点oplog的大小(单位MB)
3.添加及删除源
启动从节点时可以用--source指定主节点,也可以在shell中配置这个源.
如上例主节点绑定了127.0.0.1:10000.启动从节点时可以不添加源,而后向source集合添加主节点信息:
mongod --dbpath "F:\mongo\dbs\slave" --port 10001 --slave --logpath "F:\mongo\logs\slave\MongoDB.txt" --rest
可以在shell中,将127.0.0.1:10000作为源添加到从节点上:
use local
db.sources.insert({"host":"127.0.0.1:10000"})
看看从属节点的日志,会发现它与127.0.0.1:10000同步.
如果在生产环境下,想更改从节点的配置,改用refactor.com为源,这可以这样做:
db.sources.insert({"host":"refactor.com"})
db.sources.remove({"host":"127.0.0.1:10000"})
可以把sources集合当作普通的集合进行操作.
要是切换的两个主节点有相同的集合,MongoDB或尝试合并,但不能保证正确合并.要是使用一个从节点对应
多个不同的主节点,最好在主节点上使用不同的命名空间
4.副本集
副本集(Replica Set)就是有自动故障恢复功能的主从集群.主从集群和副本集最明显的区别是副本集没有固定的"主节点",
整个集群会选举出一个"主节点",当其不能工作时则变更到其他节点.副本集总会有一个活跃节点(primary)和
一个或多个备份节点(secondary).
副本集可以在活跃节点有问题时自动切换.
5.初始化副本集
设置副本集比设置主从集群稍微复杂一点.
先给副本集起个名称,是为了易于与别的副本集区分,也是为了方便将整个集合视为一个整体,这里取名:refactor www.zzzyk.com
启动服务器--replSet的作用是让服务器知道这个"refactor"副本集还有别的同伴 位置在 refactor/127.0.0.1:10001
mongod --dbpath "F:\mongo\dbs\master" --port 10000 --replSet refactor/127.0.0.1:10001 --logpath "F:\mongo\logs\master\MongoDB.txt" --rest
以同样的方式启动另一台:
mongod --dbpath "F:\mongo\dbs\slave" --port 10001 --replSet refactor/127.0.0.1:10000 --logpath "F:\mongo\logs\slave\MongoDB.txt" --rest
如果想要添加第三台,两种方式:
mongod --dbpath "F:\mongo\dbs\slave1" --port 10002
--replSet refactor/127.0.0.1:10000
--logpath "F:\mongo\logs\slave1\MongoDB.txt" --rest
mongod --dbpath "F:\mongo\dbs\slave1" --port 10002
--replSet refactor/127.0.0.1:10000,127.0.0.1:10001
--logpath "F:\mongo\logs\slave1\MongoDB.txt" --rest
副本集有自动检测功能:在其中指定单台服务器后,MongoDB就会自动搜索并连接其余的节点.
在shell中初始化副本集
在shell,连接其中一个服务器,初始化命令只能执行一次:
use admin
db.runCommand(
{
"replSetInitiate":
{
"_id":"refactor",//副本集的名称
"members"://副本集中的服务器列表
[
{
"_id":1,//每个服务器的唯一id
"host":"127.0.0.1:10000"//指定服务器的主机
},
{
"_id":2,
"host":"127.0.0.1:10001"
}
]
}
}
)
在活跃节点中添加数据:
www.zzzyk.com
在备份节点查询,会出现
error: { "$err" : "not master and slaveok=false", "code" : 13435 }错误.
执行如下语句:
db.getMongo().setSlaveOk()
6.副本集中的节点
任何时间,集群中只有一个活跃节点,其他的都是备份节点.活跃节点实际上是活跃服务器,指定的活跃节点可以随时间而改变.
有几种不同类型的节点可以存在与副本集中
standard 标准节点
这是常规节点,它存储一份完整的数据副本,参与选举投票有可能成为活跃节点
passive 被动结点
存储了完整的数据副本,参与投票,不能成为活跃节点
arbiter 仲裁者
仲裁者只能参与投票,不接收复制的数据,也不能成为活跃节点.
标准节点和被动节点之间的区别仅仅是数量的差别,每个参与节点(非仲裁)有优先权.
优先权按照优先值从大到小.
在节点配置中修改priority键,来配置标准节点或者被动节点.
>members.push({"_id":3,"host":"127.0.0.1:10002","priority":40})
默认优先级为1,可以是0-1000(含)
"arbiterOnly"键可以指定仲裁节点
>members.push({"_id":4,"host":"127.0.0.1:10003","arbiterOnly":true})
备份节点会从活跃节点抽取oplog,并执行操作,就像活跃备份系统中的备份服务器一样.活跃节点也会写操作
到自己的本地oplog.oplog中的操作包含严格递增的序号,这个序号来判定数据的时效性.
7.故障切换和活跃节点选举
如果活跃节点出现故障,其余节点会选一个新的活跃节点.选举过程可以由任何非活跃节点发起,新的活跃节点由
副
上一个:MongoDB---分片简析
下一个:MongoDB---管理简析
- 更多mongodb疑问解答:
- 【急】MongoDB写入错误~~~~
- Mongodb NOSql 数据库问题,是否可以插入带接口的类
- java操作mongodb
- Spring data MongoDB 更新整个内嵌文档时报错???????
- node.js连接mongodb更新
- MongoDB Java驱动 WriteConcern.SAFE非常浪费资源
- 求科普,hibernate怎样操作mongodb?
- 问一下mongodb怎么用hibernate整合
- mongodb查询的数据过多
- 使用JAVA创建MongoDB的问题
- Mongodb事务管理问题?
- mongodb利用java进行模糊查询
- spring 抽象类 注入值为空(spring3+mongodb+morphia)
- 【急】MongoDB写入错误~~~~
- Mongodb NOSql 数据库问题,是否可以插入带接口的类