Horizontales Skalieren von Datenbanken mit dem Shardzuordnungs-ManagerScale out databases with the shard map manager

Verwenden Sie einen Shardzuordnungs-Manager, um Datenbanken in SQL Azure problemlos horizontal zu skalieren.To easily scale out databases on SQL Azure, use a shard map manager. Der Shardzuordnungs-Manager ist eine spezielle Datenbank, die globale Zuordnungsinformationen zu allen Shards (Datenbanken) in einer Shardgruppe verwaltet.The shard map manager is a special database that maintains global mapping information about all shards (databases) in a shard set. Die Metadaten ermöglichen einer Anwendung die Verbindung mit der richtigen Datenbank basierend auf dem Wert des Sharding-Schlüssels.The metadata allows an application to connect to the correct database based upon the value of the sharding key. Darüber hinaus enthält jeder Shard in der Gruppe Zuordnungen, die die lokalen Sharddaten (als Shardletsbezeichnet) nachverfolgen.In addition, every shard in the set contains maps that track the local shard data (known as shardlets).

Shard-Zuordnungsverwaltung

Für die Shard-Zuordnungsverwaltung ist es unabdingbar, dass Sie die Grundlagen des Aufbaus dieser Zuordnungen verstehen.Understanding how these maps are constructed is essential to shard map management. Dies erfolgt durch die ShardMapManager-Klasse (Java, .NET) in der Clientbibliothek für elastische Datenbanken für die Verwaltung von Shardzuordnungen.This is done using the ShardMapManager class (Java, .NET, found in the Elastic Database client library to manage shard maps.

Shard-Karten und Shard-ZuordnungenShard maps and shard mappings

Für jeden Shard müssen Sie den Typ der zu erstellenden Shardzuordnung auswählen.For each shard, you must select the type of shard map to create. Die Auswahl hängt von der Architektur der Datenbank ab:The choice depends on the database architecture:

  1. Ein Mandant pro DatenbankSingle tenant per database
  2. Mehrere Mandanten pro Datenbank (zwei Typen):Multiple tenants per database (two types):
    1. ListenzuordnungList mapping
    2. BereichszuordnungRange mapping

Erstellen Sie für ein Modell mit einem einzelnen Mandanten eine Listenzuordnungs-Shardzuordnung.For a single-tenant model, create a list-mapping shard map. Beim Modell mit einem Mandanten wird eine Datenbank pro Mandant zugewiesen.The single-tenant model assigns one database per tenant. Dies ist ein effektives Modell für SaaS-Entwickler, da es die Verwaltung vereinfacht.This is an effective model for SaaS developers as it simplifies management.

Listenzuordnung

Beim Modell mit mehreren Mandanten werden einer einzelnen Datenbank mehrere Mandanten zugewiesen. Außerdem können Sie Mandantengruppen auf verschiedene Datenbanken verteilen.The multi-tenant model assigns several tenants to an individual database (and you can distribute groups of tenants across multiple databases). Verwenden Sie dieses Modell, wenn Sie erwarten, dass die einzelnen Mandanten geringe Datenanforderungen haben.Use this model when you expect each tenant to have small data needs. In diesem Modell wird einer Datenbank mithilfe der Bereichszuordnung ein Bereich von Mandanten zugewiesen.In this model, assign a range of tenants to a database using range mapping.

Bereichszuordnung

Wenn Sie einer einzelnen Datenbank mehrere Mandanten zuweisen möchten, kann das Datenbankmodell mit mehreren Mandanten auch unter Verwendung einer Listenzuordnung implementiert werden.Or you can implement a multi-tenant database model using a list mapping to assign multiple tenants to an individual database. Beispiel: DB1 wird zum Speichern von Informationen zu den Mandanten-IDs 1 und 5, DB2 zum Speichern von Daten für die Mandanten 7 und 10 verwendet.For example, DB1 is used to store information about tenant ID 1 and 5, and DB2 stores data for tenant 7 and tenant 10.

Einzeldatenbank mit mehreren Mandanten

Unterstützte Typen für ShardingschlüsselSupported types for sharding keys

Die elastische Skalierung unterstützt die folgenden Typen als Shardingschlüssel:Elastic Scale support the following types as sharding keys:

.NET.NET JavaJava
integerinteger integerinteger
langlong langlong
GUIDguid uuiduuid
Byte[]byte[] Byte[]byte[]
datetimedatetime timestamptimestamp
Zeitraumtimespan durationduration
datetimeoffsetdatetimeoffset offsetdatetimeoffsetdatetime

Listen- und Bereichs-Shard-ZuordnungenList and range shard maps

Shardzuordnungen können mit Listen von einzelnen Shardingschlüsselwerten oder mit Bereichen von Shardingschlüsselwerten erstellt werden.Shard maps can be constructed using lists of individual sharding key values, or they can be constructed using ranges of sharding key values.

ListenshardzuordnungenList shard maps

Shards enthalten Shardlets, und die Zuordnung von Shardlets zu Shards wird über eine Shardzuordnung verwaltet.Shards contain shardlets and the mapping of shardlets to shards is maintained by a shard map. Eine Listenshardzuordnung ist eine Zuordnung zwischen den einzelnen Schlüsselwerten, mit der die Shardlets und die Datenbanken identifiziert werden, die als Shards dienen.A list shard map is an association between the individual key values that identify the shardlets and the databases that serve as shards. Listenzuordnungen sind explizit. Es können der gleichen Datenbank andere Schlüsselwerte zugeordnet werden.List mappings are explicit and different key values can be mapped to the same database. Beispielsweise kann Schlüsselwert 1 Datenbank A zugeordnet sein, während die Schlüsselwerte 3 und 6 Datenbank B zugeordnet sind.For example, key value 1 maps to Database A, and key values 3 and 6 both maps to Database B.

SchlüsselKey Shard-SpeicherortShard Location
11 Datenbank_ADatabase_A
33 Datenbank_BDatabase_B
44 Datenbank_CDatabase_C
66 Datenbank_BDatabase_B
...... ......

Bereichs-Shard-ZuordnungenRange shard maps

In einer Bereichsshardzuordnung wird der Schlüsselbereich durch ein Paar [niedriger Wert, hoher Wert) beschrieben, wobei der niedrige Wert den minimalen Schlüssel in dem Bereich und der hohe Wert den ersten Wert darstellt, der höher ist als die Werte in diesem Bereich.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) enthält z.B. alle ganzen Zahlen größer oder gleich 0 und kleiner 100.For example, [0, 100) includes all integers greater than or equal 0 and less than 100. Mehrere Bereiche können auf dieselbe Datenbank verweisen, und nicht zusammenhängende Bereiche werden unterstützt (beispielsweise verweisen „[100,200)“ und „[400,600)“ im folgenden Beispiel auf Database_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.)

