最近笔者在学习MongoDB复制,收集整理了一些资料,并做了简单的副本集搭建测试。
首先,我们来了解一下什么是复制。复制就是在多个服务器上同步数据的过程,复制提供了冗余,提高了数据的可用性。随着
不同的数据库服务器数据的多个副本,复制提供了针对单个数据库服务器的丢失的容错水平。在一些情况下,复制可以提供增加的
读出量,客户端可以发送读操作到不同的服务器。在不同的数据中心维护数据的副本可以分布式应用程序提高数据局部性和可用
性。复制还可以为了专用的目的维护额外的副本,如故障恢复,报告,或备份。
MongoDB中的复制
副本集是一组维护相同的数据集的mongod实例。副本集包含几个数据承载节点和可选的一个仲裁者节点。数据承载节点中有一
个且只有一个节点被视为主服务器(primary),而其他节点被视为副本服务器(secondary)。
主服务器是副本集接受所有的写操作的唯一成员。MongoDB在主服务器上应用写操作,在主服务器的oplog中记录操作。下面是
三成员的副本集,主服务器接受所有的写操作,副本服务器成员复制这个日志并应用这些操作到它们的数据集上。
副本集的所有成员都可以接受读操作。然而,在默认情况下,应用程序指定读操作给主服务器。
副本集最多只能有一个主服务器。副本服务器复制主服务器的oplog并应用这些操作到数据集,这使得副本服务器的数据集反
映了主服务器的数据集。
我们还可以增加额外的mongod实例作为副本集的仲裁者。仲裁器不维护的数据集。它的目的是通过响应心跳和其他副本集成员
选举的要求来维护副本集的法定人数。
自动故障转移
当主服务器超过10秒没有和副本集的其他成员通信或者是变得不可用,一个合格的副本服务器将会被选举来作为新的主服务
器。选举中第一个副本服务器且获得多数成员投票的成为主服务器。在MongoDB3.2中,引入了复制协议1来减少副本集故障转移的时
间,加快了多个同步初选的检测。
下面是三成员的副本集,它的主服务器变得不可用。这会触发它选择一个剩余的副本服务器作为新的主服务器。
读操作
默认情况下,客户端从主服务器读取数据;但是,客户端可以指定一个读优先权发送读取操作到副本服务器。异步复制到副本服
务器意味着从副本服务器读取可能会返回一个不反映主服务器的数据状态。
上面介绍了MongoDB复制和副本集的一些简单概念,在接下来的文章中会介绍如何在单机下搭建副本集。