2011-12-20 43 views
20

पर संग्रहण डेटा की प्रतिलिपि बनाना मैं एक Azure संग्रहण खाते से दूसरे में एक बहुत बड़ा स्टोरेज कंटेनर कॉपी करना चाहता हूं (जो कि अन्य सदस्यता में भी होता है)।एक Azure खाते से दूसरे

मैं इन विकल्पों पर एक राय चाहते हैं:

  1. एक उपकरण है कि दोनों भंडारण खातों से कनेक्ट होता लिखें और धब्बे CloudBlob के DownloadToStream() और UploadFromStream() का उपयोग कर एक समय में एक कॉपी। यह सबसे खराब विकल्प प्रतीत होता है क्योंकि डेटा को स्थानांतरित करते समय लागतें लगती हैं और यह भी धीमी होती है क्योंकि डेटा को मशीन चलाने के लिए मशीन पर आना होगा और फिर Azure पर फिर से अपलोड करना होगा।

  2. ऐसा करने के लिए एक कार्यकर्ता भूमिका लिखें - यह सैद्धांतिक रूप से तेज़ होना चाहिए और किसी भी कीमत का खर्च नहीं करना चाहिए। हालांकि, यह और अधिक काम है।

  3. कार्यकर्ता भूमिका परिनियोजन को छोड़कर चलने वाले उदाहरण में टूल अपलोड करें और उदाहरण को पुनर्नवीनीकरण/रीसेट करने से पहले उपकरण समाप्त करने के लिए प्रार्थना करें।

  4. एक मौजूदा उपकरण का उपयोग करें - कुछ भी दिलचस्प नहीं मिला है।

दृष्टिकोण पर कोई सुझाव?

अद्यतन: मैं सिर्फ 7 वीं जुलाई, 2012 या बाद में बनाई गई सभी भंडारण खातों के लिए (बाकी एपीआई केवल अब के लिए) को पता चला कि इस कार्यक्षमता अंत में शुरू किया गया है:

http://msdn.microsoft.com/en-us/library/windowsazure/dd894037.aspx

+0

