公告介绍MongoDB 8.0,有史以来最快的MongoDB!阅读更多 >>介绍MongoDB 8.0,有史以来最快的MongoDB!>>

使用 Docker 部署 MongoDB 集群

使用 Docker 部署 MongoDB 集群/副本集

MongoDB 是一个旨在网络的通用数据库,它提供了高可用性,当在 集群(也称为 副本集)中使用时。副本集是一组 MongoDB 服务器,称为节点,包含数据的一个相同副本。如果其中一个服务器失败,其他两个将承担负载,同时故障服务器重新启动。

A diagram showing a client application with read and write access to a primary node. Arrows are showing that the data from the primary node is asynchronously replicated in the secondary nodes.

当你在 MongoDB Atlas(MongoDB 的数据库即服务)上创建 MongoDB 实例时,MongoDB 会为你自动创建一个集群,以确保你获得最佳体验。

然而,如果你想实验 MongoDB 集群,可以使用 Docker 在你的个人电脑上创建一个集群。本教程将为你提供创建自己的 MongoDB Docker 集群的必要指令。

Docker 部署的优点

创建 MongoDB 集群有许多不同的方式。最简单的方法是使用 MongoDB Atlas,MongoDB 的数据库即服务。只需点击几下,你就可以创建你的免费集群,托管在云上。

如果你想通过实验集群来更好地了解它们的工作原理,或者你需要一个带有集群的开发环境,你可以在你的电脑上安装 MongoDB 并 部署一个副本集

如果你不希望在笔记本电脑上安装 MongoDB,可以使用 Docker 运行你的集群。Docker 是一个用于启动容器的应用程序,容器是包含应用程序及其运行所需的所有依赖项的包。

使用 Docker 是一种无需本地 MongoDB 安装即可开始使用副本集的替代方法。这是确保团队中的每个人都运行相同的集群配置的便捷方式。

同样的技术可以用于在 Kubernetes 上部署高度可用的集群。

说明

创建 Docker 集群的步骤如下。

  1. 创建一个 Docker 网络。
  2. 启动三个 MongoDB 实例。
  3. 初始化副本集。

一旦 MongoDB 集群启动并运行,你就可以对其进行实验。

先决条件

对于本教程,你需要有一个容器运行时。你可以在 Docker 官方网站上找到你操作系统的安装说明 Docker 官方网站

创建 Docker 网络

第一步是创建一个Docker网络。这个网络将允许在这个网络中运行的每个容器相互看到对方。要创建网络,请运行docker network create命令。

docker network create mongoCluster

这里的mongoCluster参数是网络名称;您可以选择一个适合您设置的名称。

执行命令后,您应该能看到您刚刚创建的网络ID。

请注意,此命令只需运行一次。如果您之后重新启动容器,您无需重新创建此网络。

启动MongoDB实例

您现在可以启动带有MongoDB的第一个容器了。要启动容器,请使用docker run命令。

docker run -d --rm -p 27017:27017 --name mongo1 --network mongoCluster mongo:5 mongod --replSet myReplicaSet --bind_ip localhost,mongo1

在这里,您告诉Docker使用以下参数启动容器

  • -d表示该容器应在分离模式下运行(在后台)。
  • -p表示端口号映射。机器上任何端口27017的传入请求都将被重定向到容器的端口27017。
  • --name表示容器的名称。这将成为此机器的主机名。
  • --network表示使用哪个Docker网络。同一网络中的所有容器都可以相互看到。
  • mongo:5是Docker将使用的映像。此映像是MongoDB社区服务器版本5(由Docker维护[点击查看](https://hub.docker.com/_/mongo)))。您还可以使用MongoDB企业自定义映像

此指令的其余部分是容器启动后将执行的命令。此命令创建一个准备好的新mongod实例,用于副本集。

如果命令成功执行,您应该看到一个表示容器ID的长十六进制字符串。启动另外两个容器。您需要为这两个容器使用不同的名称和不同的端口。

docker run -d --rm -p 27018:27017 --name mongo2 --network mongoCluster mongo:5 mongod --replSet myReplicaSet --bind_ip localhost,mongo2
 
docker run -d --rm -p 27019:27017 --name mongo3 --network mongoCluster mongo:5 mongod --replSet myReplicaSet --bind_ip localhost,mongo3

现在您有三个运行MongoDB的容器。您可以使用docker ps来验证它们是否正在运行。

初始化副本集

下一步是创建包含三个成员的实际副本集。为此,您需要使用MongoDB Shell。此CLI(命令行界面)工具是默认MongoDB安装的一部分或独立安装。但是,如果您在笔记本电脑上没有安装此工具,您可以使用容器内的mongosh(通过docker exec命令)。

docker exec -it mongo1 mongosh --eval "rs.initiate({
 _id: \"myReplicaSet\",
 members: [
   {_id: 0, host: \"mongo1\"},
   {_id: 1, host: \"mongo2\"},
   {_id: 2, host: \"mongo3\"}
 ]
})"

此命令告诉Docker在名为mongo1的容器内运行mongosh工具。mongosh将尝试评估rs.initiate()命令以初始化副本集。

作为传递给rs.initiate()的配置对象的组成部分,您需要指定副本集的名称(在本例中为myReplicaSet),以及将作为副本集一部分的members列表。容器的主机名是在docker run命令中指定的--name参数的名称。您可以从文档中了解有关配置副本集的可能选项的更多信息。

如果命令成功执行,您应该看到来自mongosh CLI的消息,显示MongoDB和Mongosh的版本号,然后是一个指示

{ ok: 1 }

测试和验证副本集

现在你应该有一个正在运行的副本集。如果你想验证一切是否配置正确,可以使用 mongosh CLI 工具来评估 rs.status() 指令。这将为您提供副本集的状态,包括成员列表。

docker exec -it mongo1 mongosh --eval "rs.status()"

您还可以使用 MongoDB Compass 连接到您的集群以 创建数据库添加一些文档。请注意,数据是在容器存储中创建的,当容器从主机系统中移除时将被销毁。为了验证您的副本集是否正在运行,您可以尝试停止一个容器(使用 docker stop),然后再次尝试从数据库中读取。

docker stop mongo1

数据仍然会保留。您可以通过在 mongo2 容器上使用 rs.status() 来查看集群仍在运行。

docker exec -it mongo2 mongosh --eval "rs.status()"

您仍然会看到副本集,但请注意,第一个成员现在已停止,另一个成员已被 选举 为主节点。如果您重新启动容器 mongo1,您将能够再次看到它在副本集中,但作为一个次要成员。

下一步

现在您已经知道了 MongoDB 集群是什么,以及如何使用 Docker 在您的个人计算机上创建它,为什么不免费在 MongoDB Atlas 上启动一个集群呢?您还可以通过 MongoDB University 的 m103 课程了解更多有关基本 MongoDB 集群管理的信息,包括更多关于副本集管理的知识。