Overview
本教程向您展示如何在MongoDB Atlas中设立分片集群,并构建一个使用 Spring Data MongoDB来处理集合users分片的的 Spring Boot应用程序。
分片
分片将数据集分布在多台机器上。这对于具有大型数据集或高写入吞吐量的应用程序非常有用。MongoDB支持两种扩展方法:垂直扩展和水平扩展。
垂直扩展通过升级 CPU、 RAM或存储来增加单个服务器的容量。这种方法具有基于硬件功能的限制,并且可能会变得昂贵。
水平扩展将数据集和工作负载划分到多个服务器。每台服务器只处理总体工作负载的一部分,这比使用单个功能强大的服务器提供更高的效率。MongoDB Atlas简化了分片的集群的管理。
要学习;了解有关分片的更多信息,请参阅MongoDB Server手册中的 分片。
Tutorial
本教程向您展示如何执行以下操作:
验证先决条件
在MongoDB Atlas中设置集群
为集合配置分片
实现 Spring Boot应用程序
配置 Spring Boot应用程序
验证先决条件
开始之前,请验证您是否具备以下条件:
一个MongoDB帐户。您需要一个M30 或更高的集群才能启用分片。
具有 Spring Data MongoDB和 Spring Web 依赖项的 Spring Boot项目。您可以使用Spring Initializr创建项目。
在MongoDB Atlas中设置集群
要创建分片集群,请执行以下操作:
在 M30 或更高级别集群的集群设置中,导航到 Additional Settings。
选择 Sharding 并将其打开。
设置要部署的分片数量。对于生产应用程序,请使用多个分片。您可以在 1 和 70 分片之间部署。要学习;了解更多信息,请参阅Atlas文档中的部署集群。
创建分片集群后,选择 Load Sample Dataset(加载示例数据)。
为集合配置分片
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()
实现 Spring Boot应用程序
要实现Spring Boot应用程序,必须定义实体层、存储库、服务层和控制器层。
要使用分片功能定义实体类,请使用
@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; public class User { private String id; private String name; private String email; private String password; // Getters and Setters } @Sharded注解可帮助 Spring Data MongoDB优化分片的的环境中的操作。它确保replaceOne查询在更新或插入期间包含分片键。要为
User实体创建存储库,请定义一个扩展MongoRepository的接口。以下代码显示了UserRepository接口的示例:import org.springframework.data.mongodb.repository.MongoRepository; import com.mongodb.sharded.model.User; public interface UserRepository extends MongoRepository<User, String> { } 要处理业务逻辑,请创建一个与存储库交互的服务类。以下代码显示了一个示例
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; public class UserService { private UserRepository userRepository; public List<User> getAllUsers() { return userRepository.findAll(); } public User saveUser(User user) { return userRepository.save(user); } } 要公开
User实体的 REST 终结点,请创建一个控制器类。以下代码显示了一个示例UserController类:import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; public class UserController { private UserService userService; public List<User> getAllUsers() { return userService.getAllUsers(); } public User createUser( User user) { return userService.saveUser(user); } }
配置 Spring Boot应用程序
要将 Spring Boot应用程序连接到MongoDB Atlas,请将MongoDB连接 URI 添加到 application.properties 或 application.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手册中的分片。