Overview
このチュートリアルでは、MongoDB Atlasでクラスターを設定し、Spring Data MongoDBを使用してシャーディングされた usersコレクションを操作するアプリケーションをビルドする方法について説明します。
シャーディング
シャーディングでは、複数のマシンにデータセットが分散されます。これは、大規模なデータセットまたは高い読み取りおよび書き込みスループットを持つアプリケーションに便利です。MongoDBは、垂直拡大と水平拡大の 2 つの拡大アプローチをサポートしています。
垂直スケーリング では、CPU、 RAM、またはストレージをアップグレードすることで、単一サーバーのキャパシティーを増やします。このアプローチには、ハードウェア機能に基づく制限があり、コストが高くなる可能性があります。
水平スケーリング では、データセットとワークロードが複数のサーバーに分割されます。各サーバーは全体的なワークロードのサブセットを処理するため、単一の強力なサーバーよりも効率が向上します。MongoDB Atlas は、シャーディングされたクラスターのマネジメントを簡素化します。
シャーディングの詳細については、 MongoDB Serverマニュアルの「シャーディング」を参照してください。
Tutorial
このチュートリアルでは、次のアクションを実行する方法について説明します。
前提条件を確認します
MongoDB Atlasでシャーディングされたクラスターをセットアップする
コレクションのシャーディングを構成する
アプリケーションを実装する
アプリケーションを構成する
前提条件を確認します
始める前に、以下があることを確認してください。
spring Data MongoDBとspring Web の依存関係を持つspringBOOTプロジェクト。書込み保証 (write concern) を使用してプロジェクトを作成できます。
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()
アプリケーションを実装する
正確なデータアプリケーションを実装するには、エンティティ、リポジトリ、サービス、および コントローラー レイヤーを定義する必要があります。
シャーディングを使用してエンティティクラスを定義するには、
@Shardedアノテーションを使用してシャードキーフィールドを指定します。次のコードは、emailフィールドをシャードキーとして持つUserエンティティの例を示しています。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アノテーションは、シャーディングされた環境での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); } }
アプリケーションを構成する
アプリケーションを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マニュアルのシャードキーの選択を参照してください。
理想的なシャードキーには、次の特性があります。
高濃度: キーには多数の一意の値があり、シャード全体にデータを均等に分散できます。キーは完全に一意である必要はありません。
均等分散: キーは、1 つのシャードが他のシャードよりも多くのデータやリクエストを取り扱うホットポイントを回避するために、ドキュメントをすべてのシャードに均等に分散します。
一般的なクエリのサポート: 最も一般的なクエリ パターンに一致するキーを選択して、クエリの分散を減らし、パフォーマンスを向上させます。
sample_mflixデータベース内の usersコレクションでは、次の場合、emailフィールドはシャードキーとして機能します。
メールは一意であり、適切に分散されます。
クエリは、メールで頻繁にフィルタリングまたはソートします。
追加リソース
MongoDBでのシャーディングの詳細については、 MongoDB Serverマニュアルの「 シャーディング 」を参照してください。