随着互联网时代的到来,数据量的不断增加,如何高效地管理和存储数据成为了互联网企业的重要问题。MongoDB 是一种非关系型数据库,它具有高性能、高可用性、可扩展性等特点,因此在互联网企业中得到了广泛应用。本文将介绍如何使用 Docker Compose 部署 MongoDB 集群,帮助读者快速搭建 MongoDB 环境进行开发和测试。
Docker Compose 简介
Docker Compose 是 Docker 官方提供的一个工具,可以通过 YAML 文件定义多个容器的运行方式,从而方便地实现多个容器之间的协同工作。使用 Docker Compose 可以快速地搭建开发、测试和生产环境,而且可以保证环境的一致性,方便开发人员进行协作。
MongoDB 集群架构
在 MongoDB 中,集群是由多个节点组成的。每个节点都可以担任不同的角色,例如主节点、从节点、仲裁节点等。在集群中,主节点负责写入数据,从节点负责复制数据,仲裁节点负责选举主节点。下图展示了 MongoDB 集群的架构:
在 MongoDB 集群中,主节点和从节点之间通过心跳包进行通信,以保持数据的一致性。如果主节点宕机,从节点会自动选举产生新的主节点,从而保证集群的可用性。
Docker Compose 部署 MongoDB 集群
下面我们使用 Docker Compose 来部署 MongoDB 集群。在本文中,我们将使用三个节点来构建一个 MongoDB 集群,其中一个节点作为主节点,另外两个节点作为从节点。我们将使用 Docker 官方提供的 MongoDB 镜像,并通过 Docker Compose 文件来定义容器的运行方式。
编写 Docker Compose 文件
我们先来编写 Docker Compose 文件,定义 MongoDB 集群的运行方式。在项目根目录下创建一个名为 docker-compose.yml
的文件,文件内容如下:
// javascriptcn.com 代码示例 version: '3.7' services: mongo1: image: mongo ports: - 27017:27017 volumes: - ./mongo1/data:/data/db environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: password MONGO_INITDB_DATABASE: admin MONGO_REPL_SET: rs0 MONGO_PORT: 27017 MONGO_HOSTNAME: mongo1 command: mongod --replSet rs0 --bind_ip_all --port 27017 mongo2: image: mongo ports: - 27018:27017 volumes: - ./mongo2/data:/data/db environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: password MONGO_INITDB_DATABASE: admin MONGO_REPL_SET: rs0 MONGO_PORT: 27017 MONGO_HOSTNAME: mongo2 command: mongod --replSet rs0 --bind_ip_all --port 27017 mongo3: image: mongo ports: - 27019:27017 volumes: - ./mongo3/data:/data/db environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: password MONGO_INITDB_DATABASE: admin MONGO_REPL_SET: rs0 MONGO_PORT: 27017 MONGO_HOSTNAME: mongo3 command: mongod --replSet rs0 --bind_ip_all --port 27017
在这个文件中,我们定义了三个 MongoDB 节点,分别命名为 mongo1
、mongo2
、mongo3
。每个节点都使用了 Docker 官方提供的 MongoDB 镜像,并且都映射了容器内部的 /data/db
目录到宿主机的 ./mongoX/data
目录。这样可以保证数据在容器重启之后不会丢失。
在每个节点的 environment
中,我们设置了 MongoDB 的初始化参数,包括用户名、密码、数据库名、副本集名称、端口号和主机名。在 command
中,我们设置了启动 MongoDB 的命令,包括副本集名称、绑定 IP 和端口号。
启动 MongoDB 集群
在编写完 Docker Compose 文件之后,我们就可以启动 MongoDB 集群了。在终端中进入项目根目录,执行以下命令:
docker-compose up -d
这个命令会启动 Docker Compose 文件中定义的所有容器,并在后台运行。启动成功后,可以通过以下命令查看容器的运行状态:
docker-compose ps
输出结果如下:
Name Command State Ports --------------------------------------------------------------------------------- mongodb_cluster_mongo1_1 docker-entrypoint.sh mongod Up 0.0.0.0:27017->27017/tcp mongodb_cluster_mongo2_1 docker-entrypoint.sh mongod Up 0.0.0.0:27018->27017/tcp mongodb_cluster_mongo3_1 docker-entrypoint.sh mongod Up 0.0.0.0:27019->27017/tcp
可以看到,三个 MongoDB 节点已经成功启动,并且分别映射了宿主机的端口号。
初始化 MongoDB 集群
在启动 MongoDB 集群之后,我们需要初始化副本集,才能正常使用集群。在终端中执行以下命令:
docker exec -it mongodb_cluster_mongo1_1 mongo admin --eval "rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'mongo1:27017'}, {_id: 1, host: 'mongo2:27017'}, {_id: 2, host: 'mongo3:27017'}]})"
这个命令会连接到 mongo1
节点上,并执行 rs.initiate()
命令来初始化副本集。在这个命令中,我们设置了副本集名称为 rs0
,并且定义了三个节点,分别是 mongo1:27017
、mongo2:27017
和 mongo3:27017
。
初始化成功后,可以通过以下命令查看副本集的状态:
docker exec -it mongodb_cluster_mongo1_1 mongo admin --eval "rs.status()"
输出结果如下:
// javascriptcn.com 代码示例 { "set" : "rs0", "date" : ISODate("2022-01-19T07:26:34.274Z"), "myState" : 1, "term" : NumberLong(1), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "configsvr" : false, "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1642583193, 1), "t" : NumberLong(1) }, "readConcernMajorityOpTime" : { "ts" : Timestamp(1642583193, 1), "t" : NumberLong(1) }, "appliedOpTime" : { "ts" : Timestamp(1642583193, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1642583193, 1), "t" : NumberLong(1) } }, "members" : [ { "_id" : 0, "name" : "mongo1:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 53, "optime" : { "ts" : Timestamp(1642583193, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2022-01-19T07:26:33Z"), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1642583151, 1), "electionDate" : ISODate("2022-01-19T07:25:51Z"), "configVersion" : 1, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "mongo2:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 44, "optime" : { "ts" : Timestamp(1642583193, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1642583193, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2022-01-19T07:26:33Z"), "optimeDurableDate" : ISODate("2022-01-19T07:26:33Z"), "lastHeartbeat" : ISODate("2022-01-19T07:26:33.944Z"), "lastHeartbeatRecv" : ISODate("2022-01-19T07:26:34.274Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "mongo1:27017", "syncSourceHost" : "mongo1:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1 }, { "_id" : 2, "name" : "mongo3:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 44, "optime" : { "ts" : Timestamp(1642583193, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1642583193, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2022-01-19T07:26:33Z"), "optimeDurableDate" : ISODate("2022-01-19T07:26:33Z"), "lastHeartbeat" : ISODate("2022-01-19T07:26:33.944Z"), "lastHeartbeatRecv" : ISODate("2022-01-19T07:26:34.274Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "mongo1:27017", "syncSourceHost" : "mongo1:27017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1 } ], "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1642583193, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1642583193, 1) }
可以看到,副本集的状态已经正常,并且主节点为 mongo1
。
连接 MongoDB 集群
在 MongoDB 集群成功初始化之后,就可以通过客户端连接到集群进行操作了。在终端中执行以下命令:
docker exec -it mongodb_cluster_mongo1_1 mongo --username admin --password password --host rs0/mongo1:27017,mongo2:27017,mongo3:27017 --authenticationDatabase admin
这个命令会连接到 mongo1
节点上,并通过 --host
参数指定了副本集名称和节点地址。连接成功后,就可以进行 MongoDB 的操作了。
总结
本文介绍了如何使用 Docker Compose 部署 MongoDB 集群,并通过示例代码详细讲解了每个步骤的具体操作。使用 Docker Compose 可以方便地搭建 MongoDB 开发、测试和生产环境,同时保证环境的一致性,方便开发人员进行协作。希望本文能够帮助读者快速搭建 MongoDB 环境,进行开发和测试。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657ace30d2f5e1655d549080