SchlüsselKey Shard-SpeicherortShard Location
[1,50)[1,50) Datenbank_ADatabase_A
[50,100)[50,100) Datenbank_BDatabase_B
[100,200)[100,200) Datenbank_CDatabase_C
[400,600)[400,600) Datenbank_CDatabase_C
...... ......

Jede der obigen Tabellen ist ein grundlegendes Beispiel für ein ShardMap -Objekt.Each of the tables shown above is a conceptual example of a ShardMap object. Jede Zeile ist ein vereinfachtes Beispiel für ein einzelnes PointMapping-Objekt (für die Listenshardzuordnung) oder für das RangeMapping-Objekt (für die Bereichsshardzuordnung).Each row is a simplified example of an individual PointMapping (for the list shard map) or RangeMapping (for the range shard map) object.

Shard-Zuordnungs-ManagerShard map manager

In der Clientbibliothek stellt der Shardzuordnungs-Manager eine Sammlung von Shardzuordnungen dar.In the client library, the shard map manager is a collection of shard maps. Die von einer ShardMapManager -Instanz verwalteten Daten werden an drei Orten gespeichert:The data managed by a ShardMapManager instance is kept in three places:

  1. Globale Shardzuordnung (GSM): Sie geben eine Datenbank als Repository für alle Shardzuordnungen und -mappings an.Global Shard Map (GSM): You specify a database to serve as the repository for all of its shard maps and mappings. Spezielle Tabellen und gespeicherte Prozeduren werden automatisch zur Verwaltung der Informationen erstellt.Special tables and stored procedures are automatically created to manage the information. Hierfür wird üblicherweise eine kleine Datenbank verwendet, auf die einfach zugegriffen werden kann. Diese sollte jedoch nicht für andere Anforderungen der Anwendung verwendet werden.This is typically a small database and lightly accessed, and it should not be used for other needs of the application. Die Tabellen befinden sich in einem speziellen Schema namens __ShardManagement.The tables are in a special schema named __ShardManagement.
  2. Lokale Shardzuordnung (LSM): Jede Datenbank, die Sie als Shard angeben, wird dahin gehend geändert, dass sie mehrere kleine Tabellen und spezielle gespeicherte Prozeduren enthält, die Shardzuordnungsinformationen speziell für diesen Shard enthalten und verwalten.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. Diese Informationen sind für die Informationen in der GSM redundant, jedoch kann die Anwendung die zwischengespeicherten Shardzuordnungsinformationen überprüfen, ohne dass Last auf der GSM anfällt. Die Anwendung verwendet die LSM, um festzustellen, ob eine zwischengespeicherte Zuordnung noch gültig ist.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. Die Tabellen für die LSM zu jedem Shard sind auch im Schema __ShardManagement enthalten.The tables corresponding to the LSM on each shard are also in the schema __ShardManagement.
  3. Anwendungscache: Jede Anwendungsinstanz, die Zugriff auf ein ShardMapManager-Objekt hat, verwaltet lokal einen speicherinternen Cache ihrer Zuordnungen.Application cache: Each application instance accessing a ShardMapManager object maintains a local in-memory cache of its mappings. Sie speichert die Routinginformationen, die zuletzt abgerufen wurden.It stores routing information that has recently been retrieved.

