将数据从SQL Azure迁移到Azure表的最佳设计解决方案

将数据从SQL Azure迁移到Azure表的最佳设计解决方案,azure,azure-sql-database,azure-table-storage,Azure,Azure Sql Database,Azure Table Storage,在我们的服务中,我们使用SQLAzure作为主存储,Azure表作为备份存储。每天大约有30GB的数据被收集并存储到SQLAzure。由于数据从第二天起不再有效,我们希望每晚将数据从SQLAzure迁移到Azure表 问题是。。将数据从Azure迁移到Azure表的最有效方法是什么 我提出的一个天真的想法是通过使用IDataReader来利用生产者/消费者的概念。也就是说,首先通过执行select*from TABLE获取数据读取器,并将数据放入队列。同时,一组线程正在努力从队列中获取数据,并将

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

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

我提出的一个天真的想法是通过使用IDataReader来利用生产者/消费者的概念。也就是说,首先通过执行select*from TABLE获取数据读取器,并将数据放入队列。同时,一组线程正在努力从队列中获取数据,并将它们插入Azure表中

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

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

在这一点上,我不确定哪一个更好,或者哪一个都是一个好的设计来实现。你能为这个问题提出好的设计方案吗


谢谢

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

这是暂时的储存。 您受到本地存储大小的限制,而本地存储大小又取决于VM的大小。 本地存储是仅本地的,即,它只能由创建它的VM访问,从而防止您扩展解决方案。 我喜欢使用队列的想法,但是我也看到了一些问题:

假设您计划将队列中的每一行存储为消息,那么您将执行大量存储事务。如果我们假设您的行大小为64KB,要存储30GB的数据,您需要进行大约500000个写事务和类似的500000个读事务—我希望我的数学计算正确:。尽管存储事务很便宜,但我仍然认为您将执行大量事务,这会减慢整个过程。 由于您要处理的事务太多,您可能会受到存储阈值的影响。你可能想检查一下。 还有一个限制是消息的最大大小。目前,单个消息中最多可存储64KB的数据。如果您的行大小超过该值,会发生什么情况?
实际上,我建议在混合中加入blob存储。您可以做的是从SQL表(比如10000或100000条记录)中读取一块数据,并将该数据作为文件保存在blob存储中。根据您希望如何将数据放入表存储中,您可以将数据存储为CSV、JSON或XML格式,以便在需要时保留数据类型。一旦文件写入blob存储,就可以在队列中写入消息。消息将包含您刚刚编写的blob的URI。您的工作者角色处理器将持续轮询此队列,获取一条消息,从blob存储中获取文件并处理该文件。工作角色处理完文件后,您可以简单地删除该文件和消息。

这是一个表中的30 GB数据还是多个表中的30 GB数据?谢谢,我明白您的意思了。实际上,我在最初的帖子中提到的队列只是内存队列,而不是WindowsAzure队列;还有一个问题:就像您所说的,让我们假设一个工作者角色轮询队列,获取一条指向blob文件的消息。但不幸的是,由于某些原因(例如限制),blob文件中的某些行没有插入Azure表。您将如何处理此类失败?您可以做的一件事是将所有失败的行放在另一个文件中,将该文件保存在blob存储中,并在队列中创建新消息。您还可以通过检查消息的DequeueCount属性来进行更多的检查,如消息处理了多少次,或者换句话说,文件处理了多少次,如果消息处理了x次以上,您可以将其放在其他地方并脱机处理。