1

在我们的服务中,我们使用 SQL Azure 作为主存储,使用 Azure 表作为备份存储。每天大约有 30GB 的数据被收集并存储到 SQL Azure。由于从第二天开始数据不再有效,我们希望每晚将数据从 SQL Azure 迁移到 Azure 表。

问题是.. 将数据从 Azure 迁移到 Azure 表的最有效方法是什么?

我想出的天真的想法是通过使用 IDataReader 来利用生产者/消费者的概念。即首先通过执行“select * from TABLE”得到一个数据读取器,并将数据放入队列中。同时,一组线程正在从队列中抓取数据,并将它们插入 Azure Table。

当然,这种方法的主要缺点(我认为)是我们需要长时间保持打开的连接(可能是几个小时)。

另一种方法是首先将数据从 SQL Azure 表复制到 Windows Azure 上的本地存储,并使用相同的生产者/消费者概念。在这种方法中,我们可以在复制完成后立即断开连接。

在这一点上,我不确定哪个更好,或者甚至它们中的任何一个都是一个很好的设计来实现。你能为这个问题提出任何好的设计解决方案吗?

谢谢!

4

1 回答 1

0

我不建议使用本地存储,主要是因为

  1. 它是临时存储。
  2. 您受到本地存储大小的限制(这又取决于 VM 的大小)。
  3. 本地存储local only就是说它只能被创建它的虚拟机访问,从而阻止你扩展你的解决方案。

我喜欢使用队列的想法,但是我也看到了一些问题:

  1. 假设您计划将队列中的每一行作为消息存储,您将执行大量存储事务。如果我们假设您的行大小为 64KB,要存储 30 GB 的数据,您将执行大约 500000 个写入事务(以及类似的 500000 个读取事务)——我希望我的数学是正确的 :)。即使存储交易很便宜,我仍然认为你会做很多交易,这会减慢整个过程。
  2. 由于您正在执行如此多的事务,因此您可能会受到存储阈值的影响。你可能想检查一下。
  3. 另一个限制是消息的最大大小。目前,一条消息最多可以存储 64KB 的数据。如果您的行大小超过此值会怎样?

我实际上建议blob storage加入混合。您可以做的是从 SQL 表中读取一大块数据(比如 10000 或 100000 条记录)并将该数据作为文件保存在 blob 存储中。根据您希望如何将数据放入表存储中,您可以将数据存储为 CSV、JSON 或 XML 格式(如果需要,可以使用 XML 格式保存数据类型)。将文件写入 Blob 存储后,您可以在队列中写入消息。该消息将包含您刚刚编写的 blob 的 URI。您的工作角色(处理器)将不断轮询此队列,获取一条消息,从 blob 存储中获取文件并处理该文件。一旦辅助角色处理了文件,您就可以简单地删除该文件和消息。

于 2013-07-25T02:46:44.343 回答