Share via


Nem particionált tárolók migrálása particionált tárolókba

A KÖVETKEZŐRE VONATKOZIK: NoSQL

Az Azure Cosmos DB támogatja a tárolók partíciókulcs nélküli létrehozását. Jelenleg nem particionált tárolókat hozhat létre az Azure CLI és az Azure Cosmos DB SDK-k (.NET, Java, NodeJs) használatával, amelyek 2.x-nél kisebb vagy annál kisebb verziójúak. Nem particionált tárolók nem hozhatók létre a Azure Portal használatával. Az ilyen nem particionált tárolók azonban nem rugalmasak, és rögzített tárolókapacitásuk 20 GB, átviteli sebességük pedig 10 000 RU/s.

A nem particionált tárolók örököltek, és a meglévő nem particionált tárolókat particionált tárolókba kell migrálni a tároló és az átviteli sebesség skálázásához. Az Azure Cosmos DB rendszeralapú mechanizmust biztosít a nem particionált tárolók particionált tárolókba való migrálásához. Ez a dokumentum azt ismerteti, hogy az összes meglévő nem particionált tároló automatikusan migrálva lesz particionált tárolókba. Az automatikus migrálási funkciót csak akkor használhatja, ha az SDK-k V3 verzióját használja az összes nyelven.

Megjegyzés

Jelenleg nem migrálhatja a Gremlin-fiókokhoz készült Azure Cosmos DB MongoDB-t és API-t a jelen dokumentumban leírt lépések végrehajtásával.

Tároló migrálása a rendszer által definiált partíciókulcs használatával

A migrálás támogatásához az Azure Cosmos DB egy nevű, rendszer által definiált partíciókulcsot /_partitionkey biztosít az összes olyan tárolón, amely nem rendelkezik partíciókulcstal. A tárolók migrálása után nem módosítható a partíciókulcs definíciója. A particionált tárolóba migrált tároló definíciója például a következő lesz:

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

A tároló migrálása után dokumentumokat hozhat létre a _partitionKey tulajdonság és a dokumentum egyéb tulajdonságainak feltöltésével. A _partitionKey tulajdonság a dokumentumok partíciókulcsát jelöli.

A megfelelő partíciókulcs kiválasztása fontos a kiosztott átviteli sebesség optimális kihasználásához. További információt a partíciókulcs kiválasztásáról szóló cikkben talál.

Megjegyzés

A rendszer által definiált partíciókulcsot csak akkor használhatja ki, ha az SDK-k legújabb/V3 verzióját használja az összes nyelven.

Az alábbi példa egy mintakódot mutat be, amely létrehoz egy dokumentumot a rendszer által definiált partíciókulccsal, és beolvassa a dokumentumot:

A dokumentum JSON-ábrázolása

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

A teljes mintát a .NET-minták GitHub-adattárában találja.

A dokumentumok migrálása

Bár a tárolódefiníció egy partíciókulcs-tulajdonsággal van bővítve, a tárolóban lévő dokumentumok nem lesznek automatikusan migrálva. Ez azt jelenti, hogy a rendszerpartíciókulcs tulajdonságútvonala /_partitionKey nem lesz automatikusan hozzáadva a meglévő dokumentumokhoz. A meglévő dokumentumok újraparticionálásához olvassa el a partíciókulcs nélkül létrehozott dokumentumokat, majd írja vissza őket a dokumentumokban lévő tulajdonsággal _partitionKey .

Olyan dokumentumok elérése, amelyek nem rendelkeznek partíciókulcsokkal

Az alkalmazások a "PartitionKey.None" nevű speciális rendszertulajdonság használatával érhetik el a partíciókulcsot nem tartalmazó meglévő dokumentumokat. Ez a nem migrált dokumentumok értéke. Ezt a tulajdonságot az összes CRUD- és lekérdezési műveletben használhatja. Az alábbi példa egy olyan mintát mutat be, amely egyetlen dokumentumot olvas be a NonePartitionKey elemből.

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

Kompatibilitás SDK-kkal

Az Azure Cosmos DB SDK-k régebbi verziói, például a V2.x.x és a V1.x.x nem támogatják a rendszer által definiált partíciókulcs-tulajdonságot. Ha tehát egy régebbi SDK-ból olvassa be a tárolódefiníciót, az nem tartalmaz partíciókulcs-definíciót, és ezek a tárolók pontosan ugyanúgy fognak viselkedni, mint korábban. Az SDK-k régebbi verziójával készült alkalmazások továbbra is nem particionáltakkal működnek, ahogyan a módosítások nélkül is.

Ha egy migrált tárolót az SDK legújabb/V3 verziója használ, és elkezdi felemészteni a rendszer által definiált partíciókulcsot az új dokumentumokban, többé nem érheti el (olvasás, frissítés, törlés, lekérdezés) az ilyen dokumentumokat a régebbi SDK-kból.

Ismert problémák

A partíciókulcs nélkül beszúrt elemek számának lekérdezése v3 SDK használatával nagyobb átviteli sebességet igényelhet

Ha a V3 SDK-ból kérdezi le a V2 SDK-val beszúrt elemeket, vagy a V3 SDK paraméterrel PartitionKey.None beszúrt elemeket, a számláló lekérdezés több RU/s-t használhat, ha a PartitionKey.None paraméter a FeedOptionsban van megadva. Azt javasoljuk, hogy ne adja meg a PartitionKey.None paramétert, ha más elemek nincsenek beszúrva partíciókulccsal.

Ha a partíciókulcshoz különböző értékeket tartalmazó új elemek vannak beszúrva, az ilyen elemek számának lekérdezése a megfelelő kulcs FeedOptions átadásával nem okoz problémát. Ha új dokumentumokat szúr be partíciókulccsal, ha csak a dokumentumszámot kell lekérdeznie a partíciókulcs értéke nélkül, akkor a lekérdezés a szokásos particionált gyűjteményekhez hasonló ru/s értéket eredményezhet.

Következő lépések