I have 40 mil blobs of 10 TB in blob storage. I am using DML CopyDirectory
to copy these into another storage account for backup purpose. It took nearly 2 weeks to complete. Now i am worried that until which date the blobs are copied to target directory. Is it the date when the job started or the date job finished ?
Does DML uses anything like data slices ?
答案 0 :(得分:1)
现在我担心将blob复制到目标目录的日期。是作业开始的日期还是日期工作完成的日期?
据我所知,当你启动CopyDirectory方法时,它只会发送请求告诉azure存储帐户从另一个存储帐户复制文件。所有复制操作都是天蓝色存储。
如果我们运行方法开始复制目录,azure存储将首先创建0大小的文件,如下所示:
作业完成后,您会发现它的大小已经改变如下:
结果是,如果作业启动,它将在目标目录中创建文件,但文件大小为0.您可以看到image1的文件上次修改时间。
azure存储将继续将文件内容复制到目标目录。
如果作业完成,则会更改文件的上次修改时间。
因此DML SDK只是告诉存储器复制文件,然后它会继续将请求发送到azure存储器以检查每个文件的复制状态。
如下所示:
感谢。但是如果在复制操作期间将文件添加到源目录会发生什么?新文件是否也会被复制到目标目录?
简而言之,是的。
DML不会获取整个blob列表并发送请求一次复制所有文件。
首先会获取文件名列表的一部分并发送请求以告知存储副本文件。
列表按文件名排序。
例如。
如果DML已经将文件名复制为0文件,如下所示。
此目标blob文件夹
如果将0开始文件添加到文件夹,则不会复制。
这是来自blob文件夹的副本。
复制完整blob文件夹:
如果您在blob文件夹的末尾添加文件并且DML没有扫描它,它将被复制到新文件夹。
所以在这两周内,至少有一百万个blob必须以非常随机的名字添加到容器中。所以我认为DML在大容器的情况下不起作用?
据我所知,DML专为高性能上传,下载和复制Azure存储Blob和文件而设计。
当您使用DML CopyDirectoryAsync复制blob文件时。它将首先发送一个请求以列出文件夹的当前文件,然后它将发送请求以复制该文件。
发送列出文件夹当前文件编号的请求的操作的默认值为250。
获取列表后,它将生成一个标记,这是下一个blob搜索文件名。它将开始列出文件夹中的下一个文件名,然后重新开始复制。
默认情况下,.Net HTTP连接限制为2.这意味着只能维护两个并发连接。
这意味着如果您未设置.Net HTTP连接限制,则CopyDirectoryAsync将获得500条记录并开始复制。
完全复制后,操作将开始复制下一个文件。
你可以看到这张图片:
标记:
我建议您首先设置最大http连接以检测更多blob文件。
ServicePointManager.DefaultConnectionLimit = Environment.ProcessorCount * 8;
此外,我建议你可以创建多个文件夹来存储文件。
例如,您可以创建一个存储一周文件的文件夹。
下周,你可以开始一个新的文件夹。
然后你可以备份旧文件夹的文件,而不会将新文件存储到该文件夹中。
最后,您还可以编写自己的代码来满足您的要求,首先需要获取文件夹文件的列表。
获取列表的一个请求的最大结果是5000。
然后你可以发送请求告诉存储副本每个文件。
如果文件在获得列表后上传到文件夹,则不会复制到新文件夹。