Migrowanie kontenerów niepartycjonowanych do kontenerów podzielonych na partycje
DOTYCZY: NoSQL
Usługa Azure Cosmos DB obsługuje tworzenie kontenerów bez klucza partycji. Obecnie kontenery niepartycyjne można tworzyć przy użyciu interfejsu wiersza polecenia platformy Azure i zestawów SDK usługi Azure Cosmos DB (.NET, Java, NodeJs), które mają wersję mniejszą lub równą 2.x. Nie można tworzyć kontenerów bez partycji przy użyciu Azure Portal. Jednak takie kontenery niepartycyjne nie są elastyczne i mają stałą pojemność magazynu wynoszącą 20 GB i limit przepływności wynoszący 10 000 RU/s.
Kontenery niepartycyjne są starsze i należy przeprowadzić migrację istniejących kontenerów bez partycji do kontenerów podzielonych na partycje w celu skalowania magazynu i przepływności. Usługa Azure Cosmos DB udostępnia mechanizm zdefiniowany przez system do migrowania kontenerów bez partycji do kontenerów podzielonych na partycje. W tym dokumencie wyjaśniono, jak wszystkie istniejące kontenery niepartycyjne są automatycznie migrowane do kontenerów podzielonych na partycje. Możesz korzystać z funkcji automatycznej migracji tylko wtedy, gdy używasz wersji 3 zestawów SDK we wszystkich językach.
Uwaga
Obecnie nie można migrować bazy danych MongoDB i interfejsu API usługi Azure Cosmos DB dla kont gremlin, wykonując kroki opisane w tym dokumencie.
Migrowanie kontenera przy użyciu klucza partycji zdefiniowanego przez system
Aby zapewnić obsługę migracji, usługa Azure Cosmos DB udostępnia zdefiniowany przez system klucz partycji o nazwie /_partitionkey
na wszystkich kontenerach, które nie mają klucza partycji. Nie można zmienić definicji klucza partycji po przeprowadzeniu migracji kontenerów. Na przykład definicja kontenera migrowanego do kontenera podzielonego na partycje będzie następująca:
{
"Id": "CollId"
"partitionKey": {
"paths": [
"/_partitionKey"
],
"kind": "Hash"
},
}
Po zmigrowaniu kontenera można tworzyć dokumenty, wypełniając _partitionKey
właściwość wraz z innymi właściwościami dokumentu. Właściwość _partitionKey
reprezentuje klucz partycji dokumentów.
Wybranie odpowiedniego klucza partycji jest ważne, aby optymalnie wykorzystać aprowizowaną przepływność. Aby uzyskać więcej informacji, zobacz artykuł dotyczący wybierania klucza partycji .
Uwaga
Można korzystać z klucza partycji zdefiniowanego przez system tylko wtedy, gdy używasz najnowszej/3 wersji zestawów SDK we wszystkich językach.
W poniższym przykładzie pokazano przykładowy kod umożliwiający utworzenie dokumentu przy użyciu klucza partycji zdefiniowanego przez system i odczytanie tego dokumentu:
Reprezentacja JSON dokumentu
DeviceInformationItem = new DeviceInformationItem
{
"id": "elevator/PugetSound/Building44/Floor1/1",
"deviceId": "3cf4c52d-cc67-4bb8-b02f-f6185007a808",
"_partitionKey": "3cf4c52d-cc67-4bb8-b02f-f6185007a808"
}
public class DeviceInformationItem
{
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
[JsonProperty(PropertyName = "deviceId")]
public string DeviceId { get; set; }
[JsonProperty(PropertyName = "_partitionKey", NullValueHandling = NullValueHandling.Ignore)]
public string PartitionKey { get {return this.DeviceId; set; }
}
CosmosContainer migratedContainer = database.Containers["testContainer"];
DeviceInformationItem deviceItem = new DeviceInformationItem() {
Id = "1234",
DeviceId = "3cf4c52d-cc67-4bb8-b02f-f6185007a808"
}
ItemResponse<DeviceInformationItem > response =
await migratedContainer.CreateItemAsync<DeviceInformationItem>(
deviceItem.PartitionKey,
deviceItem
);
// Read back the document providing the same partition key
ItemResponse<DeviceInformationItem> readResponse =
await migratedContainer.ReadItemAsync<DeviceInformationItem>(
partitionKey: deviceItem.PartitionKey,
id: device.Id
);
Pełny przykład można znaleźć w repozytorium GitHub przykładów dla platformy .NET .
Migrowanie dokumentów
Chociaż definicja kontenera jest rozszerzona o właściwość klucza partycji, dokumenty w kontenerze nie są migrowane automatycznie. Oznacza to, że ścieżka właściwości /_partitionKey
klucza partycji systemowej nie jest automatycznie dodawana do istniejących dokumentów. Aby ponownie podzielić istniejące dokumenty, należy odczytać dokumenty utworzone bez klucza partycji i zapisać je ponownie za pomocą _partitionKey
właściwości w dokumentach.
Uzyskiwanie dostępu do dokumentów, które nie mają klucza partycji
Aplikacje mogą uzyskiwać dostęp do istniejących dokumentów, które nie mają klucza partycji przy użyciu specjalnej właściwości systemowej o nazwie "PartitionKey.None", jest to wartość dokumentów niemigrowanych. Tej właściwości można używać we wszystkich operacjach CRUD i zapytań. W poniższym przykładzie pokazano przykład odczytu pojedynczego dokumentu z elementu NonePartitionKey.
CosmosItemResponse<DeviceInformationItem> readResponse =
await migratedContainer.Items.ReadItemAsync<DeviceInformationItem>(
partitionKey: PartitionKey.None,
id: device.Id
);
Zgodność z zestawami SDK
Starsza wersja zestawów SDK usługi Azure Cosmos DB, takich jak V2.x.x i V1.x.x, nie obsługuje właściwości klucza partycji zdefiniowanego przez system. Dlatego podczas odczytywania definicji kontenera ze starszego zestawu SDK nie zawiera ona żadnej definicji klucza partycji, a te kontenery będą zachowywać się dokładnie tak jak wcześniej. Aplikacje, które są kompilowane przy użyciu starszej wersji zestawów SDK, nadal działają bez żadnych zmian.
Jeśli zmigrowany kontener jest używany przez najnowszą/3 wersję zestawu SDK i rozpoczynasz wypełnianie klucza partycji zdefiniowanego przez system w nowych dokumentach, nie możesz już uzyskać dostępu (do odczytu, aktualizacji, usuwania, wykonywania zapytań) takich dokumentów ze starszych zestawów SDK.
Znane problemy
Wykonywanie zapytań dotyczących liczby elementów wstawionych bez klucza partycji przy użyciu zestawu SDK w wersji 3 może wiązać się z większym użyciem przepływności
Jeśli wykonujesz zapytanie z zestawu SDK w wersji 3 dla elementów wstawionych przy użyciu zestawu SDK w wersji 2 lub elementów wstawionych przy użyciu zestawu SDK w wersji 3 z parametrem PartitionKey.None
, zapytanie count może zużywać więcej jednostek RU/s, jeśli PartitionKey.None
parametr jest podany w elemecie FeedOptions. Zalecamy, aby nie podawać parametru PartitionKey.None
, jeśli żadne inne elementy nie zostaną wstawione z kluczem partycji.
Jeśli nowe elementy zostaną wstawione z różnymi wartościami klucza partycji, wykonywanie zapytań o takie liczby elementów przez przekazanie odpowiedniego klucza w elemencie FeedOptions
nie będzie miało żadnych problemów. Po wstawieniu nowych dokumentów z kluczem partycji, jeśli musisz wykonać zapytanie tylko o liczbę dokumentów bez wartości klucza partycji, to zapytanie może ponownie spowodować wyższe jednostki RU/s podobne do zwykłych kolekcji partycjonowanych.
Następne kroki
- Partitioning in Azure Cosmos DB (Partycjonowanie w usłudze Azure Cosmos DB)
- Jednostki żądania w usłudze Azure Cosmos DB
- Aprowizacja przepływności kontenerów i baz danych
- Praca z kontem usługi Azure Cosmos DB
- Próbujesz zaplanować pojemność migracji do usługi Azure Cosmos DB?
- Jeśli wiesz, ile rdzeni wirtualnych i serwerów znajduje się w istniejącym klastrze bazy danych, przeczytaj o szacowaniu jednostek żądań przy użyciu rdzeni wirtualnych lub procesorów wirtualnych
- Jeśli znasz typowe stawki żądań dla bieżącego obciążenia bazy danych, przeczytaj o szacowaniu jednostek żądań przy użyciu planisty pojemności usługi Azure Cosmos DB