cannot be sharded on

cannot be sharded on

在 MongoDB 中,mongos 实例是 MongoDB 路由器,它负责分发客户端请求到正确的分片。mongos 实例通常不直接与数据交互,而是将请求转发到配置服务器和分片服务器。因此,当你尝试使用 mongos 连接到具体的分片节点时,可能会遇到权限问题,因为 mongos 使用的用户可能没有在分片节点上的相应权限。

如果你需要在分片集群的单个节点上进行操作,你需要确保:

  1. 用户权限

    • 用户需要在分片节点上具有相应的权限。
    • 如果你的集群使用了角色基于的访问控制(RBAC),确保用户在分片节点的数据库上具有必要的角色。
  2. 直接连接

    • 你可以直接连接到分片节点的 MongoDB 服务。通常,分片节点的服务运行在不同的端口上。
  3. 默认用户和密码

    • 如果你在部署 MongoDB 集群时没有明确设置用户和密码,那么可能使用了默认的 admin 用户和空密码。但是,出于安全考虑,不建议使用默认设置。
  4. 查看日志

    • 要查看分片节点的日志,你通常需要访问服务器的文件系统。日志文件通常位于 MongoDB 数据目录的 log 子目录中。
  5. 检查分片状态

    • 你可以在 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" }]
})

请确保替换 shardHostshardPortyourShardDBrwuseryour_password 为你的实际分片节点地址、端口、数据库名称、用户名和密码。

如果你不确定如何操作,或者没有足够的权限,你可能需要联系你的数据库管理员或 MongoDB 支持团队来获取帮助。

分片账号

在 MongoDB 分片集群中,用户账号信息通常存储在配置服务器的 admin 数据库中。要查看分片集群中存在的所有用户账号,你需要连接到配置服务器并查询 admin 数据库中的 system.users 集合。以下是查看分片集群账号的步骤:

  1. 连接到配置服务器
    使用 mongo 命令行工具连接到配置服务器的任意节点。

    mongo --host <config-server-host> --port <config-server-port> --username <admin-username> --password
    

    替换 <config-server-host><config-server-port><admin-username>--password 为你的配置服务器的主机名、端口、管理员用户名和密码。

  2. 切换到 admin 数据库
    在 MongoDB 中,用户管理和权限控制通常在 admin 数据库中进行。

    use admin
    
  3. 查询用户列表
    使用 find 命令查询 system.users 集合,以列出所有用户。

    db.getCollection('system.users').find()
    

    或者,如果你想要更详细的信息,可以使用:

    db.getUsers()
    

    这将返回一个包含所有用户账号及其详细信息的列表。

  4. 查看特定用户信息
    如果你想要查看特定用户的详细信息,可以使用 getUser 命令。

    db.getUser("username")
    

    替换 "username" 为你想要查看的用户账号名称。

请注意,为了查询用户信息,你使用的账号需要有足够的权限来访问 admin 数据库中的 system.users 集合。通常,这意味着你需要使用一个具有 userAdmin 角色或者更高权限的用户账号来执行这些查询。

如果你的 MongoDB 集群启用了 Kerberos 认证或其他安全机制,确保你的连接和查询符合这些安全要求。如果你不确定如何操作,或者没有足够的权限,你可能需要联系你的数据库管理员或 MongoDB 支持团队来获取帮助。

分片信息

这个命令 db.adminCommand({listShards:3}) 是用来列出 MongoDB 分片集群中的所有分片的信息。返回的结果显示了分片集群中的分片列表,包括每个分片的 _idhoststate

在这个特定的输出中,我们可以看到以下信息:

  • shards:这是一个数组,包含了分片集群中的分片信息。

    • _id:分片的唯一标识符,这里是 mongo-e1d17211-shardsvr1
    • host:分片的主机信息,包括分片的三个副本节点的地址和端口。这些地址是分片集群中分片成员的连接字符串,格式为 <hostname>:<port>。在这个例子中,分片有三个副本节点,它们都位于同一个头less服务 mongo-e1d17211-shardsvr1-headless.qfusion-admin 下,端口都是 27017
    • state:分片的状态。state 的值为 1,这通常表示分片是活动的并且可以接收读写操作。
  • ok:这个字段表示命令是否成功执行,值为 1 表示成功。

  • operationTime:这个字段表示命令执行的时间戳。

  • $clusterTime:这个字段包含了集群时间信息,用于多文档事务和一致性保证。

如果你想查看分片集群中的所有分片,可以使用 listShards 命令而不带任何参数:

db.adminCommand({listShards: 1})

这将返回分片集群中所有分片的列表,包括它们的 _idhoststate。如果你的集群中有多个分片,这个命令会列出所有分片的信息。

开启分片 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 支持团队。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值