cannot be sharded on
在 MongoDB 中,mongos
实例是 MongoDB 路由器,它负责分发客户端请求到正确的分片。mongos
实例通常不直接与数据交互,而是将请求转发到配置服务器和分片服务器。因此,当你尝试使用 mongos
连接到具体的分片节点时,可能会遇到权限问题,因为 mongos
使用的用户可能没有在分片节点上的相应权限。
如果你需要在分片集群的单个节点上进行操作,你需要确保:
-
用户权限:
- 用户需要在分片节点上具有相应的权限。
- 如果你的集群使用了角色基于的访问控制(RBAC),确保用户在分片节点的数据库上具有必要的角色。
-
直接连接:
- 你可以直接连接到分片节点的 MongoDB 服务。通常,分片节点的服务运行在不同的端口上。
-
默认用户和密码:
- 如果你在部署 MongoDB 集群时没有明确设置用户和密码,那么可能使用了默认的
admin
用户和空密码。但是,出于安全考虑,不建议使用默认设置。
- 如果你在部署 MongoDB 集群时没有明确设置用户和密码,那么可能使用了默认的
-
查看日志:
- 要查看分片节点的日志,你通常需要访问服务器的文件系统。日志文件通常位于 MongoDB 数据目录的
log
子目录中。
- 要查看分片节点的日志,你通常需要访问服务器的文件系统。日志文件通常位于 MongoDB 数据目录的
-
检查分片状态:
- 你可以在
mongos
实例中使用sh.status()
命令来查看分片集群的状态。
- 你可以在
如果你需要在分片节点上执行操作,你可以这样做:
// 切换到具体的分片数据库
use yourShardDB// 尝试使用你的用户登录
db.auth("rwuser", "your_password")
如果 rwuser
用户没有在分片节点上创建,你需要在每个分片节点上创建用户。这通常在分片集群的每个分片节点上单独进行。例如:
// 连接到分片节点
mongo --host shardHost --port shardPort// 创建用户
db.createUser({user: "rwuser",pwd: "your_password",roles: [{ role: "readWrite", db: "yourShardDB" }]
})
请确保替换 shardHost
、shardPort
、yourShardDB
、rwuser
和 your_password
为你的实际分片节点地址、端口、数据库名称、用户名和密码。
如果你不确定如何操作,或者没有足够的权限,你可能需要联系你的数据库管理员或 MongoDB 支持团队来获取帮助。
分片账号
在 MongoDB 分片集群中,用户账号信息通常存储在配置服务器的 admin
数据库中。要查看分片集群中存在的所有用户账号,你需要连接到配置服务器并查询 admin
数据库中的 system.users
集合。以下是查看分片集群账号的步骤:
-
连接到配置服务器:
使用mongo
命令行工具连接到配置服务器的任意节点。mongo --host <config-server-host> --port <config-server-port> --username <admin-username> --password
替换
<config-server-host>
、<config-server-port>
、<admin-username>
和--password
为你的配置服务器的主机名、端口、管理员用户名和密码。 -
切换到
admin
数据库:
在 MongoDB 中,用户管理和权限控制通常在admin
数据库中进行。use admin
-
查询用户列表:
使用find
命令查询system.users
集合,以列出所有用户。db.getCollection('system.users').find()
或者,如果你想要更详细的信息,可以使用:
db.getUsers()
这将返回一个包含所有用户账号及其详细信息的列表。
-
查看特定用户信息:
如果你想要查看特定用户的详细信息,可以使用getUser
命令。db.getUser("username")
替换
"username"
为你想要查看的用户账号名称。
请注意,为了查询用户信息,你使用的账号需要有足够的权限来访问 admin
数据库中的 system.users
集合。通常,这意味着你需要使用一个具有 userAdmin
角色或者更高权限的用户账号来执行这些查询。
如果你的 MongoDB 集群启用了 Kerberos 认证或其他安全机制,确保你的连接和查询符合这些安全要求。如果你不确定如何操作,或者没有足够的权限,你可能需要联系你的数据库管理员或 MongoDB 支持团队来获取帮助。
分片信息
这个命令 db.adminCommand({listShards:3})
是用来列出 MongoDB 分片集群中的所有分片的信息。返回的结果显示了分片集群中的分片列表,包括每个分片的 _id
、host
和 state
。
在这个特定的输出中,我们可以看到以下信息:
-
shards:这是一个数组,包含了分片集群中的分片信息。
- _id:分片的唯一标识符,这里是
mongo-e1d17211-shardsvr1
。 - host:分片的主机信息,包括分片的三个副本节点的地址和端口。这些地址是分片集群中分片成员的连接字符串,格式为
<hostname>:<port>
。在这个例子中,分片有三个副本节点,它们都位于同一个头less服务mongo-e1d17211-shardsvr1-headless.qfusion-admin
下,端口都是27017
。 - state:分片的状态。
state
的值为1
,这通常表示分片是活动的并且可以接收读写操作。
- _id:分片的唯一标识符,这里是
-
ok:这个字段表示命令是否成功执行,值为
1
表示成功。 -
operationTime:这个字段表示命令执行的时间戳。
-
$clusterTime:这个字段包含了集群时间信息,用于多文档事务和一致性保证。
如果你想查看分片集群中的所有分片,可以使用 listShards
命令而不带任何参数:
db.adminCommand({listShards: 1})
这将返回分片集群中所有分片的列表,包括它们的 _id
、host
和 state
。如果你的集群中有多个分片,这个命令会列出所有分片的信息。
开启分片 sh.enableSharding(“music”)
您已经成功启用了 music
数据库的分片。sh.enableSharding("music")
命令会在 config
数据库中为 music
数据库创建分片的元数据,并且将该数据库标记为可分片。
然而,仅仅启用分片并不意味着数据库中的集合会被自动分片。您需要为数据库中的每个集合指定分片键,以便 MongoDB 可以开始将数据分布到不同的分片上。
要为 music
数据库中的集合指定分片键,您可以使用以下命令:
use music
db.runCommand({ shardCollection: "music.collectionName", key: { "shardKeyField": 1 } })
替换 collectionName
为您要分片的集合名称,shardKeyField
为您选择的分片键字段。例如,如果您有一个名为 songs
的集合,并且想要根据 artist
字段来分片,您可以这样做:
use music
db.runCommand({ shardCollection: "music.songs", key: { "artist": 1 } })
在执行这些命令之后,您可以通过以下命令来验证集合是否已经被正确分片:
use config
db.collections.find({ "_id": "music.collectionName" })
这将返回有关集合的分片信息,包括分片键。
请注意,分片键的选择对性能和数据分布有重要影响。一个好的分片键应该能够均匀地分布数据,并且与您的查询模式相匹配,以确保高效的查询性能。
在实际操作中,您应该根据您的应用需求和数据访问模式来选择分片键。如果您不确定如何选择分片键,或者需要进一步的帮助,您可能需要咨询数据库管理员或 MongoDB 支持团队。