实验环境:准备三台服务器部署MongoDB副本集
副本集概念: ![](https://img-blog.csdnimg.cn/direct/2ded449b6d6e4a25992d0f58f44d08ea.png)
此集群拥有一个主节点(Master)和多个从节点(Slave),与主从复制模式类似,但是副本集与主从复制的区别在于:当集群中主节点发生故障时,副本集可以自动投票,选举出新的主节点,并引导其余的从节点连接新的主节点。
MongoDB是一个NoSQL数据库,它使用类似JSON的文档,具有动态模式。当使用数据库时,有一个应急计划总是好的,以防你的一个数据库服务器发生故障。旁白,你可以通过为你的WordPress网站利用一个灵巧的管理工具来减少发生这种情况的机会。
这就是为什么有许多数据的副本是有用的。它还可以减少读取延迟。同时,它可以提高数据库的可扩展性和可用性。这就是副本的作用。它被定义为在多个数据库之间同步数据的做法。
什么是MongoDB副本集?
属于某个副本集的每个MongoDB实例都是一个成员。每个副本集都需要有一个主要成员和至少一个辅助成员。
主要成员是与副本集进行交易的主要访问点。它也是唯一可以接受写操作的成员。副本首先复制主成员的OPLOG(操作日志)。接下来,它在第二层的各自数据集上重复记录的变化。因此,每个副本集在同一时间只能有一个主要成员。不同的主站接受写操作会导致数据冲突。
通常情况下,应用程序只查询主要成员的写和读操作。你可以设计你的设置,从一个或多个辅助成员中读取。异步数据传输会导致二级节点的读取为旧数据服务。因此,这样的安排并不是每个用例的理想选择。
副本集的特点
自动故障转移机制使MongoDB的副本集在其竞争中脱颖而出。在没有主节点的情况下,副节点之间的自动选举会选出一个新的主节点。
MongoDB副本集vs MongoDB集群
一个MongoDB副本集将在副本集节点上创建同一数据集的各种副本。副本集的主要目的是:
提供一个内置的备份解决方案
增加数据的可用性
MongoDB集群是一个完全不同的球赛。它通过一个分片键将数据分布在许多节点上。这个过程将把数据分割成许多碎片,称为分片。接下来,它将每个分片副本到不同的节点上。集群的目的是支持大型数据集和高吞吐量操作。它通过横向扩展工作负载来实现这一目标。
下面是副本集和集群的区别,通俗地说:
集群分配了工作负载。它还在许多服务器上存储数据片段(碎片)。
副本集则完全复制了数据集。
标题副本集组成:
IP | 角色 | 是否hidde |
10.0.44.29:27017 | primary | false |
10.0.44.32:27017 | secondary | false |
10.0.44.62:27017 | secondary | tue |
MongoDB允许你通过建立一个分片集群来结合这些功能。在这里,你可以将每个分片复制到一个辅助服务器。这使得分片可以提供高冗余度和数据可用性。
维护和设置一个副本集在技术上是很费力和费时的。而找到合适的托管服务?这又是一个令人头痛的问题。有这么多的选择,很容易在研究上浪费时间,而不是建立你的业务。
让我给你介绍一个工具,它可以做所有这些事情,还有更多,这样你就可以回去用你的服务/产品粉碎它。
MongoDB中的副本是如何工作的?
在MongoDB中,你将写操作发送到主服务器(节点)。主服务器将这些操作分配到次服务器上,复制数据。
在三种类型的MongoDB节点中,有两种曾经出现过:主节点和次节点。第三种在复制过程中派上用场的MongoDB节点是一个仲裁者。仲裁者节点没有数据集的副本,不能成为主节点。虽然如此,仲裁者确实参与了主节点的选举。
我们之前提到过当主节点瘫痪时会发生什么,但如果次要节点被咬了怎么办?在这种情况下,主节点变成了次要节点,数据库变得无法访问。
成员选举
选举可以在以下情况下发生:
初始化一个副本集
失去与主节点的连接(可以通过心跳检测)。
使用 rs.reconfig 或 stepDown 方法维护一个副本集
向现有的副本集添加一个新的节点
一个副本集最多可以拥有50个成员,但只有7个或更少的成员可以在任何选举中投票。
集群选举一个新的主节点之前的平均时间不应该超过12秒。选举算法将试图让具有最高优先级的副手可用。同时,优先级值为0的成员不能成为主选,不参与选举。
如何创建MongoDB的副本集
如前所述,MongoDB通过副本集处理副本。在接下来的几节中,我们将强调一些方法,你可以用这些方法来为你的使用情况创建副本集。
方法一:在Ubuntu上创建新的MongoDB副本集
在我们开始之前,你需要确保你至少有三台运行Ubuntu 20.04的服务器,每台服务器上都安装有MongoDB。
要建立一个副本集,必须提供一个地址,让副本集的每个成员都能被副本集中的其他人联系到。在这种情况下,我们在该组中保留三个成员。虽然我们可以使用IP地址,但不建议这样做,因为地址可能会意外地改变。一个更好的选择是在配置副本集时使用逻辑的DNS主机名。
我们可以通过为每个副本成员配置子域来做到这一点。虽然这可能是生产环境的理想选择,但本节将概述如何通过编辑每个服务器各自的hosts文件来配置DNS解析。这个文件允许我们将可读的主机名分配给数字IP地址。因此,如果在任何情况下,你的IP地址发生了变化,你所要做的就是更新三个服务器上的hosts’文件,而不是从头开始重新配置副本集!
大多数情况下,hosts 被存储在 /etc/ 目录下。在你的三台服务器上分别重复下面的命令:
sudo nano /etc/hosts
在上面的命令中,我们使用nano作为我们的文本编辑器,然而,你可以使用你喜欢的任何文本编辑器。在配置本地主机的前几行之后,为副本集的每个成员添加一个条目。这些条目的形式是一个IP地址,后面是你选择的可读名称。虽然你可以随心所欲地命名它们,但一定要有描述性,这样你才知道如何区分每个成员。在本教程中,我们将使用下面的主机名:
- mongo0.replset.member
- mongo1.replset.member
- mongo2.replset.member
主机名图解
保存并关闭该文件。
在为副本集配置了DNS解析后,我们需要更新防火墙规则,以允许它们相互通信。在mongo0上运行以下 ufw
命令,为mongo1提供对mongo0上27017端口的访问:
sudo ufw allow from mongo1_server_ip to any port 27017
在 mongo1_server_ip
参数的位置,输入mongo1服务器的实际IP地址。另外,如果你已经更新了该服务器上的Mongo实例以使用非默认的端口,请确保改变27017以反映你的MongoDB实例正在使用的端口。
现在添加另一个防火墙规则,让mongo2访问同一个端口:
sudo ufw allow from mongo2_server_ip to any port 27017
在 mongo2_server_ip
参数的地方,输入你的mongo2服务器的实际IP地址。然后,为你的另外两个服务器更新防火墙规则。在mongo1服务器上运行以下命令,确保改变server_ip参数中的IP地址,以分别反映mongo0和mongo2的地址:
sudo ufw allow from mongo0_server_ip to any port 27017
sudo ufw allow from mongo2_server_ip to any port 27017
最后,在mongo2上运行这两条命令。同样,要确保你为每台服务器输入正确的IP地址:
sudo ufw allow from mongo0_server_ip to any port 27017
sudo ufw allow from mongo1_server_ip to any port 27017
小结
当涉及到数据库时,副本一直是一个基本要求,特别是当更多的企业扩大规模时。它广泛提高了系统的性能、数据安全性和可用性。说到性能,对你的WordPress数据库来说,监测性能问题并在关键时刻纠正它们是至关重要的,例如,Jetpack和Freshping就是其中之一。
副本有助于确保跨多个服务器的数据保护,并防止你的服务器遭受严重的停机(甚至更糟糕的是–完全失去你的数据)。在这篇文章中,我们介绍了副本集的创建和一些故障排除技巧,以及副本的重要性。你是否为你的业务使用MongoDB副本,它是否被证明对你有用?请在下面的评论区告诉我们!