Bagikan melalui


Lampiran Azure Cosmos DB

BERLAKU UNTUK: Nosql MongoDB

Lampiran Azure Cosmos DB adalah item khusus yang berisi referensi ke metadata yang terhubung dengan blob eksternal atau file media.

Azure Cosmos DB mendukung dua jenis lampiran:

  • Lampiran tidak terkelola adalah pembungkus di sekitar referensi URI ke blob yang disimpan dalam layanan eksternal (misalnya, Azure Storage, OneDrive, dll.). Pendekatan ini mirip dengan menyimpan properti URI dalam item Azure Cosmos DB standar.
  • Lampiran Terkelola merupakan blob yang dikelola dan disimpan secara internal oleh Azure Cosmos DB dan diekspos melalui mediaLink yang dihasilkan sistem.

Catatan

Lampiran adalah fitur warisan. Dukungan mereka meliputi penaran fungsionalitas berkelanjutan jika Anda sudah menggunakan fitur ini.

Alih-alih menggunakan lampiran, kami sarankan Anda untuk menggunakan Azure Blob Storage sebagai layanan penyimpanan blob yang dibuat khusus untuk menyimpan data blob. Anda dapat terus menyimpan metadata yang terkait dengan blob bersama dengan tautan URI referensi di Azure Cosmos DB sebagai properti item. Menyimpan data ini di Azure Cosmos DB menyediakan kemampuan untuk mengkueri metadata dan tautan ke blob yang disimpan di Azure Blob Storage.

Microsoft berkomitmen untuk memberikan pemberitahuan minimal 36 bulan sebelum lampiran sepenuhnya tidak digunakan lagi - yang akan diumumkan pada tanggal lebih lanjut.

Batasan yang dikertahui

Lampiran terkelola Azure Cosmos DB berbeda dari dukungannya untuk item standar - yang menawarkan skalabilitas tak terbatas, distribusi global, dan integrasi dengan layanan Azure lainnya.

  • Lampiran tidak didukung di semua versi SDK Azure Cosmos DB.
  • Lampiran terkelola dibatasi hingga 2 GB penyimpanan per akun database.
  • Lampiran terkelola tidak kompatibel dengan distribusi global Azure Cosmos DB dan tidak direplikasi di seluruh wilayah.

Catatan

Azure Cosmos DB untuk MongoDB versi 3.2 menggunakan lampiran terkelola untuk GridFS dan ini tunduk pada batasan yang sama.

Kami merekomendasikan pengembang yang menggunakan set fitur MongoDB GridFS untuk meningkatkan ke Azure Cosmos DB untuk MongoDB versi 3.6 atau yang lebih tinggi, yang dipisahkan dari lampiran dan memberikan pengalaman yang lebih baik. Atau, pengembang yang menggunakan set fitur MongoDB GridFS juga harus mempertimbangkan menggunakan Azure Blob Storage - yang dibuat khusus untuk menyimpan konten blob dan menawarkan fungsionalitas yang diperluas dengan biaya lebih rendah dibandingkan dengan GridFS.

Migrasi Lampiran ke Azure Blob Storage

Sebaiknya migrasi lampiran Azure Cosmos DB ke Azure Blob Storage dengan mengikuti langkah-langkah berikut:

  1. Salin data lampiran dari kontainer Azure Cosmos DB sumber Anda ke kontainer Azure Blob Storage target Anda.
  2. Validasi data blob yang diunggah di kontainer Azure Blob Storage target.
  3. Jika berlaku, tambahkan referensi URI ke blob yang terkandung dalam Azure Blob Storage sebagai properti string dalam set data Azure Cosmos DB Anda.
  4. Konfigurasi ulang kode aplikasi Anda untuk membaca dan menulis blob dari kontainer Azure Blob Storage yang baru.

Sampel kode berikut menunjukkan cara menyalin lampiran dari Azure Cosmos DB ke penyimpanan Azure Blob sebagai bagian dari alur migrasi dengan menggunakan .NET SDK v2 Azure Cosmos DB dan Azure Blob Storage .NET SDK v12. Pastikan untuk mengganti <placeholder values> untuk akun Azure Cosmos DB sumber dan menargetkan kontainer Azure Blob Storage.


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

Langkah berikutnya