Megosztás a következőn keresztül:


Azure Cosmos DB-mellékletek

A KÖVETKEZŐKRE VONATKOZIK: NoSQL MongoDB

Az Azure Cosmos DB-mellékletek olyan speciális elemek, amelyek külső blob- vagy médiafájllal társított metaadatokra mutató hivatkozásokat tartalmaznak.

Az Azure Cosmos DB kétféle mellékletet támogat:

  • A nem felügyelt mellékletek egy külső szolgáltatásban (például Azure Storage, OneDrive stb.) tárolt blobra mutató URI-hivatkozás burkolói. Ez a megközelítés hasonlít egy URI-tulajdonság standard Azure Cosmos DB-elemben való tárolásához.
  • A felügyelt mellékletek az Azure Cosmos DB által belsőleg felügyelt és tárolt blobok , amelyek egy rendszer által létrehozott mediaLinken keresztül érhetők el.

Feljegyzés

A mellékletek régi funkciók. Ha már használja ezt a funkciót, a támogatás hatóköre a folyamatos működésre terjed ki.

A mellékletek használata helyett azt javasoljuk, hogy az Azure Blob Storage-t használja célalapú blobtároló szolgáltatásként a blobadatok tárolására. Az Azure Cosmos DB-ben továbbra is tárolhatja a blobokhoz kapcsolódó metaadatokat, valamint hivatkozási URI-hivatkozásokat elemtulajdonságként. Az adatok Azure Cosmos DB-ben való tárolása lehetővé teszi az Azure Blob Storage-ban tárolt blobok metaadatainak és hivatkozásainak lekérdezését.

A Microsoft elkötelezte magát amellett, hogy legalább 36 hónapos értesítést küld a mellékletek teljes elavulása előtt, amelyet egy későbbi időpontban jelentünk be.

Ismert korlátozások

Az Azure Cosmos DB felügyelt mellékletei eltérnek a standard elemek támogatásától, amelyekhez korlátlan skálázhatóságot, globális terjesztést és integrációt kínál más Azure-szolgáltatásokkal.

  • A mellékletek nem támogatottak az Azure Cosmos DB SDK-k minden verziójában.
  • A felügyelt mellékletek adatbázisfiókonként legfeljebb 2 GB tárterületet képesek tárolni.
  • A felügyelt mellékletek nem kompatibilisek az Azure Cosmos DB globális disztribúciójával, és nem replikálódnak régiók között.

Feljegyzés

A MongoDB 3.2-es verziójához készült Azure Cosmos DB felügyelt mellékleteket használ a GridFS-hez, és ezekre ugyanazok a korlátozások vonatkoznak.

Javasoljuk, hogy a MongoDB GridFS szolgáltatáskészletet használó fejlesztők frissítsenek a MongoDB 3.6-os vagy újabb verziójára az Azure Cosmos DB-re, amely leválasztva van a mellékletektől, és jobb élményt nyújt. Másik lehetőségként a MongoDB GridFS szolgáltatáskészletet használó fejlesztőknek érdemes megfontolni az Azure Blob Storage használatát is , amely a blobtartalmak tárolására szolgál, és a GridFS-hez képest alacsonyabb költséggel kínál bővített funkciókat.

Mellékletek migrálása az Azure Blob Storage-ba

Javasoljuk, hogy az Alábbi lépések végrehajtásával migrálja az Azure Cosmos DB-mellékleteket az Azure Blob Storage-ba:

  1. Másolja a mellékletadatokat a forrás Azure Cosmos DB-tárolóból a cél Azure Blob Storage-tárolóba.
  2. Ellenőrizze a feltöltött blobadatokat a cél Azure Blob Storage-tárolóban.
  3. Ha alkalmazható, adjon hozzá URI-hivatkozásokat az Azure Blob Storage-ban található blobokra sztringtulajdonságként az Azure Cosmos DB-adathalmazban.
  4. Az alkalmazás kódjának újrabontása blobok olvasásához és írásához az új Azure Blob Storage-tárolóból.

Az alábbi kódminta bemutatja, hogyan másolhat mellékleteket az Azure Cosmos DB-ből az Azure Blob Storage-ba a migrálási folyamat részeként az Azure Cosmos DB .NET SDK v2 és az Azure Blob Storage .NET SDK v12 használatával. Győződjön meg arról, hogy lecseréli a <placeholder values> forrás Azure Cosmos DB-fiókra, és megcélozza az Azure Blob Storage-tárolót.


