Docker 容器快速搭建 MongoDB 集群及实际应用

阅读时长 20 min read

前言

随着云计算和大数据技术的兴起,MongoDB 成为了一个备受关注的 NoSQL 数据库。而 Docker 技术则提供了一种快速部署和管理应用程序的方式。本文将介绍如何使用 Docker 快速搭建 MongoDB 集群,并给出其实际应用的案例。

环境准备

在开始之前,确保你已经安装好了 Docker 和 Docker Compose。

Docker Compose 文件结构

我们可以使用 Docker Compose 来定义和运行多个 Docker 容器。Docker Compose 文件是一个 YAML 文件,用于定义 Docker 容器和服务。

下面是一个 MongoDB 的 Docker Compose 文件的例子:

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

---------

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

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

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

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

在这个文件中,我们定义了三个 MongoDB 容器,分别是一个 primary、一个 secondary 和一个 arbiter。我们还定义了一个 Docker 卷,用于持久化存储数据。

MongoDB 集群搭建

1. 创建 Docker Compose 文件

在一个空目录下创建一个名为 docker-compose.yml 的文件,并复制上面的 Docker Compose 配置。

2. 启动 MongoDB 集群

在命令行进入该目录,运行以下命令:

这将启动容器并在后台运行。

3. 初始化 Replica Set

接下来,我们需要初始化我们的 MongoDB Replica Set。进入 primary 节点的容器,执行以下命令:

这个命令将初始化一个名为 rs1 的 Replica Set,其中 rs1a 为 primary 节点,rs1b 为 secondary 节点,rs1arb 为 arbiter 节点。

4. 验证 Replica Set

运行以下命令验证 Replica Set 是否正常工作:

如果一切正常,你应该会看到输出类似这样:

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

如果你看到了类似输出,那么你已经成功地搭建了一个 MongoDB Replica Set 集群。

实际应用

在上面的例子中,我们已经成功地搭建了一个 MongoDB Replica Set 集群。那么这个集群除了可以存储数据之外,还可以有什么实际应用呢?接下来我们将展示如何使用 MongoDB Replica Set 集群来实现数据的读写分离、故障转移等应用场景。

数据读写分离

在一个高负载的系统中,我们希望将读操作和写操作分开处理,这样可以减轻 primary 节点的压力,并提高系统的吞吐量。我们可以将写操作指向 primary 节点,将读操作均匀地分布到 secondary 节点中,从而实现读写分离。

为了实现这个目的,我们需要使用 MongoDB 客户端驱动程序提供的读写分离功能。下面是一个 Python 的例子:

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

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

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

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

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

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

在这个例子中,我们使用了 Python 的 pymongo 库来访问 MongoDB。我们向 primary 节点插入了一条数据,并将查询的 read_preference 设置为 SECONDARY_PREFERRED。然后我们打印了查询结果,分别查看了 primary 和 secondary 节点的数据。

故障转移

在一个分布式系统中,由于网络延迟、软件错误等原因,节点可能会出现故障。为了避免系统的崩溃,我们需要在出现故障时进行故障转移。在 MongoDB Replica Set 集群中,当 primary 节点出现故障时,MongoDB 会自动选举一个 secondary 节点为新的 primary 节点,从而实现故障转移。

下面我们将模拟 primary 节点的故障:

然后再次运行以下命令验证 Replica Set 是否正常工作:

输出类似这样:

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

从输出可以看出,rs1a 节点已经无法工作,而 rs1b 节点已经成为了新的 primary 节点。这个过程是自动完成的,无需人工干预,基本上不会有数据丢失。

真实场景案例

华为分布式数据库存储引擎 GaussDB NoSQL 采用了 MongoDB 的分布式数据库架构。为了支持多节点复制和容灾,GaussDB NoSQL 采用了 MongoDB Replica Set 集群,实现了高可用、故障转移和数据备份等功能。同时,GaussDB NoSQL 还支持基于分片的横向扩展,并提供了快速查询、索引、聚合等高级查询功能。

Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d5d31ea941bf7134b1ab4c

Feed
back