在现代 Web 应用程序中,数据库是必不可少的一部分。而 MongoDB 作为非关系型数据库的一种,能够提供良好的表现,尤其在应对高负载和大规模数据存储时表现优异。不过,随着应用程序持续发展,不可避免地需要将数据库部署在集群上,以保障高可用性。
本文将介绍 MongoDB 高可用性的必要性、复制集的概念、建立 MongoDB 集群的步骤,以及如何进行故障恢复。
MongoDB 高可用性
高可用性是指在一定时间内,系统或服务能够无故障地正常运行,并提供特定的服务水平。换句话说,这意味着在出现故障时,依然存在某种级别的服务可用性。在 MongoDB 中,高可用性由复制集实现。
MongoDB 复制集
复制集是 MongoDB 中一组运行相同数据集合的 mongod 实例,其中有一个称为主节点(primary),其余称为从节点(secondary)。
主节点是能够执行写操作并作为客户端请求的原点。当主节点不可用时,从节点可以选举出新的主节点。从节点可以执行只读的操作,也可以恢复失败的主节点。
复制集具有三个主要组成部分:
- 主节点(primary)
- 从节点(secondary)
- 仲裁节点(arbiter)
主节点是执行写操作的节点,客户端可以与其进行交互。从节点复制主节点上的数据,并可以接收读取请求,但不能执行写操作。由于从节点只是被动复制数据,因此可以部署在防火墙后面,以提高安全性。
仲裁节点是额外添加到复制集中的一个单节点,主要用于协调选举以及奇数个节点失效时的容错处理。
MongoDB 复制集的建立
下面是建立一个最小化的 MongoDB 复制集的步骤:
- 首先,使用 docker-compose.yml 文件定义一个 MongoDB 集群:
-------- ----- --------- ---------- ------ ------------------ -------- ------ ------ - ------------- ------------ ------------------------- --- --------------------------- ---- --------------------------- ------- ---------------------- ----- ---------- ------ ------------------ -------- ------ ------ - ------------- ------------ ------------------------- --- ---------- ------ ------------------ -------- ------ ------ - ------------- ------------ ------------------------- ---
- 然后,使用 mongo shell 连接到集群中的一个节点:
----- ------ ----- -- ---- -- ------- ------------------------ -----
- 使用 rs.initiate() 命令初始化副本集:
------------- ---- ------ -------- - - ---- -- ----- ----------------- -- - ---- -- ----- ----------------- -- - ---- -- ----- ----------------- - - --
- 随后,可以通过 rs.status() 命令查看复制集的状态,例如:
-----------
MongoDB 复制集的故障恢复
当主节点宕机时,复制集中的从节点会进入选举过程,并选出新的主节点。如果没有仲裁节点,则必须使用奇数个节点,以便在任何情况下都可以达成选举协议。
如果主节点可以恢复,它会尝试重新加入复制集。如果从节点成为了新的主节点,则应该尽快修复原来的主节点,并将其添加回复制集中,以确保数据的完整性。
当复制集中的大多数节点不可用时,可以使用 MongoDB 的自动故障转移特性,将数据恢复到现有的集群中。但需要注意的是,这种自动故障转移可能会破坏数据的可用性和/或一致性。
结论
MongoDB 复制集提供了高可用性和数据冗余,使得应用程序在出现不可避免的系统中断时,能够快速重新启动并继续工作。尽管建立和维护 MongoDB 集群需要付出一定的投入,但其对于应对日益复杂的数据存储问题,仍然很有价值。
示例代码:
在本示例中,使用 docker-compose 定义一个 MongoDB 集群,并使用 Node.js 连接数据库,执行一些基本操作。首先,使用 npm 初始化一个新的 Node.js 项目:
--- ----
接着,安装 mongodb 包:
--- ------- -------
然后,创建一个名为 index.js 的文件:
----- ----------- - ------------------------------- -- ---------- --- ----- --- - ---------------------------------------------------------------------------------------------- -- -------- ---- ----- ------ - ------- ----- -------- ------ - -- --- ------- ------ -- ------- -- --- ------ ----- ------ - ----- ------------------------- ---------------------- ------------ -- --------- ----- -- - ------------------ -- ------ - ------ -------- ----- - - ----- ------------------------------------ -- - --- --------------------- ---- -------------- -- ---- - ------ -------- ----- --- - ----- ------------------------------------- ------------------ ---------- ----- -- ----- --- ------ --------------- - --------------------------
最后,使用以下命令运行应用程序:
---- --------
输出应该如下所示:
--------- ------------ -- ------ -------- -- ------------------------ ----- -------- - ---- ------------------------- -- - -
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671777f7ad1e889fe221b963