简介
MongoDB 是最流行的非关系型数据库之一,它拥有众多的优点,如高可扩展性、高性能和极易使用等。在当今互联网时代,数据的存储和处理变得越来越重要。因此,MongoDB 成为了互联网领域中最广泛使用的数据库之一。
本文将介绍如何在 MongoDB 中部署分片集群,着重讲述配置和实践中需要注意的细节,以及尽可能详细地讲解每一步骤。本文不仅适用于 MongoDB 初学者,还适用于 MongoDB 已有经验的开发者。
准备工作
在开始配置分片集群之前,你需要做一些准备工作。具体来说,你需要安装 MongoDB 和一些必要的工具。
安装 MongoDB
你可以通过下面的链接去下载 MongoDB。
安装 MongoDB 的方法与其他软件类似,这里不再赘述。
安装必要的工具
在配置和管理 MongoDB 分片集群时,我们需要使用一些必要的工具。下面是这些工具:
- mongo shell:与 MongoDB 交互的命令行工具
- mongos:Mongod 分片的路由器进程
- mongod:MongoDB 数据库进程
- config server:配置服务器
- shard server:分片服务器
MongoDB 包含了所有的必要工具,因此,用户不需要额外安装这些工具。只需在安装时将其加入 PATH 环境变量即可。
安装完成后,运行下面的命令检查 MongoDB 是否正确安装。
$ mongo
你应该会看到 Mongo shell 提示符,这表明你已经成功启动了 MongoDB。
配置分片集群
在正式配置分片集群之前,我们需要先了解以下概念:
- Config server:配置服务器,存储了集群中的所有元数据和配置信息。
- Mongos:Mongod 分片的路由器进程,接收客户端的请求并将它们路由到正确的分片上。
- Shard server:分片服务器,存储了数据。
为了更好地理解 MongoDB 分片集群的结构,我们可以通过下图来说明。
如图所示,一个分片集群由多个分片服务器和一个或多个 Mongos 组成。每个分片服务器存储部分数据,同一个集合的数据可能被不同的分片服务器存储。Mongos 负责将客户端请求路由到对应的分片服务器,并以客户端的角度看起来是单台服务器。配置服务器则存储了集群中的所有元数据和配置信息。
现在,我们正式开始配置分片集群。
步骤 1:启动 Config server
首先,我们需要启动配置服务器。 Config server 负责存储集群中的所有元数据和配置信息。例如,当我们在集群中添加了一个新的分片服务器,这个信息就会存储在 Config server 中。
为了启动 Config server,请执行以下命令:
$ mongod --configsvr --dbpath /data/configdb --port 27019
这个命令会在本地启动一个 Config server,使用 /data/configdb
作为数据库目录,并监听端口 27019
。
步骤 2:启动 Shard server
接下来,我们需要启动 Shard server。分片服务器是分布式系统中的存储节点。多个 Shard server 可以组成一个分片集群,每个 Shard server 可以存储部分数据。
$ mongod --shardsvr --replSet rs0 --dbpath /data/rs0 --port 27017
这个命令会在本地启动一个分片服务器,使用 /data/rs0
作为数据库目录,并监听端口 27017
。我们使用 --replSet
选项指定了该服务器所属的分片集群。
步骤 3:启动 Mongos
现在,我们需要启动 Mongos。 Mongos 是 Mongod 分片的路由器进程,它接收客户端请求并将它们路由到正确的分片服务器。
$ mongos --configdb localhost:27019 --port 27018
这个命令会在本地启动 Mongos ,连接到 Config server,监听端口 27018
。
步骤 4:添加 Shard server
我们已经启动了 Config server、Shard server 和 Mongos。现在,我们需要将 Shard server 添加到集群中。
$ mongo --port 27018 MongoDB shell version v4.4.6 connecting to: mongodb://127.0.0.1:27018/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("3cf3dfdd-9d3b-488f-9273-e15b3c8223be") } MongoDB server version: 4.4.6 Welcome to the MongoDB shell. ...
连接到 Mongos 后,在 Mongo shell 中执行以下命令将 Shard server 添加到集群中。
> sh.addShard("rs0/localhost:27017")
这个命令会将 Shard server 添加到集群中。其中,rs0
为分片集群的名称,localhost:27017
表示要添加的服务器所在的地址和端口。
步骤 5:启用分片
在将 Shard server 添加到集群中后,我们需要启用分片。具体来说,我们需要将一个数据库及其集合切片,以允许 MongoDB 将数据存储在多个 Shard server 上。
对于某个数据库的某个集合,可以定义一个 shard key。这个 shard key 就是用来指定如何将这个集合的文档分布到不同的 Shard server 上的。例如,如果有一个记录用户数据的集合,我们可以使用用户 ID 作为 shard key,这样相同用户 ID 的文档将被存储到同一个 Shard server 上。
这里,我们以 test
数据库的 userinfo
集合为例。执行以下命令启用分片:
$ mongo --port 27018 > use test switched to db test > sh.enableSharding("test") { "ok" : 1 } > sh.shardCollection("test.userinfo", { "userid" : "hashed" }) { "collectionsharded" : "test.userinfo", "ok" : 1 }
sh.enableSharding()
命令用来启用分片。在这个例子中,我们启用了 test
数据库。
sh.shardCollection()
命令用来将指定的集合切片。在这个例子中,我们将 test.userinfo
集合切片,并指定 userid
字段作为 shard key。
步骤 6:测试分片集群
分片集群已经配置成功,我们可以测试一下它是否可以正常工作。执行以下命令,向 userinfo
集合中插入一条数据:
$ mongo --port 27018 > use test switched to db test > db.userinfo.insert({ userid: 1, username: "Alice" }) WriteResult({ "nInserted" : 1 })
执行以下命令,查看插入的数据是否成功分片:
$ mongo --port 27018 > use config switched to db config > db.chunks.find() { "_id" : "test.userinfo-95935b8d57659196c19f14655b84a9a3", "lastmod" : Timestamp(1, 0), "ns" : "test.userinfo", "min" : { "userid" : { "$minKey" : 1 } }, "max" : { "userid" : NumberLong("-5777710138718434851") }, "shard" : "rs0", "lastmodEpoch" : ObjectId("60afb3a3b1a7e07354016608") } { "_id" : "test.userinfo-37a229e34a6b4039656dd38d6f1a6c1e", "lastmod" : Timestamp(1, 0), "ns" : "test.userinfo", "min" : { "userid" : NumberLong("-5777710138718434851") }, "max" : { "userid" : { "$maxKey" : 1 } }, "shard" : "rs0", "lastmodEpoch" : ObjectId("60afb3a3b1a7e07354016608") }
db.chunks.find()
命令用来查看集合的分片信息。在返回的结果中,可以看到 test.userinfo
集合被分成了两个 Chunk,每个 Chunk 都存储在同一个 Shard server 上。
总结
本文介绍了如何在 MongoDB 中配置分片集群。我们了解了 MongoDB 分片集群的结构以及重要的概念,如 Config server、Mongos 和 Shard server 等。我们还详细讲述了每一步的具体操作,并提供了示例代码作为参考。
当你需要处理大量数据时,配置 MongoDB 分片集群是非常有用的。它可以提高存储和访问性能,并使系统更容易扩展。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64925ed248841e9894028438