シャード マップ マネージャーでデータベースをスケールアウトするScale out databases with the shard map manager

SQL Azure でデータベースを簡単にスケールアウトするには、シャード マップ マネージャーを使用します。To easily scale out databases on SQL Azure, use a shard map manager. シャード マップ マネージャーは、シャード セット内のすべてのシャード (データベース) についてのグローバル マッピング情報を保持する特殊なデータベースです。The shard map manager is a special database that maintains global mapping information about all shards (databases) in a shard set. メタデータにより、アプリケーションは シャーディング キーの値に基づいて適切なデータベースに接続できます。The metadata allows an application to connect to the correct database based upon the value of the sharding key. さらに、セット内のすべてのシャードには、ローカル シャード データを追跡するマップが含まれます ( シャードレットと呼ばれます)。In addition, every shard in the set contains maps that track the local shard data (known as shardlets).

シャード マップの管理

これらのマップの構造を理解することは、シャード マップ管理に不可欠です。Understanding how these maps are constructed is essential to shard map management. これを行うには、シャード マップを管理するための Elastic Database クライアント ライブラリに含まれる ShardMapManager クラス (Java.NET) を使用します。This is done using the ShardMapManager class (Java, .NET, found in the Elastic Database client library to manage shard maps.

シャード マップとシャードのマッピングShard maps and shard mappings

シャードごとに、作成するシャード マップの種類を選択する必要があります。For each shard, you must select the type of shard map to create. 何を選択するかはデータベースのアーキテクチャによって異なります。The choice depends on the database architecture:

  1. データベースごとに 1 つのテナントSingle tenant per database
  2. データベースごとに複数のテナント (2 種類):Multiple tenants per database (two types):
    1. リスト マッピングList mapping
    2. 範囲マッピングRange mapping

シングルテナント モデルの場合は、リスト マッピング シャード マップを作成します。For a single-tenant model, create a list-mapping shard map. シングルテナント モデルでは、テナントごとに 1 つのデータベースが割り当てられます。The single-tenant model assigns one database per tenant. これは、管理が簡単なので、SaaS 開発者に有効なモデルです。This is an effective model for SaaS developers as it simplifies management.

リスト マッピング

マルチテナント モデルでは、個々のデータベースに複数のテナントが割り当てられます (そして、テナントのグループを複数のデータベースに分散させることができます)。The multi-tenant model assigns several tenants to an individual database (and you can distribute groups of tenants across multiple databases). 各テナントで必要なデータが少ない場合は、このモデルを使用します。Use this model when you expect each tenant to have small data needs. このモデルでは、範囲マッピングを使用してデータベースにテナントの範囲を割り当てます。In this model, assign a range of tenants to a database using range mapping.

範囲マッピング

または、リスト マッピングを使用して複数のテナントを個々のデータベースに割り当てることにより、マルチテナント データベース モデルを実装できます。Or you can implement a multi-tenant database model using a list mapping to assign multiple tenants to an individual database. たとえば、ID が 1 と 5 のテナントに関する情報を DB1 に格納し、DB2 にテナント 7 と 10 のデータを格納する、といったことができます。For example, DB1 is used to store information about tenant ID 1 and 5, and DB2 stores data for tenant 7 and tenant 10.

単一 DB 上の複数のテナント

シャーディング キーでサポートされる型Supported types for sharding keys

Elastic Scale では、シャーディング キーとして次の型がサポートされています。Elastic Scale support the following types as sharding keys:

.NET.NET JavaJava
integerinteger integerinteger
longlong longlong
guidguid uuiduuid
byte[]byte[] byte[]byte[]
Datetimedatetime timestamptimestamp
TimeSpantimespan durationduration
datetimeoffsetdatetimeoffset offsetdatetimeoffsetdatetime

リスト シャード マップと範囲シャード マップList and range shard maps

シャード マップは、個々のシャーディング キー値のリストまたはシャーディング キー値の範囲を使用して作成できます。Shard maps can be constructed using lists of individual sharding key values, or they can be constructed using ranges of sharding key values.

リスト シャード マップList shard maps

シャードには、シャードレットが含まれます。シャードレットとシャードの間のマッピングは、シャード マップによって管理されます。Shards contain shardlets and the mapping of shardlets to shards is maintained by a shard map. リスト シャード マップは、シャードレットを識別する個々のキー値と、シャードとして動作するデータベースとの間の関連付けのことです。A list shard map is an association between the individual key values that identify the shardlets and the databases that serve as shards. リスト マッピングは明示的であり、異なるキー値を同じデータベースにマップすることができます。List mappings are explicit and different key values can be mapped to the same database. たとえば、キー値 1 がデータベース A にマップし、キー値 3 と 6 の両方がデータベース B にマップされます。For example, key value 1 maps to Database A, and key values 3 and 6 both maps to Database B.

キーKey シャードの場所Shard Location
11 データベース ADatabase_A
33 データベース BDatabase_B
44 データベース CDatabase_C
66 データベース BDatabase_B
...... ......

範囲シャード マップRange shard maps

範囲シャード マップでは、キーの範囲がペア [Low Value, High Value) によって記述されます。Low Value は範囲内の最小キー、High Value は範囲を超える最初の値です。In a range shard map, the key range is described by a pair [Low Value, High Value) where the Low Value is the minimum key in the range, and the High Value is the first value higher than the range.

たとえば、 [0, 100) には、0 以上 100 未満のすべての整数が含まれます。For example, [0, 100) includes all integers greater than or equal 0 and less than 100. 複数の範囲が同じデータベースをポイントでき、隣接していない範囲もサポートされます (たとえば、次の例の [100,200) と [400,600) は、いずれもデータベース C をポイントしています)。Note that multiple ranges can point to the same database, and disjoint ranges are supported (for example, [100,200) and [400,600) both point to Database C in the following example.)

キーKey シャードの場所Shard Location
[1,50)[1,50) データベース ADatabase_A
[50,100)[50,100) データベース BDatabase_B
[100,200)[100,200) データベース CDatabase_C
[400,600)[400,600) データベース CDatabase_C
...... ......

上に示す各テーブルは、 ShardMap オブジェクトの概念上の例です。Each of the tables shown above is a conceptual example of a ShardMap object. 各行は、個々の PointMapping (リスト シャード マップ) オブジェクトまたは RangeMapping (範囲シャード マップ) オブジェクトの簡単な例です。Each row is a simplified example of an individual PointMapping (for the list shard map) or RangeMapping (for the range shard map) object.

シャード マップ マネージャーShard map manager

クライアント ライブラリでは、シャード マップ マネージャーはシャード マップのコレクションです。In the client library, the shard map manager is a collection of shard maps. ShardMapManager インスタンスによって管理されるデータは、次の 3 つの場所に保持されます。The data managed by a ShardMapManager instance is kept in three places:

  1. グローバル シャード マップ (GSM) : すべてのシャード マップとマッピングのリポジトリとして機能するデータベースを指定します。Global Shard Map (GSM): You specify a database to serve as the repository for all of its shard maps and mappings. この情報を管理するために、特殊なテーブルとストアド プロシージャが自動的に作成されます。Special tables and stored procedures are automatically created to manage the information. 通常、これは小さなデータベースで簡単にアクセスでき、アプリケーションの他の目的には使用されません。This is typically a small database and lightly accessed, and it should not be used for other needs of the application. このテーブルは、 __ShardManagement という名前の特殊なスキーマに含まれます。The tables are in a special schema named __ShardManagement.
  2. ローカル シャード マップ (LSM) : シャードとして指定されたすべてのデータベースは、シャードに固有のシャード マップ情報を格納と管理するためのいくつかの小さなテーブルと特殊なストアド プロシージャを含むように変更されます。Local Shard Map (LSM): Every database that you specify to be a shard is modified to contain several small tables and special stored procedures that contain and manage shard map information specific to that shard. この情報は GSM 内の情報を冗長化したもので、これにより、アプリケーションは、GSM に負荷をかけることなくキャッシュされたシャード マップ情報を検証できます。アプリケーションは、LSM を使用して、キャッシュされたマッピングがまだ有効であるかどうかを判定できます。This information is redundant with the information in the GSM, and it allows the application to validate cached shard map information without placing any load on the GSM; the application uses the LSM to determine if a cached mapping is still valid. 各シャードの LSM に対応するテーブルも、スキーマ __ShardManagement に含まれます。The tables corresponding to the LSM on each shard are also in the schema __ShardManagement.
  3. アプリケーション キャッシュ: ShardMapManager オブジェクトにアクセスする各アプリケーション インスタンスは、そのマッピングのローカル メモリ内キャッシュを保持します。Application cache: Each application instance accessing a ShardMapManager object maintains a local in-memory cache of its mappings. ここには、最近取得されたルーティング情報が格納されます。It stores routing information that has recently been retrieved.

ShardMapManager の作成Constructing a ShardMapManager

ShardMapManager オブジェクトは、ファクトリ (Java.NET) パターンを使用して作成されます。A ShardMapManager object is constructed using a factory (Java, .NET) pattern. ShardMapManagerFactory.GetSqlShardMapManager (Java.NET) メソッドは、(サーバー名と、GSM を保持しているデータベースの名前を含む) ConnectionString 形式の資格情報を受け取り、ShardMapManager のインスタンスを返します。The ShardMapManagerFactory.GetSqlShardMapManager (Java, .NET) method takes credentials (including the server name and database name holding the GSM) in the form of a ConnectionString and returns an instance of a ShardMapManager.

注意: ShardMapManager は、アプリケーションの初期化コード内でアプリケーション ドメインごとに 1 回だけインスタンス化する必要があります。Please Note: The ShardMapManager should be instantiated only once per app domain, within the initialization code for an application. 同じアプリケーション ドメインで ShardMapManager の追加のインスタンスを作成すると、アプリケーションのメモリ使用率と CPU 使用率が増加します。Creation of additional instances of ShardMapManager in the same app domain results in increased memory and CPU utilization of the application. ShardMapManager には、任意の数のシャード マップを含めることができます。A ShardMapManager can contain any number of shard maps. 多くのアプリケーションでは、シャード マップは 1 つあれば十分です。ただし、異なるスキーマ用や一意性を確保する目的のためにデータベースの異なるセットを使用する場合は、複数のシャード マップを使用することをお勧めします。While a single shard map may be sufficient for many applications, there are times when different sets of databases are used for different schema or for unique purposes; in those cases multiple shard maps may be preferable.

次のコードでは、アプリケーションは、TryGetSqlShardMapManager (Java.NET) メソッドを使用して既存の ShardMapManager を開こうとします。In this code, an application tries to open an existing ShardMapManager with the TryGetSqlShardMapManager (Java, .NET method. グローバル ShardMapManager (GSM) を表すオブジェクトがデータベース内に存在しない場合、クライアント ライブラリは CreateSqlShardMapManager (Java.NET) メソッドを使用してこれを作成します。If objects representing a Global ShardMapManager (GSM) do not yet exist inside the database, the client library creates them using the CreateSqlShardMapManager (Java, .NET) method.

// Try to get a reference to the Shard Map Manager in the shardMapManager database.
// If it doesn't already exist, then create it.
ShardMapManager shardMapManager = null;
boolean shardMapManagerExists = ShardMapManagerFactory.tryGetSqlShardMapManager(shardMapManagerConnectionString,ShardMapManagerLoadPolicy.Lazy, refShardMapManager);
shardMapManager = refShardMapManager.argValue;

if (shardMapManagerExists) {
    ConsoleUtils.writeInfo("Shard Map %s already exists", shardMapManager);
}
else {
    // The Shard Map Manager does not exist, so create it
    shardMapManager = ShardMapManagerFactory.createSqlShardMapManager(shardMapManagerConnectionString);
    ConsoleUtils.writeInfo("Created Shard Map %s", shardMapManager);
}
// Try to get a reference to the Shard Map Manager via the Shard Map Manager database.  
// If it doesn't already exist, then create it.
ShardMapManager shardMapManager;
bool shardMapManagerExists = ShardMapManagerFactory.TryGetSqlShardMapManager(
                                        connectionString,
                                        ShardMapManagerLoadPolicy.Lazy,
                                        out shardMapManager);

if (shardMapManagerExists)
{
    Console.WriteLine("Shard Map Manager already exists");
}
else
{
    // Create the Shard Map Manager.
    ShardMapManagerFactory.CreateSqlShardMapManager(connectionString);
    Console.WriteLine("Created SqlShardMapManager");

    shardMapManager = ShardMapManagerFactory.GetSqlShardMapManager(
            connectionString,
            ShardMapManagerLoadPolicy.Lazy);

// The connectionString contains server name, database name, and admin credentials for privileges on both the GSM and the shards themselves.
}

.NET バージョンの場合は、PowerShell を使用して新しいシャード マップ マネージャーを作成できます。For the .NET version, you can use PowerShell to create a new Shard Map Manager. こちらの例を利用できます。An example is available here.

RangeShardMap または ListShardMap の取得Get a RangeShardMap or ListShardMap

シャード マップ マネージャーの作成後、TryGetRangeShardMap (Java.NET)、TryGetListShardMap (Java.NET)、または GetShardMap (Java.NET) メソッドを使用して、RangeShardMap (Java.NET) または ListShardMap (Java.NET) を取得できます。After creating a shard map manager, you can get the RangeShardMap (Java, .NET) or ListShardMap (Java, .NET) using the TryGetRangeShardMap (Java, .NET), the TryGetListShardMap (Java, .NET), or the GetShardMap (Java, .NET) method.

// Creates a new Range Shard Map with the specified name, or gets the Range Shard Map if it already exists.
static <T> RangeShardMap<T> createOrGetRangeShardMap(ShardMapManager shardMapManager,
            String shardMapName,
            ShardKeyType keyType) {
    // Try to get a reference to the Shard Map.
    ReferenceObjectHelper<RangeShardMap<T>> refRangeShardMap = new ReferenceObjectHelper<>(null);
    boolean isGetSuccess = shardMapManager.tryGetRangeShardMap(shardMapName, keyType, refRangeShardMap);
    RangeShardMap<T> shardMap = refRangeShardMap.argValue;

    if (isGetSuccess && shardMap != null) {
        ConsoleUtils.writeInfo("Shard Map %1$s already exists", shardMap.getName());
    }
    else {
        // The Shard Map does not exist, so create it
        try {
            shardMap = shardMapManager.createRangeShardMap(shardMapName, keyType);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        ConsoleUtils.writeInfo("Created Shard Map %1$s", shardMap.getName());
    }

    return shardMap;
}
// Creates a new Range Shard Map with the specified name, or gets the Range Shard Map if it already exists.
public static RangeShardMap<T> CreateOrGetRangeShardMap<T>(ShardMapManager shardMapManager, string shardMapName)
{
    // Try to get a reference to the Shard Map.
    RangeShardMap<T> shardMap;
    bool shardMapExists = shardMapManager.TryGetRangeShardMap(shardMapName, out shardMap);

    if (shardMapExists)
    {
        ConsoleUtils.WriteInfo("Shard Map {0} already exists", shardMap.Name);
    }
    else
    {
        // The Shard Map does not exist, so create it
        shardMap = shardMapManager.CreateRangeShardMap<T>(shardMapName);
        ConsoleUtils.WriteInfo("Created Shard Map {0}", shardMap.Name);
    }

    return shardMap;
}

シャード マップ管理資格情報Shard map administration credentials

シャード マップを管理、操作するアプリケーションは、シャード マップを使用して接続をルーティングするアプリケーションとは異なります。Applications that administer and manipulate shard maps are different from those that use the shard maps to route connections.

シャード マップの管理 (シャード、シャード マップ、シャード マッピングの追加または変更など) を実行するには、ShardMapManager をインスタンス化する必要があります。そのためには、GSM データベースとシャードとして機能する各データベースに対する読み取り/書き込み特権を持つ資格情報を使用します。To administer shard maps (add or change shards, shard maps, shard mappings, etc.) you must instantiate the ShardMapManager using credentials that have read/write privileges on both the GSM database and on each database that serves as a shard. この資格情報により、新しいシャードに LSM テーブルが作成されるときだけでなく、シャード マップ情報が入力または変更されたときに GSM と LSM の両方のテーブルに対する書き込みが許可される必要があります。The credentials must allow for writes against the tables in both the GSM and LSM as shard map information is entered or changed, as well as for creating LSM tables on new shards.

Elastic Database クライアント ライブラリへのアクセスに使用する資格情報」を参照してください。See Credentials used to access the Elastic Database client library.

影響を受けるのはメタデータのみOnly metadata affected

ShardMapManager データを設定または変更するために使用されるメソッドは、シャード自体に格納されているユーザー データを変更しません。Methods used for populating or changing the ShardMapManager data do not alter the user data stored in the shards themselves. たとえば、CreateShardDeleteShardUpdateMapping などのメソッドは、シャード マップ メタデータのみに作用します。For example, methods such as CreateShard, DeleteShard, UpdateMapping, etc. affect the shard map metadata only. シャードに含まれるユーザー データを削除、追加、変更することはありません。They do not remove, add, or alter user data contained in the shards. 代わりに、これらのメソッドは、実際のデータベースを作成または削除するために実行される別の操作や、シャード化環境のバランスを再調整するためにシャードで行を移動する操作と組み合わせて使用するように設計されていますInstead, these methods are designed to be used in conjunction with separate operations you perform to create or remove actual databases, or that move rows from one shard to another to rebalance a sharded environment. (Elastic Database ツールに含まれる分割/マージツールでは、シャード間の実際のデータ移動のオーケストレーションと共にこれらの API を利用しています)。「Elastic Database 分割/マージ ツールを使用したスケーリング」をご覧ください。(The split-merge tool included with elastic database tools makes use of these APIs along with orchestrating actual data movement between shards.) See Scaling using the Elastic Database split-merge tool.

データ依存ルーティングData dependent routing

シャード マップ マネージャーは、アプリに固有のデータ操作を実行するためのデータベース接続を必要とするアプリケーションで使用されます。The shard map manager is used in applications that require database connections to perform the app-specific data operations. これらの接続は、正しいデータベースに関連付けられている必要があります。Those connections must be associated with the correct database. これを データ依存ルーティングといいます。This is known as Data Dependent Routing. このようなアプリケーションの場合は、GSM データベースに対する読み取り専用アクセス権限を持つ資格情報を使用してファクトリからシャード マップ マネージャー オブジェクトをインスタンス化します。For these applications, instantiate a shard map manager object from the factory using credentials that have read-only access on the GSM database. 後で個々の接続要求により、適切なシャード データベースに接続するために必要な資格情報が提供されます。Individual requests for later connections supply credentials necessary for connecting to the appropriate shard database.

(読み取り専用の資格情報を使用して開かれた ShardMapManager を使用する) これらのアプリケーションはマップまたはマッピングを変更できないことに注意してください。Note that these applications (using ShardMapManager opened with read-only credentials) cannot make changes to the maps or mappings. このような操作を行うには、既に説明したように、高度な特権の資格情報を提供する管理操作専用のアプリケーションまたは PowerShell スクリプトを作成します。For those needs, create administrative-specific applications or PowerShell scripts that supply higher-privileged credentials as discussed earlier. Elastic Database クライアント ライブラリへのアクセスに使用する資格情報」を参照してください。See Credentials used to access the Elastic Database client library.

詳細については、「データ依存ルーティング」をご覧ください。For more information, see Data dependent routing.

シャード マップの変更Modifying a shard map

シャード マップはさまざまな方法で変更できます。A shard map can be changed in different ways. 次に示すどのメソッドを使用しでもシャードとそのマッピングを変更できますが、これらによってシャード内のメタデータが物理的に変更されたり、実際のデータベースが作成または削除されたりすることはありません。All of the following methods modify the metadata describing the shards and their mappings, but they do not physically modify data within the shards, nor do they create or delete the actual databases. 次に示すシャード マップの管理操作の中には、物理的にデータを移動したり、シャードとして機能するデータベースを追加または削除する管理操作と組み合わせて使用したりすることが必要になる操作もあります。Some of the operations on the shard map described below may need to be coordinated with administrative actions that physically move data or that add and remove databases serving as shards.

これらのメソッドは、シャード化データベース環境内のデータの全体的な分散状況を変更するために使用できるビルド ブロックとして連携します。These methods work together as the building blocks available for modifying the overall distribution of data in your sharded database environment.

  • シャードを追加または削除するには、shardmap (Java.NET) クラスの CreateShard (Java.NET) と DeleteShard (Java.NET) を使用します。To add or remove shards: use CreateShard (Java, .NET) and DeleteShard (Java, .NET) of the shardmap (Java, .NET) class.

    これらの操作を実行するには、サーバーとターゲット シャードを表すデータベースが既に存在している必要があります。The server and database representing the target shard must already exist for these operations to execute. これらのメソッドは、データベース自体には作用せず、シャード マップ内のメタデータのみに作用します。These methods do not have any impact on the databases themselves, only on metadata in the shard map.

  • シャードにマップされるポイントまたは範囲を作成または削除するには、CreateRangeMapping (Java.NET)、RangeShardMapping (Java.NET) クラスの DeleteMapping (Java.NET)、ListShardMap (Java.NET) クラスの CreatePointMapping (Java.NET) を使用します。To create or remove points or ranges that are mapped to the shards: use CreateRangeMapping (Java, .NET), DeleteMapping (Java, .NET) of the RangeShardMapping (Java, .NET) class, and CreatePointMapping (Java, .NET) of the ListShardMap (Java, .NET) class.

    多くの異なるポイントまたは範囲を同じシャードにマップできます。Many different points or ranges can be mapped to the same shard. これらのメソッドは、メタデータにのみ作用し、シャードに既に存在するデータには作用しません。These methods only affect metadata - they do not affect any data that may already be present in shards. DeleteMapping 操作に合わせてデータをデータベースから削除する必要がある場合は、これらのメソッドを組み合わせてこれらの操作を別個に実行する必要があります。If data needs to be removed from the database in order to be consistent with DeleteMapping operations, you perform those operations separately but in conjunction with using these methods.

  • 既存の範囲を 2 つに分割する、または隣接する範囲を 1 つにマージするには、SplitMapping (Java.NET) と MergeMappings (Java.NET) を使用します。To split existing ranges into two, or merge adjacent ranges into one: use SplitMapping (Java, .NET) and MergeMappings (Java, .NET).

    分割操作とマージ操作を行っても、キー値がマップされているシャードは変更されないことに注意してください。Note that split and merge operations do not change the shard to which key values are mapped. 分割操作を実行すると、既存の範囲が 2 つの部分に分割されます。このとき、どちらの部分も同じシャードにマップされたままになります。A split breaks an existing range into two parts, but leaves both as mapped to the same shard. マージ操作を実行すると、同じシャードに既にマップされている 2 つの隣接する範囲が 1 つの範囲に結合されます。A merge operates on two adjacent ranges that are already mapped to the same shard, coalescing them into a single range. シャード間でのポイントまたは範囲自体の移動は、実際のデータの移動と組み合わせて UpdateMapping を使用して調整する必要があります。The movement of points or ranges themselves between shards needs to be coordinated by using UpdateMapping in conjunction with actual data movement. Elastic Database ツールの一部である Split/Merge サービスを使用すると、データの移動が必要な場合にシャード マップの変更をデータの移動と連携させることができます。You can use the Split/Merge service that is part of elastic database tools to coordinate shard map changes with data movement, when movement is needed.

  • 個々のポイントまたは範囲を別のシャードに再マップ (移動) するには、UpdateMapping (Java.NET) を使用します。To re-map (or move) individual points or ranges to different shards: use UpdateMapping (Java, .NET).

    データは UpdateMapping 操作に合わせてシャード間で移動することが必要になる場合があるため、これらのメソッドを使いながら移動操作を別個に実行する必要があります。Since data may need to be moved from one shard to another in order to be consistent with UpdateMapping operations, you need to perform that movement separately but in conjunction with using these methods.

  • マッピングをオンラインまたはオフラインにするには、MarkMappingOffline (Java.NET) と MarkMappingOnline (Java.NET) を使用して、マッピングのオンライン状態を制御します。To take mappings online and offline: use MarkMappingOffline (Java, .NET) and MarkMappingOnline (Java, .NET) to control the online state of a mapping.

    マッピングが "オフライン" 状態のときは、シャード マッピングに対して特定の操作のみを実行できます (UpdateMappingDeleteMapping など)。Certain operations on shard mappings are only allowed when a mapping is in an “offline” state, including UpdateMapping and DeleteMapping. マッピングがオフラインのとき、そのマッピングに含まれるキーに基づくデータに依存する要求はエラーを返します。When a mapping is offline, a data-dependent request based on a key included in that mapping returns an error. さらに、範囲が初めてオフラインになったときは、変更が加えられている範囲に対するクエリによって一貫性のない結果または不完全な結果が生成されるのを防ぐために、影響を受けるシャードへのすべての接続が自動的に強制終了されます。In addition, when a range is first taken offline, all connections to the affected shard are automatically killed in order to prevent inconsistent or incomplete results for queries directed against ranges being changed.

マッピングは、.Net では不変オブジェクトです。Mappings are immutable objects in .Net. マッピングを変更する上記のすべてのメソッドは、コード内のこれらへの参照もすべて無効にします。All of the methods above that change mappings also invalidate any references to them in your code. マッピングの状態を変更する一連の操作を実行しやすくするため、マッピングを変更するすべてのメソッドは新しいマッピングの参照を返します。これにより、操作を連結できます。To make it easier to perform sequences of operations that change a mapping’s state, all of the methods that change a mapping return a new mapping reference, so operations can be chained. たとえば、キー 25 を含むシャード マップ sm で既存のマッピングを削除するには、次のように実行できます。For example, to delete an existing mapping in shardmap sm that contains the key 25, you can execute the following:

    sm.DeleteMapping(sm.MarkMappingOffline(sm.GetMappingForKey(25)));

シャードの追加Adding a shard

多くの場合、アプリケーションは、既に存在しているシャード マップに対し、新しいキーまたはキー範囲から予想されるデータを処理するために新しいシャードを追加する必要があります。Applications often need to add new shards to handle data that is expected from new keys or key ranges, for a shard map that already exists. たとえば、テナント ID によってシャード化されるアプリケーションの場合、新しいテナントに対して新しいシャードをプロビジョニングすることが必要になる場合があります。また、毎月シャード化されるデータの場合、新しい月が始まる前に新しいシャードをプロビジョニングすることが必要になる場合があります。For example, an application sharded by Tenant ID may need to provision a new shard for a new tenant, or data sharded monthly may need a new shard provisioned before the start of each new month.

キー値の新しい範囲が既に既存のマッピングの一部ではなく、データの移動が不要な場合は、新しいシャードを追加して、新しいキーまたは範囲をそのシャードに関連付けるようにすると簡単に済みます。If the new range of key values is not already part of an existing mapping and no data movement is necessary, it is simple to add the new shard and associate the new key or range to that shard. 新しいシャードを追加する方法の詳細については、「 Adding a new Shard (新しいシャードの追加)」をご覧ください。For details on adding new shards, see Adding a new shard.

ただし、データの移動を必要とするシナリオでは、必要なシャード マップの更新と共にシャード間でのデータの移動を調整するために分割/マージ ツールが必要になります。For scenarios that require data movement, however, the split-merge tool is needed to orchestrate the data movement between shards in combination with the necessary shard map updates. 分割/マージ ツールの使用法の詳細については、「Overview of Split-Merge (Split-Merge の概要)」を参照してください。For details on using the split-merge tool, see Overview of split-merge

その他のリソースAdditional resources

まだ弾力性データベース ツールを使用していない場合は、Not using elastic database tools yet? ファースト ステップ ガイドを参照してください。Check out our Getting Started Guide. 質問がある場合は、SQL Database のフォーラムに投稿してください。機能に関するご要望は、SQL Database に関するフィードバック フォーラムにお寄せください。For questions, please reach out to us on the SQL Database forum and for feature requests, please add them to the SQL Database feedback forum.