Erstellen eines ShardMapManagerConstructing a ShardMapManager

Ein ShardMapManager-Objekt wird mit einem Factorymuster (Java, .NET) erstellt.A ShardMapManager object is constructed using a factory (Java, .NET) pattern. Die ShardMapManagerFactory.GetSqlShardMapManager-Methode (Java, .NET) nimmt Anmeldeinformationen (einschließlich Server- und Datenbankname mit der GSM) in Form einer ConnectionString entgegen und gibt eine Instanz eines ShardMapManager zurück.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.

Hinweis: Das ShardMapManager-Objekt sollte innerhalb des Initialisierungscodes für eine Anwendung nur einmal pro Anwendungsdomäne instanziiert werden.Please Note: The ShardMapManager should be instantiated only once per app domain, within the initialization code for an application. Das Erstellen zusätzlicher Instanzen von ShardMapManager in derselben Anwendungsdomäne führt zu mehr Arbeitsspeicher- und CPU-Auslastung der Anwendung.Creation of additional instances of ShardMapManager in the same app domain results in increased memory and CPU utilization of the application. Ein ShardMapManager-Element kann eine beliebige Anzahl von Shardzuordnungen enthalten.A ShardMapManager can contain any number of shard maps. Während eine einzelne Shardzuordnung für viele Anwendungen ausreichend sein kann, werden in einigen Fällen unterschiedliche Sätze von Datenbanken für ein anderes Schema oder einen eindeutigen Zweck verwendet. In diesen Fällen sind möglicherweise mehrfache Shardzuordnungen vorzuziehen.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.

In diesem Code versucht eine Anwendung, ein bestehendes ShardMapManager-Element mit der TryGetSqlShardMapManager-Methode (Java, .NET) zu öffnen.In this code, an application tries to open an existing ShardMapManager with the TryGetSqlShardMapManager (Java, .NET method. Wenn Objekte, die ein globales ShardMapManager-Element darstellen, in der Datenbank noch nicht vorhanden sind, erstellt die Clientbibliothek sie dort mithilfe der CreateSqlShardMapManager-Methode (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.
}

Für die .NET-Version können Sie mit PowerShell einen neuen Shardzuordnungs-Manager erstellen.For the .NET version, you can use PowerShell to create a new Shard Map Manager. Ein Beispiel ist hierverfügbar.An example is available here.

Abrufen einer RangeShardMap oder ListShardMapGet a RangeShardMap or ListShardMap

Nach dem Erstellen eines Shardzuordnungs-Managers können Sie RangeShardMap (Java, .NET) oder ListShardMap (Java, .NET) mithilfe der Methoden TryGetRangeShardMap (Java, .NET), TryGetListShardMap (Java, .NET) oder GetShardMap (Java, .NET) abrufen.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;
}

Administratoranmeldeinformationen für Shard-ZuordnungenShard map administration credentials