[Azure संग्रहण Synctool] (http://azurestoragesynctool.powerybase.com/) की कोशिश करो। – DominiqueBal

+0

Azure Storage Synctool थोड़ा कच्चा है - केवल स्टोरेज-टू-लोकल का समर्थन करता है (जिसका अर्थ है कि मुझे इसे दो चरणों में करने की आवश्यकता होगी, पहले मेरा पूरा कंटेनर डाउनलोड करें और फिर इसे फिर से अपलोड करें, जो एक बड़ा सौदा नहीं है) और ज्यादातर, यह फिर से शुरू नहीं होता है - यह एक समस्या का थोड़ा सा हो सकता है। होमग्राउन समाधान हमने बिल्डिंग समाप्त कर दी है (यह वास्तव में आसान था) फिर से शुरू करने का समर्थन करता है, स्टोरेज-टू-स्टोरेज करता है और उसी खाते पर ऐसा करने पर CopyFromBlob का उपयोग करता है। –

उत्तर

9

वहाँ के बाद से एक स्टोरेज खाते से दूसरे डेटा में माइग्रेट करने का कोई सीधा तरीका नहीं है, आपको कुछ ऐसा करने की ज़रूरत होगी जो आप सोच रहे थे। यदि यह एक ही डेटा सेंटर के भीतर है, तो विकल्प # 2 सबसे अच्छा शर्त है, और सबसे तेज़ होगा (विशेष रूप से यदि आप एक्सएल इंस्टेंस का उपयोग करते हैं, तो आपको अधिक नेटवर्क बैंडविड्थ देते हैं)।

जहां तक ​​जटिलता है, स्थानीय कोड के साथ यह कार्यकर्ता भूमिका में इस कोड को बनाना मुश्किल नहीं है। बस इस कोड को अपनी कार्यकर्ता भूमिका की रन() विधि से चलाएं।

चीजों को और अधिक मजबूत बनाने के लिए, आप अपने कंटेनरों में ब्लब्स सूचीबद्ध कर सकते हैं, फिर विशिष्ट फ़ाइल-चाल अनुरोध संदेशों को एक Azure कतार में रखें (और प्रति संदेश एक से अधिक ऑब्जेक्ट नाम डालकर अनुकूलित करें)। फिर कतार और प्रक्रिया वस्तुओं से पढ़ने के लिए एक कार्यकर्ता भूमिका धागा का उपयोग करें। यहां तक ​​कि यदि आपकी भूमिका का पुनर्नवीनीकरण किया जाता है, तो सबसे खराब आप एक संदेश पुन: संसाधित करेंगे। प्रदर्शन में वृद्धि के लिए, आप कई कार्यकर्ता भूमिका उदाहरणों को स्केल कर सकते हैं। एक बार हस्तांतरण पूरा होने के बाद, आप बस तैनाती को फाड़ दें।

अद्यतन - 12 जून, 2012 को विंडोज Azure संग्रहण एपीआई अद्यतन किया गया था, और अब क्रॉस-खाता ब्लॉब प्रतिलिपि अनुमति देता है। सभी विवरणों के लिए this blog post देखें।

+0

ध्यान देने योग्य एक दिलचस्प बात यह है कि यदि कंटेनर एक ही स्टोरेज खाते पर हैं (दुर्भाग्य से मेरे लिए मामला नहीं है) तो क्लाइंट द्वारा गुजरने के बिना ब्लॉब्स की प्रतिलिपि बनाने का एक तरीका है - यह सुनिश्चित न करें कि कौन सी एपीआई करता है, लेकिन Azure स्टोरेज एक्सप्लोरर के साथ प्रतिलिपि करते समय फिडलर चलाना एक्स-एमएस-कॉपी-सोर्स हेडर दिखाता है। –

+0

ठीक है, इसे "CopyFromBlob" कहा जाता है। कोई यह जांच सकता है कि स्रोत खाता गंतव्य से मेल खाता है और उस विधि का उपयोग करता है, अन्यथा DownloadToStream/UploadToStream कॉम्बो का उपयोग करें। –

1

अपने उपकरण को एक साधारण .NET कमांड लाइन या विन फॉर्म एप्लिकेशन के रूप में लिखें।

बनाएँ और एक डमी हम/आरडीपी साथ कार्यकर्ता भूमिका मशीन के लिए सक्षम

लॉग इन आरडीपी के माध्यम से तैनात

आरडीपी कनेक्शन

भागो रिमोट मशीन पर उपकरण पर अपने उपकरण कॉपी

तैनात भूमिका हटाएं।

आप की तरह मैं फ़ंक्शन के बीच प्रतिलिपि का समर्थन करने वाले शेल्फ टूल में से किसी भी चीज़ से अवगत नहीं हूं। हालांकि आप क्लाउड स्टोरेज स्टूडियो को भूमिका में स्थापित करना और डिस्क पर डंप करने पर फिर से अपलोड करना चाहते हैं। http://cerebrata.com/Products/CloudStorageStudiov2/Details.aspx?t1=0&t2=7

+0

सुनिश्चित नहीं है कि आप आरडीपी का प्रस्ताव क्यों देंगे।मैन्युअल ऑपरेशन की आवश्यकता होने के अलावा, आपको अपनी विनियोजन के साथ अपने WinForms ऐप को तैनात करने की आवश्यकता होगी। एक सरल कार्य भूमिका निभाते हुए एक साधारण कार्यकर्ता भूमिका सरल होती है और तेजी से प्रदर्शन के लिए कई उदाहरणों तक स्केल कर सकती है। –

+1

मूल पोस्टर ने विशेष रूप से ध्यान दिया कि उसे एक कार्यकर्ता भूमिका लिखने के बजाय 'टूल' लिखने के लिए quicket मिल जाएगा। सहमत हैं कि मैं आमतौर पर ऐसा करने के लिए एक कार्यकर्ता लिखता हूं लेकिन इस मामले में मैंने उस उत्तर को प्रदान करने का प्रयास किया जो उस बाधा को ध्यान में रखता था। आपको WINForms ऐप को तैनात करने की आवश्यकता नहीं होगी; सचमुच आप इसे आरडीपी लिंक पर खींचेंगे क्योंकि आप ऑन-प्रिमाइसेस सर्वर से कनेक्ट और काम करेंगे। –

+0

ठीक है - पर्याप्त मेला। –

6

यहाँ कुछ कोड है कि कम से कर सकते थे 'Azure संग्रहण एक्सप्लोरर' (मुक्त) या किसी अन्य ऐसे उपकरण http://www.windowsazure.com/en-us/develop/net

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.WindowsAzure.StorageClient; 
using System.IO; 
using System.Net; 

namespace benjguinAzureStorageTool 
{ 
    class Program 
    { 
     private static Context context = new Context(); 

     static void Main(string[] args) 
     { 
      try 
      { 
       string usage = string.Format("Possible Usages:\n" 
       + "benjguinAzureStorageTool CopyContainer account1SourceContainer account2SourceContainer account1Name account1Key account2Name account2Key\n" 
       ); 


       if (args.Length < 1) 
        throw new ApplicationException(usage); 

       int p = 1; 

       switch (args[0]) 
       { 
        case "CopyContainer": 
         if (args.Length != 7) throw new ApplicationException(usage); 
         context.Storage1Container = args[p++]; 
         context.Storage2Container = args[p++]; 
         context.Storage1Name = args[p++]; 
         context.Storage1Key = args[p++]; 
         context.Storage2Name = args[p++]; 
         context.Storage2Key = args[p++]; 

         CopyContainer(); 
         break; 


        default: 
         throw new ApplicationException(usage); 
       } 

       Console.BackgroundColor = ConsoleColor.Black; 
       Console.ForegroundColor = ConsoleColor.Yellow; 
       Console.WriteLine("OK"); 
       Console.ResetColor(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(); 
       Console.BackgroundColor = ConsoleColor.Black; 
       Console.ForegroundColor = ConsoleColor.Yellow; 
       Console.WriteLine("Exception: {0}", ex.Message); 
       Console.ResetColor(); 
       Console.WriteLine("Details: {0}", ex); 
      } 
     } 


     private static void CopyContainer() 
     { 
      CloudBlobContainer container1Reference = context.CloudBlobClient1.GetContainerReference(context.Storage1Container); 
      CloudBlobContainer container2Reference = context.CloudBlobClient2.GetContainerReference(context.Storage2Container); 
      if (container2Reference.CreateIfNotExist()) 
      { 
       Console.WriteLine("Created destination container {0}. Permissions will also be copied.", context.Storage2Container); 
       container2Reference.SetPermissions(container1Reference.GetPermissions()); 
      } 
      else 
      { 
       Console.WriteLine("destination container {0} already exists. Permissions won't be changed.", context.Storage2Container); 
      } 


      foreach (var b in container1Reference.ListBlobs(
       new BlobRequestOptions(context.DefaultBlobRequestOptions) 
       { UseFlatBlobListing = true, BlobListingDetails = BlobListingDetails.All })) 
      { 
       var sourceBlobReference = context.CloudBlobClient1.GetBlobReference(b.Uri.AbsoluteUri); 
       var targetBlobReference = container2Reference.GetBlobReference(sourceBlobReference.Name); 

       Console.WriteLine("Copying {0}\n to\n{1}", 
        sourceBlobReference.Uri.AbsoluteUri, 
        targetBlobReference.Uri.AbsoluteUri); 

       using (Stream targetStream = targetBlobReference.OpenWrite(context.DefaultBlobRequestOptions)) 
       { 
        sourceBlobReference.DownloadToStream(targetStream, context.DefaultBlobRequestOptions); 
       } 
      } 
     } 
    } 
} 
+0

धन्यवाद! मेरे पास समाधान पहले से ही कोड किया गया था, लेकिन कुछ कोड साझा करना हमेशा अच्छा लगता है। इसके अलावा, मैं एक मेमोरीस्ट्रीम बना रहा था - लक्ष्य ब्लॉब पर ओपनवाइट() करने के लिए यह क्लीनर (और अधिक कुशल) है। –

1

उपयोग Azure उपलब्ध के लिए नेट एसडीके का लाभ उठाता है है। ये टूल सामग्री डाउनलोड और अपलोड करने का एक तरीका प्रदान करते हैं। आपको मैन्युअल रूप से कंटेनर और टेबल बनाने की आवश्यकता होगी - और निश्चित रूप से यह एक स्थानांतरण लागत लेगा - लेकिन यदि आप समय पर कम हैं और आपकी सामग्री उचित आकार के हैं तो यह एक व्यवहार्य विकल्प है।

+1

मूल रूप से कहा गया है कि, जिस कंटेनर को कॉपी करना था, वह बहुत बड़ा था - Azure स्टोरेज एक्सप्लोरर उस परिदृश्य में अच्छी तरह से किराया नहीं देता है। मैंने एक कस्टम टूल लिखना समाप्त कर दिया - यह बहुत सरल था - और मैंने स्थानांतरण लागत से बचने के लिए इसे Azure वेब भूमिका से भाग लिया। –

0

मुझे स्थानीय फ़ाइल सिस्टम से Azure संग्रहण में 600 जीबी सामग्री को स्थानांतरित करने के समान कुछ करना था। कोड के दो पुनरावृत्तियों के बाद मैं अंततः 'एज़ूर स्टोरेज एक्सप्लोरर' लेने के साथ समाप्त हुआ और इसे केवल फाइलों के बजाय फ़ोल्डरों का चयन करने की क्षमता के साथ बढ़ाया और फिर इसे कई चयनित फ़ोल्डर्स में फिर से ड्रिल किया, स्रोत/गंतव्य प्रति की एक सूची लोड की एक Azure कतार में आइटम बयान। फिर कतार से खींचने और कॉपी ऑपरेशन निष्पादित करने के लिए कतार अनुभाग में 'Azure Storage Explorer' में अपलोड अनुभाग में।

फिर मैंने 'एज़ूर स्टोरेज एक्सप्लोरर' टूल के 10 उदाहरण लॉन्च किए और प्रत्येक ने कतार से खींच लिया और कॉपी ऑपरेशन निष्पादित किया। मैं 600 जीबी वस्तुओं को सिर्फ 2 दिनों में स्थानांतरित करने में सक्षम था। फ़ाइलों पर संशोधित समय टिकटें का उपयोग करने के लिए स्मारकों में जोड़ा गया है और इसे उन फ़ाइलों पर छोड़ दिया गया है जो पहले से ही कतार से कॉपी किए गए हैं और कतार में नहीं होने पर कतार में नहीं जोड़ते हैं। अब मैं सामग्री के पूरे पुस्तकालय में एक या दो घंटे के भीतर "अपडेट" या सिंक चला सकता हूं।

+2

क्या आप कोड साझा करना चाहते हैं? –

2

मैं एक माइक्रोसॉफ्ट तकनीकी प्रचारक हूं और मैंने इन परिदृश्यों में सहायता के लिए एक नमूना और मुफ्त उपकरण (कोई समर्थन/गारंटी नहीं) विकसित की है।

बाइनरी और स्रोत-कोड यहां उपलब्ध हैं: https://blobtransferutility.codeplex.com/

ब्लॉब स्थानांतरण उपयोगिता को अपलोड करने और विंडोज Azure ब्लॉब संग्रहण से/छोटे/बड़े फ़ाइलों के हजारों डाउनलोड करने के लिए एक जीयूआई उपकरण है।

विशेषताएं:

  • अपलोड करने के लिए बैचों बनाएं/छोटे भागों में समानांतर
  • स्प्लिट बड़ी फ़ाइलों कि समानांतर
  • में स्थानांतरित कर रहे हैं में
  • सेट सामग्री प्रकार
  • स्थानांतरण फ़ाइलों को डाउनलोड

पहली और तीसरी सुविधा आपके लिए उत्तर है मुसीबत।

आप नमूना कोड से सीख सकते हैं कि मैंने यह कैसे किया है, या आप बस उपकरण चला सकते हैं और आपको जो करना है वह कर सकते हैं।

10

आप एज़कॉपी का भी उपयोग कर सकते हैं जो Azure SDK का हिस्सा है।

Windows Azure SDK के लिए बस डाउनलोड बटन पर क्लिक करें और AzCopy डाउनलोड करने के लिए सूची से WindowsAzureStorageTools.msi चुनें।

स्थापित करने के बाद, आप AzCopy.exe यहां प्राप्त करें: %PROGRAMFILES(X86)%\Microsoft SDKs\Windows Azure\AzCopy

आप इस ब्लॉग पोस्ट में AzCopy का उपयोग करने पर और अधिक जानकारी प्राप्त कर सकते हैं: एक उदाहरण में, आप कर सकते थे दूरस्थ डेस्कटॉप के रूप में अच्छी तरह से AzCopy – Using Cross Account Copy Blob

और इस का उपयोग स्थानांतरण के लिए उपयोगिता।

+2

@MarcCliment वर्तमान जानकारी के साथ अद्यतन करने के लिए धन्यवाद – Dreamwalker

3

एज़कॉपी के साथ यह बहुत आसान है। नवीनतम संस्करण डाउनलोड करें https://azure.microsoft.com/en-us/documentation/articles/storage-use-azcopy/ से और azcopy प्रकार में: कॉपी एक भंडारण खाते के भीतर एक ब्लॉब:

AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer1 /Dest:https://myaccount.blob.core.windows.net/mycontainer2 /SourceKey:key /DestKey:key /Pattern:abc.txt 

कॉपी भंडारण खातों के लिए एक ब्लॉब:

AzCopy /Source:https://sourceaccount.blob.core.windows.net/mycontainer1 /Dest:https://destaccount.blob.core.windows.net/mycontainer2 /SourceKey:key1 /DestKey:key2 /Pattern:abc.txt 

कॉपी माध्यमिक क्षेत्र से एक ब्लॉब

यदि आपके स्टोरेज खाते में भू-अनावश्यक स्टोरेज सक्षम है, तो आप द्वितीयक क्षेत्र से डेटा कॉपी कर सकते हैं।

कॉपी माध्यमिक से प्राथमिक खाते में किसी ब्लॉब:

AzCopy /Source:https://myaccount1-secondary.blob.core.windows.net/mynewcontainer1 /Dest:https://myaccount2.blob.core.windows.net/mynewcontainer2 /SourceKey:key1 /DestKey:key2 /Pattern:abc.txt 
0

CloudBerry Explorer की कोशिश करो। यह सब्सक्रिप्शन के भीतर और उसके बीच ब्लॉब की प्रतिलिपि बनाता है।

सदस्यता के बीच प्रतिलिपि बनाने के लिए, स्टोरेज खाता कंटेनर की पहुंच Private से Public Blob पर संपादित करें।

प्रतिलिपि प्रक्रिया को पूरा होने में कुछ घंटे लग गए। यदि आप अपनी मशीन को रीबूट करना चुनते हैं, तो प्रक्रिया जारी रहेगी। टाइमस्टैम्प की जांच करके Azure प्रबंधन UI में लक्ष्य संग्रहण खाता कंटेनर को रीफ्रेश करके स्थिति की जांच करें, प्रतिलिपि प्रक्रिया पूर्ण होने तक मूल्य अपडेट हो जाता है।

enter image description here

संबंधित मुद्दे