分片
MongoDB 通过分片支持大数据集,分片是一种将数据分布到多个数据库服务器上的方法。请参阅 MongoDB 文档,了解如何搭建分片集群及其要求与限制。
Spring Data MongoDB 使用 @Sharded 注解来标识存储于分片集合中的实体,如下所示。
@Document("users")
@Sharded(shardKey = { "country", "userId" }) 1
public class User {
@Id
Long id;
@Field("userid")
String userId;
String country;
}
分片键的属性会被映射为实际的字段名。
分片集合
Spring Data MongoDB 不会自动为集合及其所需索引设置分片。下面的代码片段展示了如何使用 MongoDB 客户端 API 来完成设置。
MongoDatabase adminDB = template.getMongoDbFactory()
.getMongoDatabase("admin"); 1
adminDB.runCommand(new Document("enableSharding", "db")); 2
Document shardCmd = new Document("shardCollection", "db.users") 3
.append("key", new Document("country", 1).append("userid", 1)); 4
adminDB.runCommand(shardCmd);
分片命令需要针对 admin 数据库运行。
如有必要,为特定数据库启用分片。
在已启用分片的数据库中对集合进行分片。
指定分片键。本示例使用基于范围的分片。
分片键处理
分片键由一个或多个属性组成,这些属性必须存在于目标集合的每一个文档中。它用于将文档分布到各个分片上。
为实体添加 @Sharded 注解后,Spring Data MongoDB 会尽力应用分片场景所需的优化。这实质上意味着:在对实体执行更新插入(upsert)时,若 replaceOne 过滤查询中尚缺分片键信息,则自动补上所需的分片键信息。这可能需要额外的一次服务器往返,以确定当前分片键的实际值。
提示
通过设置 @Sharded(immutableKey = true),Spring Data 不会再检查实体的分片键是否发生了变更。
详情请参阅 MongoDB 文档。以下列表列出了哪些操作会自动纳入分片键:
-
(Reactive)CrudRepository.save(…) -
(Reactive)CrudRepository.saveAll(…) -
(Reactive)MongoTemplate.save(…)