Sdílet prostřednictvím


Migrace nesouvisených kontejnerů na dělené kontejnery

PLATÍ PRO: NoSQL

Azure Cosmos DB podporuje vytváření kontejnerů bez klíče oddílu. V současné době můžete vytvářet nedílené kontejnery pomocí Azure CLI a sad SDK služby Azure Cosmos DB (.NET, Java, NodeJs), které mají verzi menší nebo rovnou 2.x. Kontejnery, které nejsou oddílů, nemůžete vytvářet pomocí webu Azure Portal. Takové nedílné kontejnery ale nejsou elastické a mají pevnou kapacitu úložiště 20 GB a limit propustnosti 10 tisíc RU/s.

Kontejnery, které nejsou rozdělené do oddílů, jsou starší a měli byste migrovat existující kontejnery, které nejsou rozdělené do oddílů, abyste mohli škálovat úložiště a propustnost. Azure Cosmos DB poskytuje systémově definovaný mechanismus pro migraci nedělených kontejnerů do dělených kontejnerů. Tento dokument vysvětluje, jak se všechny existující kontejnery, které nejsou rozdělené, automaticky migrují do dělených kontejnerů. Funkci automatické migrace můžete využít jenom v případě, že používáte sady SDK verze 3 ve všech jazycích.

Poznámka:

V současné době nemůžete migrovat účty MongoDB a api služby Azure Cosmos DB pro účty Gremlin pomocí kroků popsaných v tomto dokumentu.

Migrace kontejneru pomocí systémového definovaného klíče oddílu

Pro podporu migrace poskytuje Azure Cosmos DB systémový definovaný klíč oddílu pojmenovaný /_partitionkey ve všech kontejnerech, které nemají klíč oddílu. Po migraci kontejnerů nemůžete změnit definici klíče oddílu. Například definice kontejneru, který se migruje do děleného kontejneru, bude následující:

{
    "Id": "CollId"
  "partitionKey": {
    "paths": [
      "/_partitionKey"
    ],
    "kind": "Hash"
  },
}

Po migraci kontejneru můžete vytvořit dokumenty vyplněním _partitionKey vlastnosti spolu s dalšími vlastnostmi dokumentu. Vlastnost _partitionKey představuje klíč oddílu dokumentů.

Volba správného klíče oddílu je důležitá pro optimální využití zřízené propustnosti. Další informace najdete v článku o výběru klíče oddílu.

Poznámka:

Klíč oddílu definovaný systémem můžete využít pouze v případě, že ve všech jazycích používáte nejnovější nebo V3 verzi sad SDK.

Následující příklad ukazuje ukázkový kód pro vytvoření dokumentu se systémem definovaným klíčem oddílu a přečtením tohoto dokumentu:

Reprezentace dokumentu ve formátu JSON

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
  );

Kompletní ukázku najdete v úložišti GitHub s ukázkami .NET.

Migrace dokumentů

I když je definice kontejneru vylepšena vlastností klíče oddílu, dokumenty v rámci kontejneru se automaticky nemigrují. To znamená, že cesta vlastnosti /_partitionKey klíče systémového oddílu se automaticky nepřidá do existujících dokumentů. Existující dokumenty je potřeba znovu rozdělit tak, že si přečtete dokumenty, které byly vytvořeny bez klíče oddílu, a přepíšete je zpět _partitionKey vlastností v dokumentech.

Přístup k dokumentům, které nemají klíč oddílu

Aplikace mají přístup k existujícím dokumentům, které nemají klíč oddílu, pomocí speciální systémové vlastnosti s názvem PartitionKey.None, což je hodnota nemigrovaných dokumentů. Tuto vlastnost můžete použít ve všech operacích CRUD a dotazů. Následující příklad ukazuje ukázku pro čtení jednoho dokumentu z NonePartitionKey.

CosmosItemResponse<DeviceInformationItem> readResponse =
await migratedContainer.Items.ReadItemAsync<DeviceInformationItem>(
  partitionKey: PartitionKey.None,
  id: device.Id
);

Kompatibilita se sadami SDK

Starší verze sad SDK služby Azure Cosmos DB, jako jsou V2.x.x a V1.x.x, nepodporují vlastnost klíče oddílu definované systémem. Při čtení definice kontejneru ze starší sady SDK tedy neobsahuje žádnou definici klíče oddílu a tyto kontejnery se budou chovat stejně jako předtím. Aplikace vytvořené pomocí starší verze sad SDK nadále pracují s nedílnými částmi, jak je beze změn.

Pokud migrovaný kontejner využívá nejnovější nebo V3 verze sady SDK a začnete v nových dokumentech naplňovat systémový definovaný klíč oddílu, nebudete mít k těmto dokumentům přístup (čtení, aktualizace, odstranění, dotazování) těchto dokumentů ze starších sad SDK.

Známé problémy

Dotazování na počet položek, které byly vloženy bez klíče oddílu pomocí sady SDK V3, může zahrnovat vyšší spotřebu propustnosti.

Pokud se dotazujete ze sady SDK V3 pro položky vložené pomocí sady SDK V2 nebo položek vložených pomocí sady SDK V3 s parametrem PartitionKey.None , může dotaz počtu spotřebovávat více RU/s, pokud PartitionKey.None je parametr zadaný v FeedOptions. Pokud nejsou vložené žádné další položky s klíčem oddílu PartitionKey.None , doporučujeme parametr nezadávat.

Pokud jsou nové položky vloženy s různými hodnotami klíče oddílu, dotazování na tyto počty položek předáním příslušného klíče FeedOptions nebude mít žádné problémy. Pokud po vložení nových dokumentů s klíčem oddílu potřebujete dotazovat pouze počet dokumentů bez hodnoty klíče oddílu, může tento dotaz znovu mít vyšší počet RU/s podobný běžným děleným kolekcím.

Další kroky