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

时间:2013-07-25 02:13:57

标签: azure azure-sql-database azure-table-storage

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

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

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

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

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

此时,我不确定哪一个更好,甚至其中任何一个都是一个很好的设计来实现。你能为这个问题建议任何好的设计方案吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

  1. 这是暂时存储。
  2. 您受到本地存储空间大小的限制(而后者又取决于VM的大小)。
  3. 本地存储为local only,即只能由创建它的VM访问,从而阻止您扩展解决方案。
  4. 我喜欢使用队列的想法,但我也看到了一些问题:

    1. 假设您计划将队列中的每一行存储为一条消息,那么您将执行大量存储事务。如果我们假设您的行大小为64KB,那么为了存储30 GB的数据,您将进行大约500,000次写入事务(以及类似的500000次读取事务) - 我希望我的数学正确:)。即使存储交易很便宜,我仍然认为你会做很多交易,这会减慢整个过程。
    2. 由于您正在进行如此多的交易,因此您可能会受到存储阈值的影响。你可能想检查一下。
    3. 另一个限制是消息的最大大小。目前,单个消息中最多可存储64KB的数据。如果你的行数超过这个数量会怎么样?
    4. 我实际上建议在混合中投掷blob storage。你可以做的是从SQL表中读取一大块数据(比如10000或100000条记录),并将这些数据作为文件保存在blob存储中。根据您希望如何将数据放入表存储中,您可以将数据存储为CSV,JSON或XML格式(如果需要,可以保留数据类型的XML格式)。在blob存储中写入文件后,您可以在队列中写入消息。该消息将包含您刚刚编写的blob的URI。您的工作者角色(处理器)将持续轮询此队列,获取一条消息,从blob存储中获取文件并处理该文件。一旦worker角色处理完文件,您就可以删除该文件和消息。