Anwendungen, die Shard-Zuordnungen verwalten und bearbeiten, unterscheiden sich von jenen Anwendungen, die Shard-Zuordnungen zum Weiterleiten von Verbindungen verwenden.Applications that administer and manipulate shard maps are different from those that use the shard maps to route connections.

Zum Verwalten von Shardzuordnungen (Hinzufügen oder Ändern von Shards, Shardzuordnungen usw.) müssen Sie das ShardMapManager-Element mithilfe von Anmeldeinformationen instanziieren, die über Lese-/Schreibzugriff sowohl auf die GSM-Datenbank als auch auf die Datenbank verfügen, die als Shard fungiert.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. Die Anmeldeinformationen müssen Schreibvorgänge in Bezug auf die Tabellen sowohl in der GSM als auch in der LSM ermöglichen, wenn Shard Map-Informationen eingegeben oder geändert werden, und sie müssen außerdem das Erstellen von LSM-Tabellen auf neuen Shards erlauben.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.

Lesen Sie dazu Anmeldeinformationen für den Zugriff auf die Clientbibliothek für elastische Datenbanken.See Credentials used to access the Elastic Database client library.

Nur Metadaten betroffenOnly metadata affected

Methoden zum Auffüllen oder Ändern der ShardMapManager -Daten ändern nicht die Benutzerdaten, die in den Shards selbst gespeichert sind.Methods used for populating or changing the ShardMapManager data do not alter the user data stored in the shards themselves. Beispielsweise wirken sich Methoden wie etwa CreateShard, DeleteShard, UpdateMapping usw. nur auf die Shardzuordnungsmetadaten aus.For example, methods such as CreateShard, DeleteShard, UpdateMapping, etc. affect the shard map metadata only. nur auf die Shard-Zuordnungsmetadaten aus.They do not remove, add, or alter user data contained in the shards. Sie entfernen keine Benutzerdaten in den Shards, fügen diese hinzu oder ändern sie.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. (Das Split-Merge-Tool, das Teil der Tools für elastische Datenbanken ist, nutzt diese APIs zusammen mit der Orchestrierung der tatsächlichen Datenverschiebung zwischen den Shards.) Siehe Skalierung mit dem Split-Merge-Tool für elastische Datenbanken.(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.

Datenabhängiges RoutingData dependent routing

Der Shardzuordnungs-Manager wird in Anwendungen verwendet, die Verbindungen mit der Datenbank für App-spezifische Datenvorgänge erfordern.The shard map manager is used in applications that require database connections to perform the app-specific data operations. Diese Verbindungen müssen mit der richtigen Datenbank verknüpft sein.Those connections must be associated with the correct database. Dies wird als datenabhängiges Routingbezeichnet.This is known as Data Dependent Routing. Instanziieren Sie für diese Anwendungen ein Shard Map-Managerobjekt ab Werk mit den Anmeldeinformationen, die über schreibgeschützten Zugriff auf die GSM-Datenbank verfügen.For these applications, instantiate a shard map manager object from the factory using credentials that have read-only access on the GSM database. Bei einzelnen Anforderungen für Verbindungen werden später die für die Verbindung mit der entsprechenden Sharddatenbank erforderlichen Anmeldeinformationen zur Verfügung gestellt.Individual requests for later connections supply credentials necessary for connecting to the appropriate shard database.

Beachten Sie, dass bei diesen Anwendungen (unter Verwendung eines ShardMapManager , der mit schreibgeschützten Anmeldeinformationen geöffnet wird) keine Änderungen an den Karten oder Zuordnungen vorgenommen werden können.Note that these applications (using ShardMapManager opened with read-only credentials) cannot make changes to the maps or mappings. Erstellen Sie für diese Anforderungen administrativ-spezifische Anwendungen oder PowerShell-Skripts, die Anmeldeinformationen mit höheren Berechtigungen, wie bereits erwähnt, zur Verfügung stellen.For those needs, create administrative-specific applications or PowerShell scripts that supply higher-privileged credentials as discussed earlier. Lesen Sie dazu Anmeldeinformationen für den Zugriff auf die Clientbibliothek für elastische Datenbanken.See Credentials used to access the Elastic Database client library.

Weitere Informationen finden Sie unter Datenabhängiges Routing.For more information, see Data dependent routing.

Ändern von Shard-ZuordnungenModifying a shard map

Eine Shard Map kann auf unterschiedliche Weise geändert werden.A shard map can be changed in different ways. Sämtliche der folgenden Methoden ändern die Metadaten, die die Shards und ihre Mappings beschreiben. Sie ändern aber die Daten innerhalb der Shards weder physisch noch erstellen oder löschen sie die Datenbanken.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. Einige der Vorgänge zur unten beschriebenen Shard Map müssen möglicherweise mit den administrativen Aktionen abgestimmt werden, über welche die Daten physisch verschoben oder über welche die als Shards fungierenden Datenbanken hinzugefügt oder entfernt werden.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.

Diese Methoden arbeiten zusammen als Bausteine für die Änderung der Gesamtverteilung von Daten in der Sharded-Datenbankumgebung.These methods work together as the building blocks available for modifying the overall distribution of data in your sharded database environment.

  • Verwenden Sie zum Hinzufügen oder Entfernen von Shards CreateShard (Java, .NET) und DeleteShard (Java, .NET) aus der Shardzuordnungsklasse (Java, .NET).To add or remove shards: use CreateShard (Java, .NET) and DeleteShard (Java, .NET) of the shardmap (Java, .NET) class.

    Der Server und die Datenbank, die das Ziel-Shard repräsentieren, müssen bereits für diese auszuführenden Vorgänge vorhanden sein.The server and database representing the target shard must already exist for these operations to execute. Diese Methoden haben keine Auswirkungen auf die Datenbanken selbst, lediglich auf die Metadaten in der Shard Map.These methods do not have any impact on the databases themselves, only on metadata in the shard map.

  • Verwenden Sie zum Erstellen oder Entfernen von Punkten oder Bereichen, die den Shards zugeordnet sind, CreateRangeMapping (Java, .NET) und DeleteMapping (Java, .NET) aus der RangeShardMapping-Klasse (Java, .NET) und CreatePointMapping (Java, .NET) aus der ListShardMap-Klasse (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.

    Demselben Shard können viele verschiedene Punkte oder Bereiche zugeordnet werden.Many different points or ranges can be mapped to the same shard. Diese Methoden wirken sich nur auf Metadaten aus – sie haben keine Auswirkungen auf Daten, die bereits in Shards vorhanden sein können.These methods only affect metadata - they do not affect any data that may already be present in shards. Wenn Daten aus der Datenbank entfernt werden müssen, damit diese mit DeleteMapping-Vorgängen konsistent ist, führen Sie diese Vorgänge separat (aber im Kontext dieser Methoden) aus.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.

  • Verwenden Sie zum Unterteilen vorhandener Bereiche in zwei Teile oder zum Zusammenführen benachbarter Bereiche SplitMapping (Java, .NET) bzw. MergeMappings (Java, .NET).To split existing ranges into two, or merge adjacent ranges into one: use SplitMapping (Java, .NET) and MergeMappings (Java, .NET).

    Beachten Sie, dass Aufteilungs- und Zusammenführungsvorgänge nicht den Shard ändern, dem Schlüsselwerte zugeordnet sind.Note that split and merge operations do not change the shard to which key values are mapped. Eine Aufteilung teilt einen vorhandenen Bereich in zwei Teile, wobei beide jedoch demselben Shard zugeordnet bleiben.A split breaks an existing range into two parts, but leaves both as mapped to the same shard. Bei einer Zusammenführung werden zwei benachbarte Bereiche, die bereits demselben Shard zugeordnet sind, zu einem einzigen Bereich zusammengefügt.A merge operates on two adjacent ranges that are already mapped to the same shard, coalescing them into a single range. Das Verschieben von Punkten oder Bereichen zwischen den Shards selbst muss mit UpdateMapping in Verbindung mit der eigentlichen Datenverschiebung koordiniert werden.The movement of points or ranges themselves between shards needs to be coordinated by using UpdateMapping in conjunction with actual data movement. Sie können den Split-Merge -Dienst verwenden, der Teil der Tools für elastische Datenbanken ist, um Änderungen an Shard-Zuordnungen bei Datenverschiebungen zu koordinieren, sofern eine Verschiebung erforderlich ist.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.

  • Um einzelne Punkte oder Bereiche erneut unterschiedlichen Shards zuzuordnen (oder sie zu verschieben), verwenden Sie UpdateMapping (Java, .NET).To re-map (or move) individual points or ranges to different shards: use UpdateMapping (Java, .NET).

    Da Daten unter Umständen aus einem Shard in einen anderen verschoben werden, damit sie mit UpdateMapping-Vorgängen konsistent sind, müssen Sie diese Verschiebung separat (aber im Kontext dieser Methoden) ausführen.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.

  • Verwenden Sie zum Online- und Offlineschalten von Zuordnungen MarkMappingOffline (Java, .NET) bzw. MarkMappingOnline (Java, .NET), um den Onlinestatus einer Zuordnung zu steuern.To take mappings online and offline: use MarkMappingOffline (Java, .NET) and MarkMappingOnline (Java, .NET) to control the online state of a mapping.

    Bestimmte Vorgänge sind bei Shardzuordnungen nur dann zulässig, wenn sich die Zuordnung im Zustand „offline“ befindet, einschließlich UpdateMapping und DeleteMapping.Certain operations on shard mappings are only allowed when a mapping is in an “offline” state, including UpdateMapping and DeleteMapping. Wenn eine Zuordnung offline ist, gibt eine datenabhängige Anforderung auf Grundlage eines in dieser Zuordnung enthaltenen Schlüssels einen Fehler zurück.When a mapping is offline, a data-dependent request based on a key included in that mapping returns an error. Wenn darüber hinaus ein Bereich zuerst offline geschaltet wird, werden alle Verbindungen mit dem betroffenen Shard automatisch abgebrochen. So soll verhindert werden, dass inkonsistente oder unvollständige Ergebnisse bei Abfragen gegen jene Bereiche auftreten, die geändert werden.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.

Zuordnungen sind in .NET unveränderliche Objekte.Mappings are immutable objects in .Net. Alle oben genannten Methoden zum Ändern von Zuordnungen machen auch alle Verweise auf diese in Ihrem Code ungültig.All of the methods above that change mappings also invalidate any references to them in your code. Zur einfacheren Durchführung von Vorgangsabfolgen, die den Zustand einer Zuordnung ändern, geben alle Methoden, die eine Zuordnung ändern, einen neuen Zuordnungsverweis zurück, sodass die Vorgänge verkettet werden können.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. Um z. B. eine vorhandene Zuordnung in "shardmap sm" mit dem Schlüssel 25 zu löschen, können Sie Folgendes ausführen: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)));

