MongoDB学习札记 第七篇 Replica Set 核心概念

副本集是一组mongod进程组成的,提供了数据冗余和高可用性。

副本集的成员

Replica Set Primary

The primary is the only member of a replica set that accepts write operations.

Replica Set Secondary Members

Secondary members replicate the primary’s data set and accept read operations. If the set has no primary, a secondary can become primary.

Priority 0 Replica Set Members

Priority 0 members are secondaries that cannot become the primary.

Hidden Replica Set Members

Hidden members are secondaries that are invisible to applications. These members support dedicated workloads, such as reporting or backup.

Replica Set Arbiter

An arbiter does not maintain a copy of the data set but participate in elections.

观察上面提到的集中成员,归根结底就是两种 Primary和Secondary,只不过Secondary根据不用的用途再次划分了。

Most deployments, however, will keep three members that store data: A primary and two secondary members.

这句话说明了正常情况下,会有一个primary节点和两个secondare节点。

在mongodb3.0.0以后的版本,最多可以有50个节点,但是只能有7个投票的节点

Changed in version 3.0.0: A replica set can have up to 50 members but only 7 voting members

那如果超过了50个节点,应该采用master-slave的模式了。但是master-slave的模式就不能自动的故障恢复了。(不能像副本集那样自动选举主节点)

##Primary节点
primary节点是在副本集中唯一能够接受写操作的节点。Mongodb将这些写操作应用到primary节点中,然后将这些操作记录在primary节点的oplog中。 Secondary节点复制这个oplog,并将里面的操作应用到自己的数据库中。(和Redis的aop备份方式一样的道理)

在上图中,有三个节点的副本集,primary节点接受所有的写操作。然后Secondary节点从primary节点复制oplog并应用到他们的数据集里面。

所有的副本集成员都能够接受读的请求。但是默认情况下,应用程序会将读请求定向到primary节点、这个是可以修改的。

一个副本集最多只能拥有一个Primary节点,一旦这个Primary节点变得不可用了,副本集就会选出一个Secondary,让它成为新的Primary节点。

Secondary节点

上文中提到了,Secondary节点维护者primary节点的数据拷贝。一个副本集能够拥有一个或多个Secondary节点。

尽管客户端不能往Secondary节点写入数据,但是能够从Secondary节点读取数据。

一个Secondary节点也能成为primary节点,当primary节点变得不可用的时候,Replica Sets(副本集)会选举出新的Primary节点(是否是Zookeeper的master选举方式呢?还不清楚)。

对于Secondary节点,我们可以根据不能的目的,将secondary节点配置成不同用途的secondary:

  • Priority 0 Replica Set Members
  • Hidden Replica Set Members.
  • Delayed Replica Set Members.

Priority 0 Replica Set Members

阻止Secondary成为Primary节点,可用来让其一直处于secondar状态,只读。或者做冷备份。

如果一个副本集中的机器配置都不一样的话,可以将性能不那么优秀的机器配置成priority 0 的 Secondary节点。这样的话就能够保证只有高性能机器能够成为Primary节点了。当然,这种是备份的目的,也可以考虑将这样的节点设置成Hidden节点

Hidden Replica Set Members

应用程序都无法访问的节点。可以用来做备份

Hidden Member必须是priority 0 成员节点。那样才能不成为Primary节点。(对客户端都不可见,成为Primary节点太危险,太诡异)

虽然Hidden节点对客户端不可见,而且不能成为Primary节点,但是当Primary节点挂掉的时候可以参与投票。

Delayed Replica Set Members

历史副本的镜像备份,具备延迟性,方便从致命性的错误中恢复回来,如:无意的删除数据库或者集合。

例如,当前时间 9:50,然后delayed memeber设置一小时的延迟,那么这个delayed member的数据是8:50之前的数据。

Delayed member必须是priority 0 memeber,这样不能成为primary节点。应该是hidden member,这样能够阻止应用程序访问delayed member。

Arbiter

一个arbiter节点不会拥有数据拷贝,也不能成为主节点。它只能在选举Primary节点的时候参与投票。而且只能投出一票。

如果有有偶数台机器,那么加上一台arbiter,(arbiter也就这时候用吧?) 因为arbiter member需要很少的资源,随便再加一台普通的机子即可。

IMPORTANT

Do not run an arbiter on systems that also host the primary or the secondary members of the replica set.

即Arbiter节点不要和primary或者secondar节点在同一台机器上。

<<< 捐赠 >>>

转载请注明出处! 原文地址: http://webinglin.github.io

参考

http://docs.mongodb.org/manual/core/replication/

《MongoDB权威指南》

留言

2015-06-09