January 18, 2024
今日のデータ主導型の世界では、現代のアプリケーションが大量の情報を管理するというますます大きな課題に直面しています。従来のモノリシックデータベースはボトルネックに悩まされ、パフォーマンスが低下し、スケーラビリティが制限されていました。データベースシャーディングは、複数のシャードにデータを分散することでスケーラビリティを高め、パフォーマンスを向上させるように設計された強力なソリューションです。
データベースシャーディングは、データベースを水平方向にスケーリングする手法です。データを複数のデータベースインスタンス、つまりシャードに分割することで、パフォーマンスを向上させ、大量のデータが 1 つのデータベースに与える影響を軽減します。(参照: データベースシャーディング)
各シャードは基本的に、データ全体のサブセットを含む個別のデータベースインスタンスまたはサーバーです。シャーディングの目的は、データとデータベースの負荷を複数のシャードに分散させ、分散システムのスケーラビリティ、パフォーマンス、耐障害性を向上させることです。
データベースシャーディングとその利点の基礎を理解できたので、Node.js と MongoDB を使った実践的な実装例を見てみましょう。
この例では、2 つのデータベースインスタンスを作成し、両方をホストしています アトラス。必要に応じて Docker またはセルフホストを使用することもできます。
シャードマップを定義するには、製品カテゴリをそれぞれのシャード接続文字列にマップする単純な JavaScript オブジェクトを作成します。
const shardMap = {
'Clothing': 'database url for clothing products',
'Electronics': 'database url for electronics products',
'default': 'database url for all other products'
}
製品カテゴリを入力として受け取り、適切なシャード接続を返す関数を作成します。
// Fetch the right shard
const fetchShard = (category) => {
// get shard credentials
const credentials = shardMap?.[category]
// connect with the server
return new MongoClient(credentials ?? shardMap?.default);
}
商品のアップロードを処理する API ルートを設定します。このルートは以下を使用します。 フェッチ・ハード
製品を保管するための正しいシャードを決定する機能。
app.post('/products', async (req, res) => {
const {products} = req.body;
for (const product of products) {
// get database connection for each product
const client = await fetchShard(product?.category)
const db = client.db('database-sharding')
const productCollection = db.collection("products");
await productCollection.insertOne(product)
}
res.send("ok")
})
カテゴリ別に商品を取得するためのAPIルートを設定します。このルートでは、次のものも使用します。 フェッチ・ハード
クエリする正しいシャードを決定する関数。
app.get('/products/:category', async (req, res) => {
const {category} = req.params;
try {
// find out the correct shard
const client = await fetchShard(category)
// connect to the database
const db = client.db('database-sharding')
const productCollection = db.collection("products");
const products = await productCollection.find({category}).toArray();
res.send(products)
} catch (err) {
console.log(err)
res.status(500).json({message: 'Error fetching products'});
}
});
アプリケーションをテストするには、Postman や Curl などのツールを使用して API エンドポイントに HTTP リクエストを送信できます。例えば:
データベースシャーディングには、スケーラビリティとパフォーマンスの面で大きな利点がありますが、実装を成功させるには、その複雑さとベストプラクティスを知っておくことが重要です。
シャーディングの利点と考慮事項を理解することで、データ需要が進化し続ける中で、Node.js アプリケーションを最適化してスケーラビリティとパフォーマンスを向上させるための意思決定を行うことができます。シャーディングは強力なツールですが、他の強力なツールと同様に、最大限の利益を得るには慎重な計画と実行が必要であることを忘れないでください。