Docs 菜单
Docs 主页
/ /

教程:使用 Spring Data 在 Spring Boot 中实现分片

本教程向您展示如何在MongoDB Atlas中设立分片集群,并构建一个使用 Spring Data MongoDB来处理集合users分片的的 Spring Boot应用程序。

分片将数据集分布在多台机器上。这对于具有大型数据集或高写入吞吐量的应用程序非常有用。MongoDB支持两种扩展方法:垂直扩展水平扩展

垂直扩展通过升级 CPU、 RAM或存储来增加单个服务器的容量。这种方法具有基于硬件功能的限制,并且可能会变得昂贵。

水平扩展将数据集和工作负载划分到多个服务器。每台服务器只处理总体工作负载的一部分,这比使用单个功能强大的服务器提供更高的效率。MongoDB Atlas简化了分片的集群的管理。

要学习;了解有关分片的更多信息,请参阅MongoDB Server手册中的 分片

本教程向您展示如何执行以下操作:

  • 验证先决条件

  • 在MongoDB Atlas中设置集群

  • 为集合配置分片

  • 实现 Spring Boot应用程序

  • 配置 Spring Boot应用程序

1

开始之前,请验证您是否具备以下条件:

2

要创建分片集群,请执行以下操作:

  1. 在 M30 或更高级别集群的集群设置中,导航到 Additional Settings

  2. 选择 Sharding 并将其打开。

  3. 设置要部署的分片数量。对于生产应用程序,请使用多个分片。您可以在 1 和 70 分片之间部署。要学习;了解更多信息,请参阅Atlas文档中的部署集群

  4. 创建分片集群后,选择 Load Sample Dataset(加载示例数据)。

3

Spring Data MongoDB不会自动为集合配置分片。您必须使用 mongosh 手动执行这些操作。

要连接到集群并配置分片,请在终端中运行以下命令:

mongosh "mongodb+srv://<username>:<password>@<cluster-url>/admin"

<username><password><cluster-url> 占位符替换为您的MongoDB Atlas凭证和连接字符串。

要按 email字段对 users集合分片,运行以下命令:

sh.shardCollection("sample_mflix.users", { email: 1 })

要验证分片是否已启用以及集合是否分片的,运行以下命令:

sh.status()
4

要实现Spring Boot应用程序,必须定义实体层、存储库、服务层和控制器层。

  1. 要使用分片功能定义实体类,请使用 @Sharded 注解指定分片键字段。以下代码显示了一个 User 实体示例,其中 email字段为分片键:

    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    import org.springframework.data.mongodb.core.mapping.Field;
    import org.springframework.data.mongodb.core.mapping.Sharded;
    @Document("users")
    @Sharded(shardKey = { "email" })
    public class User {
    @Id
    private String id;
    private String name;
    @Field("email")
    private String email;
    private String password;
    // Getters and Setters
    }

    @Sharded 注解可帮助 Spring Data MongoDB优化分片的的环境中的操作。它确保 replaceOne 查询在更新或插入期间包含分片键。

  2. 要为 User 实体创建存储库,请定义一个扩展 MongoRepository 的接口。以下代码显示了 UserRepository 接口的示例:

    import org.springframework.data.mongodb.repository.MongoRepository;
    import com.mongodb.sharded.model.User;
    public interface UserRepository extends MongoRepository<User, String> {
    }
  3. 要处理业务逻辑,请创建一个与存储库交互的服务类。以下代码显示了一个示例UserService 类:

    import java.util.List;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import com.mongodb.sharded.model.User;
    import com.mongodb.sharded.repository.UserRepository;
    @Service
    public class UserService {
    @Autowired
    private UserRepository userRepository;
    public List<User> getAllUsers() {
    return userRepository.findAll();
    }
    public User saveUser(User user) {
    return userRepository.save(user);
    }
    }
  4. 要公开 User 实体的 REST 终结点,请创建一个控制器类。以下代码显示了一个示例UserController 类:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    import java.util.List;
    @RestController
    @RequestMapping("/users")
    public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping
    public List<User> getAllUsers() {
    return userService.getAllUsers();
    }
    @PostMapping
    public User createUser(@RequestBody User user) {
    return userService.saveUser(user);
    }
    }
5

要将 Spring Boot应用程序连接到MongoDB Atlas,请将MongoDB连接 URI 添加到 application.propertiesapplication.yml文件中。以下代码显示了一个示例配置:

spring.data.mongodb.uri=mongodb+srv://<username>:<password>@<cluster-url>/myDatabase?retryWrites=true&w=majority

<username><password><cluster-url> 占位符替换为您的MongoDB Atlas凭证和连接字符串。

当您选择分片键时,请验证它是否在分片之间平均分配数据。分片键的选择对于分片集群的性能和可扩展性至关重要。要学习有关选择分片键的更多信息,请参阅MongoDB Server手册中的选择分片键

理想的分片键具有以下特征:

  • 高关联基数:键具有许多唯一值,以便在分片之间均匀分布数据。密钥不需要完全唯一。

  • 均匀分布:该密钥将文档均匀地分布在所有分片上,以避免出现一个分片处理的数据或请求多于其他分片的情况。

  • 支持常见查询:选择与最常见查询模式一致的键,以减少查询分散并提高性能。

对于 sample_mflix数据库中的 users集合,在以下情况下,email字段可作为分片键:

  • 电子邮件是唯一的且分布式。

  • 查询经常按电子邮件过滤或排序。

要学习;了解有关MongoDB分片的更多信息,请参阅MongoDB Server手册中的分片

后退

开始使用 Spring Session MongoDB

在此页面上