using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;

namespace attachments
{
    class Program
    {
        private static string cosmosAccount = "<Your_Azure_Cosmos_account_URI>";
        private static string cosmosKey = "<Your_Azure_Cosmos_account_PRIMARY_KEY>";
        private static string cosmosDatabaseName = "<Your_Azure_Cosmos_database>";
        private static string cosmosCollectionName = "<Your_Azure_Cosmos_collection>";
        private static string storageConnectionString = "<Your_Azure_Storage_connection_string>";
        private static string storageContainerName = "<Your_Azure_Storage_container_name>";
        private static DocumentClient cosmosClient = new DocumentClient(new Uri(cosmosAccount), cosmosKey);
        private static BlobServiceClient storageClient = new BlobServiceClient(storageConnectionString);
        private static BlobContainerClient storageContainerClient = storageClient.GetBlobContainerClient(storageContainerName);

        static void Main(string[] args)
        {
            CopyAttachmentsToBlobsAsync().Wait();
        }

        private async static Task CopyAttachmentsToBlobsAsync()
        {
            Console.WriteLine("Copying Azure Cosmos DB Attachments to Azure Blob Storage ...");

            int totalCount = 0;
            string docContinuation = null;

            // Iterate through each item (document in v2) in the Azure Cosmos DB container (collection in v2) to look for attachments.
            do
            {
                FeedResponse<dynamic> response = await cosmosClient.ReadDocumentFeedAsync(
                    UriFactory.CreateDocumentCollectionUri(cosmosDatabaseName, cosmosCollectionName),
                    new FeedOptions
                    {
                        MaxItemCount = -1,
                        RequestContinuation = docContinuation
                    });
                docContinuation = response.ResponseContinuation;

                foreach (Document document in response)
                {
                    string attachmentContinuation = null;
                    PartitionKey docPartitionKey = new PartitionKey(document.Id);

                    // Iterate through each attachment within the item (if any).
                    do
                    {
                        FeedResponse<Attachment> attachments = await cosmosClient.ReadAttachmentFeedAsync(
                            document.SelfLink,
                            new FeedOptions
                            {
                                PartitionKey = docPartitionKey,
                                RequestContinuation = attachmentContinuation
                            }
                        );
                        attachmentContinuation = attachments.ResponseContinuation;

                        foreach (var attachment in attachments)
                        {
                            // Download the attachment in to local memory.
                            MediaResponse content = await cosmosClient.ReadMediaAsync(attachment.MediaLink);

                            byte[] buffer = new byte[content.ContentLength];
                            await content.Media.ReadAsync(buffer, 0, buffer.Length);

                            // Upload the locally buffered attachment to blob storage
                            string blobId = String.Concat(document.Id, "-", attachment.Id);

                            Azure.Response<BlobContentInfo> uploadedBob = await storageContainerClient.GetBlobClient(blobId).UploadAsync(
                                new MemoryStream(buffer, writable: false),
                                true
                            );

                            Console.WriteLine("Copied attachment ... Item Id: {0} , Attachment Id: {1}, Blob Id: {2}", document.Id, attachment.Id, blobId);
                            totalCount++;

                            // Clean up attachment from Azure Cosmos DB.
                            // Warning: please verify you've succesfully migrated attachments to blog storage prior to cleaning up Azure Cosmos DB.
                            // await cosmosClient.DeleteAttachmentAsync(
                            //     attachment.SelfLink,
                            //     new RequestOptions { PartitionKey = docPartitionKey }
                            // );

                            // Console.WriteLine("Cleaned up attachment ... Document Id: {0} , Attachment Id: {1}", document.Id, attachment.Id);
                        }

                    } while (!string.IsNullOrEmpty(attachmentContinuation));
                }
            }
            while (!string.IsNullOrEmpty(docContinuation));

            Console.WriteLine("Finished copying {0} attachments to blob storage", totalCount);
        }
    }
}

Következő lépések

  • Az Azure Blob Storage használatának első lépései
  • Hivatkozások lekérése mellékletek használatához az Azure Cosmos DB .NET SDK v2-en keresztül
  • Hivatkozások lekérése mellékletek használatához az Azure Cosmos DB Java SDK v2-en keresztül
  • Hivatkozások lekérése mellékletek használatához az Azure Cosmos DB REST API-ján keresztül