介绍
MongoDB是一个非常受欢迎的NoSQL数据库。 它通常用于存储和管理应用程序数据和网站信息。 MongoDB拥有动态模式设计,轻松的可扩展性,以及可以通过编程方式轻松访问的数据格式。
在本指南中,我们将讨论如何设置数据复制,以确保数据的高可用性,并创建强大的故障转移系统。 这在任何生产环境中都很重要,在这种环境中,数据库关闭会对您的组织或业务产生负面影响。
我们将假设您已经在系统上安装了MongoDB。 有关信息如何在Ubuntu 12.04安装MongoDB的 ,请点击这里。
什么是MongoDB复制集?
MongoDB通过称为“复制集”的实现来处理复制。 其基本形式的复制集有点类似于主从配置中的节点。 单个主成员用作对辅助成员应用更改的基础。
复制集和主从复制之间的区别是,复制集具有内部自动故障转移机制,以防主成员变得不可用。
- 主要成员 :主要成员是与复制集交易的默认接入点。 它是唯一可以接受写操作的成员。
每个复制集一次只能有一个主成员。 这是因为通过复制主节点的“oplog”(操作日志)并在辅助节点的数据集上重复更改来进行复制。 接受写操作的多个初始化将导致数据冲突。
- 次要成员 :一个复制集可以包含多个辅助成员。 辅助成员从它们自己的数据上重现来自oplog的更改。
虽然默认情况下应用程序将查询主要成员进行读取和写入操作,但您可以将设置配置为从一个或多个辅助成员读取。 如果主要成员离线或下台,则辅助成员可以成为主要成员。
注意:由于数据是异步传输的,从辅助节点读取可能导致提供旧数据。 如果这是您的使用情况的问题,您不应启用此功能。
- 仲裁者 :仲裁器是不参与实际的复制过程复制集的可选成员。 它被添加到复制集中以仅参与单个有限的功能:在选举中作为决胜者。
如果主要成员变得不可用,则在次要节点之间发生自动选择过程以选择新的主要成员。 如果辅助成员池包含偶数个节点,则由于投票失败,这可能导致无法选择新的主节点。 仲裁者在这些情况下投票,以确保达成一项决定。
如果复制集只有一个辅助成员,则需要仲裁器。
辅助成员自定义选项
有些情况下,您可能不希望所有辅助成员都遵守复制集的标准规则。 复制集最多可以有12个成员,最多7个成员将在选举情况下投票。
优先级0复制成员
在某些情况下,选择某些成员到主要职位可能会对您的应用程序的性能产生负面影响。
例如,如果要将数据复制到远程数据中心,或者特定成员的硬件不足以作为集合的主访问点,则设置优先级0可以确保此成员不会成为主成员,但可以继续复制数据。
隐藏复制成员
在某些情况下,您需要将具有独立用途且不应干扰的背景成员分离给客户端可访问和可见的主要成员集。
例如,您可能需要一个辅助成员作为分析工作的基础,这将从最新的数据集中受益,但会对工作成员造成压力。 通过将此成员设置为隐藏,它不会干扰复制集的一般操作。
隐藏的成员必须设置为优先级0,以避免成为主要成员,但他们在选举中投票。
延迟复制成员
通过为辅助成员设置延迟选项,可以控制辅助节点等待执行从主节点的oplog复制的每个操作的时间长度。
如果您希望防止意外删除或从破坏性操作恢复,这是有用的。 例如,如果将辅助节点延迟半天,则它不会立即对其自己的数据集执行意外操作,并可用于还原更改。
延迟成员不能成为主要成员,但可以在选举中投票。 在绝大多数情况下,应隐藏它们以防止进程读取过时的数据。
如何配置复制集
为了演示如何配置复制集,我们将配置一个具有主和两个辅助节点的简单集。 这意味着您将需要三个VPS实例来跟踪。 我们将使用Ubuntu 12.04机器。
您将需要在作为集合的成员的每台计算机上安装MongoDB。 您可以按照本教程学习如何在Ubuntu 12.04安装MongoDB的 。
一旦你在所有三个服务器实例上安装了MongoDB,我们需要配置一些东西,让我们的Droplet互相通信。
以下步骤假定您以root用户身份登录。
设置DNS解析
为了使我们的MongoDB实例能够有效地相互通信,我们需要配置我们的机器来为每个成员解析正确的主机名。 您可以通过做配置的子域的每个成员复制或通过编辑/etc/hosts
的每台计算机上的文件。
从长远来看,最好使用子域,但为了快速下载,我们将通过hosts文件来完成。
在每个的即将被复制会员,请编辑/etc/hosts
文件:
nano /etc/hosts
在配置本地主机的第一行之后,应为每个复制集成员添加一个条目。 这些条目采取以下形式:
ip_address mongohost0.example.com
您可以在DigitalOcean控制面板中获取您集合的成员的IP地址。 您为该计算机选择作为主机名的名称是任意的,但应该是描述性的。
在我们的例子,我们的/etc/hosts
将是这个样子:
127.0.0.1 localhost mongo0 123.456.789.111 mongo0.example.com 123.456.789.222 mongo1.example.com 123.456.789.333 mongo2.example.com这个文件应该(大部分)在集合中的所有主机上是相同的。 保存并关闭每个成员上的文件。 接下来,您需要设置Droplet的主机名以反映这些新的更改。 每个VPS上的命令将反映您在`/ etc / hosts`文件中给出的特定机器的名称。 您应该在每个服务器上发出如下命令:
hostname mongo0.example.com
在每个服务器上修改此命令以反映在文件中为其选择的名称。
编辑/etc/hostname
文件,以反映这个问题,以及:
nano /etc/hostname
mongo0.example.com
这些步骤应在每个节点上执行。
准备在MongoDB配置文件中进行复制
我们开始MongoDB配置所需要做的第一件事是停止每个服务器上的MongoDB进程。
在每个服务器上,键入:
service mongodb stop
现在,我们需要配置一个用于存储数据的目录。 使用以下命令创建目录:
mkdir /mongo-metadata
现在我们已经创建了数据目录,我们可以修改配置文件以反映我们的新复制集配置:
nano /etc/mongodb.conf
在这个文件中,我们需要指定几个参数。 一是调整dbpath
变量指向我们刚刚创建的目录:
dbpath=/mongo-metadata
从端口号规范前删除注释,以确保它在缺省端口上启动:
port = 27017
对文件的底部,去掉了前面的评论形式replSet
参数。 将此变量的值更改为容易识别的值。
replSet = rs0
最后,您应该使进程fork,以便您可以在生成服务器实例后使用您的shell。 将它添加到文件的底部:
fork = true
保存并关闭文件。 通过发出以下命令启动复制成员:
mongod --config /etc/mongodb.conf
必须对复制集的每个成员重复这些步骤。
启动复制集和添加成员
现在,您已经配置了复制集的每个成员,开始了mongod
每台机器上的过程,你可以启动复制,并添加每个成员。
在其中一个成员上,键入:
mongo
这将为您提供当前成员的MongoDB提示。
通过输入以下命令启动复制集:
rs.initiate()
这将启动复制集,并将您当前连接的服务器添加为集的第一个成员。 您可以通过键入以下内容查看此内容:
rs.conf()
{
"_id" : "rs0"
"version" : 1,
"members" : [
{
"_id" : 0,
"host" "mongo0.example.com:27017"
}
]
}
现在,你可以额外添加节点通过引用你给他们的主机名设置复制的/etc/hosts
文件:
rs.add("mongo1.example.com")
{ "ok" : 1 }
对每个剩余的复制成员执行此操作。 您的复制集现在应该已启动并正在运行。
结论
通过为每个数据存储目标正确配置复制集,您的数据库将在某种程度上受到不可用性和硬件故障的保护。 这对任何生产系统都是必不可少的。
复制集提供与应用程序的无缝接口,因为它们基本上是外部不可见的。 所有复制机制都在内部处理。 如果你打算实施的MongoDB分片 ,它是实现复制集为每个碎片服务器组件的一个好主意。