MongoDB 高可用架构实践

阅读时长 6 分钟读完

在现代 Web 应用程序中,数据库是必不可少的一部分。而 MongoDB 作为非关系型数据库的一种,能够提供良好的表现,尤其在应对高负载和大规模数据存储时表现优异。不过,随着应用程序持续发展,不可避免地需要将数据库部署在集群上,以保障高可用性。

本文将介绍 MongoDB 高可用性的必要性、复制集的概念、建立 MongoDB 集群的步骤,以及如何进行故障恢复。

MongoDB 高可用性

高可用性是指在一定时间内,系统或服务能够无故障地正常运行,并提供特定的服务水平。换句话说,这意味着在出现故障时,依然存在某种级别的服务可用性。在 MongoDB 中,高可用性由复制集实现。

MongoDB 复制集

复制集是 MongoDB 中一组运行相同数据集合的 mongod 实例,其中有一个称为主节点(primary),其余称为从节点(secondary)。

主节点是能够执行写操作并作为客户端请求的原点。当主节点不可用时,从节点可以选举出新的主节点。从节点可以执行只读的操作,也可以恢复失败的主节点。

复制集具有三个主要组成部分:

  1. 主节点(primary)
  2. 从节点(secondary)
  3. 仲裁节点(arbiter)

主节点是执行写操作的节点,客户端可以与其进行交互。从节点复制主节点上的数据,并可以接收读取请求,但不能执行写操作。由于从节点只是被动复制数据,因此可以部署在防火墙后面,以提高安全性。

仲裁节点是额外添加到复制集中的一个单节点,主要用于协调选举以及奇数个节点失效时的容错处理。

MongoDB 复制集的建立

下面是建立一个最小化的 MongoDB 复制集的步骤:

  1. 首先,使用 docker-compose.yml 文件定义一个 MongoDB 集群:
-- -------------------- ---- -------
-------- -----
---------
  ----------
    ------ ------------------
    -------- ------
    ------
      - -------------
    ------------
      ------------------------- ---
      --------------------------- ----
      --------------------------- -------
      ---------------------- -----
  ----------
    ------ ------------------
    -------- ------
    ------
      - -------------
    ------------
      ------------------------- ---
  ----------
    ------ ------------------
    -------- ------
    ------
      - -------------
    ------------
      ------------------------- ---
  1. 然后,使用 mongo shell 连接到集群中的一个节点:
  1. 使用 rs.initiate() 命令初始化副本集:
  1. 随后,可以通过 rs.status() 命令查看复制集的状态,例如:

MongoDB 复制集的故障恢复

当主节点宕机时,复制集中的从节点会进入选举过程,并选出新的主节点。如果没有仲裁节点,则必须使用奇数个节点,以便在任何情况下都可以达成选举协议。

如果主节点可以恢复,它会尝试重新加入复制集。如果从节点成为了新的主节点,则应该尽快修复原来的主节点,并将其添加回复制集中,以确保数据的完整性。

当复制集中的大多数节点不可用时,可以使用 MongoDB 的自动故障转移特性,将数据恢复到现有的集群中。但需要注意的是,这种自动故障转移可能会破坏数据的可用性和/或一致性。

结论

MongoDB 复制集提供了高可用性和数据冗余,使得应用程序在出现不可避免的系统中断时,能够快速重新启动并继续工作。尽管建立和维护 MongoDB 集群需要付出一定的投入,但其对于应对日益复杂的数据存储问题,仍然很有价值。

示例代码:

在本示例中,使用 docker-compose 定义一个 MongoDB 集群,并使用 Node.js 连接数据库,执行一些基本操作。首先,使用 npm 初始化一个新的 Node.js 项目:

接着,安装 mongodb 包:

然后,创建一个名为 index.js 的文件:

-- -------------------- ---- -------
----- ----------- - -------------------------------

-- ---------- ---
----- --- - ----------------------------------------------------------------------------------------------

-- -------- ----
----- ------ - -------

----- -------- ------ -

  -- --- ------- ------ -- ------- -- --- ------
  ----- ------ - ----- -------------------------

  ---------------------- ------------ -- ---------

  ----- -- - ------------------

  -- ------ - ------ --------
  ----- - - ----- ------------------------------------ -- - ---
  --------------------- ---- --------------

  -- ---- - ------ --------
  ----- --- - ----- -------------------------------------
  ------------------ ---------- -----

  -- ----- --- ------
  ---------------
-

--------------------------

最后,使用以下命令运行应用程序:

输出应该如下所示:

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671777f7ad1e889fe221b963

纠错
反馈