MongoDB 是一个旨在网络的通用数据库,它提供了高可用性,当在 集群(也称为 副本集)中使用时。副本集是一组 MongoDB 服务器,称为节点,包含数据的一个相同副本。如果其中一个服务器失败,其他两个将承担负载,同时故障服务器重新启动。
当你在 MongoDB Atlas(MongoDB 的数据库即服务)上创建 MongoDB 实例时,MongoDB 会为你自动创建一个集群,以确保你获得最佳体验。
然而,如果你想实验 MongoDB 集群,可以使用 Docker 在你的个人电脑上创建一个集群。本教程将为你提供创建自己的 MongoDB Docker 集群的必要指令。
创建 MongoDB 集群有许多不同的方式。最简单的方法是使用 MongoDB Atlas,MongoDB 的数据库即服务。只需点击几下,你就可以创建你的免费集群,托管在云上。
如果你想通过实验集群来更好地了解它们的工作原理,或者你需要一个带有集群的开发环境,你可以在你的电脑上安装 MongoDB 并 部署一个副本集。
如果你不希望在笔记本电脑上安装 MongoDB,可以使用 Docker 运行你的集群。Docker 是一个用于启动容器的应用程序,容器是包含应用程序及其运行所需的所有依赖项的包。
使用 Docker 是一种无需本地 MongoDB 安装即可开始使用副本集的替代方法。这是确保团队中的每个人都运行相同的集群配置的便捷方式。
同样的技术可以用于在 Kubernetes 上部署高度可用的集群。
创建 Docker 集群的步骤如下。
一旦 MongoDB 集群启动并运行,你就可以对其进行实验。
对于本教程,你需要有一个容器运行时。你可以在 Docker 官方网站上找到你操作系统的安装说明 Docker 官方网站。
第一步是创建一个Docker网络。这个网络将允许在这个网络中运行的每个容器相互看到对方。要创建网络,请运行docker network create
命令。
docker network create mongoCluster
这里的mongoCluster
参数是网络名称;您可以选择一个适合您设置的名称。
执行命令后,您应该能看到您刚刚创建的网络ID。
请注意,此命令只需运行一次。如果您之后重新启动容器,您无需重新创建此网络。
您现在可以启动带有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 集群管理的信息,包括更多关于副本集管理的知识。