Hinzufügen eines ShardsAdding a shard

Anwendungen müssen häufig neue Shards hinzufügen, um Daten zu verwalten, die von neuen Schlüsseln oder Schlüsselbereichen für eine Shardzuordnung erwartet werden, die bereits vorhanden ist.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. Eine Anwendung beispielsweise, bei der Sharding über die Mandanten-ID durchgeführt wird, muss unter Umständen einen neuen Shard für einen neuen Mandanten bereitstellen, oder Daten, bei denen das Sharding monatlich durchgeführt wird, benötigen möglicherweise einen neuen Shard, der vor dem Start eines jeweils neuen Monats bereitgestellt wird.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.

Wenn der neue Bereich von Schlüsselwerten nicht bereits Teil einer vorhandenen Zuordnung ist und keine Datenverschiebung erforderlich ist, ist es einfach, den neuen Shard hinzuzufügen und dem Shard den neuen Schlüssel oder Bereich zuzuordnen.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. Weitere Informationen zum Hinzufügen neuer Shards finden Sie unter Hinzufügen eines neuen Shards.For details on adding new shards, see Adding a new shard.

Bei Szenarios, die eine Datenverschiebung erforderlich machen, wird jedoch das Split-Merge-Tool benötigt, um die Datenverschiebung zwischen Shards in Kombination mit den erforderlichen Shard-Zuordnungsaktualisierungen zu koordinieren.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. Weitere Informationen zur Verwendung des Split-Merge-Tools finden Sie unter Übersicht über Split-MergeFor details on using the split-merge tool, see Overview of split-merge

Zusätzliche RessourcenAdditional resources

Verwenden Sie noch keine elastischen Datenbanktools?Not using elastic database tools yet? Sehen Sie sich unseren Leitfaden zu den ersten Schritten an.Check out our Getting Started Guide. Bei Fragen erreichen Sie uns im Forum für SQL-Datenbank, Featureanforderungen können Sie im Feedbackforum für SQL-Datenbank einreichen.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.