34、深入了解Azure数据存储与数据库服务

深入掌握Azure数据存储与SQL Azure

深入了解Azure数据存储与数据库服务

1. 数据备份上传机制

在数据上传过程中,当输入数据小于4MB时,代码会发起一个长序列请求;而当数据大于4MB时,代码会调用辅助函数将数据分割并上传为多个块。以下是相关代码:

queue.join()
# Now upload block list
resp = conn.put_block_list("enc", filename, \
        blocklist, "application/octet-stream")
return resp

数据上传流程如下:
1. 数据分割 upload_archive_using_blocks 函数会将输入数据分割成4MB的块(此大小是经过少量测试后选定的)。对于块ID,使用块中数据的SHA - 256哈希值。
2. 线程池处理 :每个块会被添加到一个队列中,由线程池进行处理。Python 本身没有内置的线程池实现,代码中使用了 task.py 里的简单线程池。线程池会管理一组线程,这些线程会从队列中读取工作项并进行处理。
3. 块上传 :“工作项” 是一个函数引用(内部函数 block_uploader )和一个包含该函数参数的Python元组。当轮到处理时, block_uploader 会携带元组中的参数(存储连接对象、块ID以及与该块ID关联的数据)被调用。 block_updater 会调用存储模块中的 put_block 来上传特定的块。

2. azbackup工具的使用

使用 azbackup 工具进行数据备份和恢复的步骤如下:
1. 设置环境变量 :将环境变量 AZURE_STORAGE_ACCOUNT AZURE_STORAGE_KEY 分别设置为你的Windows Azure存储账户名称和密钥。例如,如果你的博客存储账户地址是 foo.blob.core.windows.net ,则 AZURE_STORAGE_ACCOUNT 应设置为 foo
2. 生成密钥对 :运行 python azbackup - gen - key - k keyfilepath ,其中 keyfilepath 是存储RSA密钥对的路径和文件名。请务必妥善保管此文件,丢失后将无法访问使用该工具备份的数据。
3. 创建新备份 :运行 python azbackup.py - c - k keyfilepath - f archive_name directory_to_be_backed_up ,其中 keyfilepath 是上一步生成的密钥文件, archive_name 是工具将生成的存档名称, directory_to_be_backed_up 是你要备份的目录路径。根据目录大小,此过程可能需要一些时间,因为该工具目前尚未针对速度进行优化。如果没有出现错误,上传完成后工具将静默退出。
4. 提取现有备份 :运行 python azbackup.py - x - k keyfilepath - f archive_name ,这将把备份内容提取到当前目录。所有工具都支持 -h 参数以显示使用信息。

以下是该流程的mermaid流程图:

graph LR
    A[设置环境变量] --> B[生成密钥对]
    B --> C[创建新备份]
    C --> D[提取现有备份]
3. SQL Azure概述

传统数据库(如SQL Server或Oracle)在使用过程中,需要进行硬件设置、软件安装,并且在面临扩展问题时,需要考虑数据分区、复制、分片等,这会带来大量的架构重构和修改工作。而SQL Azure旨在解决这些问题,它提供了SQL Server的逻辑视图,具备你期望的所有SQL工具和语言支持,并且在底层进行了很多优化以实现随使用量扩展。

SQL Azure是微软的云数据库,它将Windows Azure存储的可扩展性概念扩展到了数据库领域,特别是熟悉的SQL Server环境。其 “SQL Server” 部分意味着你可以创建数据库、使用SQL Server Management Studio (SSMS) 进行连接、使用熟悉的库(如ADO.NET)编写代码,基本上可以进行传统SQL Server能做的很多事情;“服务” 部分意味着微软会为你管理运行它的硬件,除了管理硬件,该服务还会复制你的数据,并根据使用量进行扩展。

4. Windows Azure表存储与SQL Azure的比较
特性 Windows Azure表存储 SQL Azure
数据访问优化 针对大规模、低成本的数据访问进行了优化 -
RDBMS特性支持 不支持标准关系数据库管理系统 (RDBMS) 特性,如引用完整性、SQL语言或围绕SQL Server的工具生态系统 支持标准SQL概念和工具,可扩展现有SQL投资到云端
适用场景 若能对数据进行非规范化处理,可考虑使用 若绝对需要关系模型,或有大量使用SQL的遗留代码,可选择使用
定价模型 与SQL Azure有很大不同 -

选择建议:如果绝对需要关系模型,或者有大量使用SQL的遗留代码,建议选择SQL Azure;如果可以对数据进行非规范化处理,可仔细考虑Windows Azure表存储。同时,要考虑两者的价格差异,因为它们的定价模型不同。对于新项目,由于很多情况下两种选择都可行,所以可以对两种服务进行试验,并结合工作负载的成本来决定使用哪种。

5. 创建和使用SQL Azure数据库
5.1 创建数据库

创建SQL Azure数据库的步骤如下:
1. 注册账户 :访问 http://sql.azure.com 并注册一个账户。此URL与其他Windows Azure服务的URL不同。注册过程中,需要提供管理员用户名和密码以登录SQL Azure数据库实例。
2. 创建数据库实例 :注册完成后,会看到一个类似管理页面的界面。界面上的DNS名称(如 fhdb1swfkd.database.windows.net )是你账户独有的,可以将其视为 “服务器”,并在连接字符串、SSMS和其他工具中使用。但实际上,这个DNS条目只是一个外观,服务是由多台机器提供的。默认会分配一个主数据库,点击 “Create Database” 按钮可以创建一个用于创建表和存储实际数据的新数据库。可以指定数据库的大小限制,目前SQL Azure支持最大10GB的数据库,下拉框中提供的1GB和10GB两种大小在定价上有所不同。
3. 代码或命令行创建 :也可以通过代码或命令行随时创建数据库。例如,使用 sqlcmd 实用工具,通过以下命令创建数据库:

SQLCMD -U [MyUsername]@[MyServername]
-P [MyPassword] -S
[MyServername].database.windows.net -d master
CREATE DATABASE [MyDatabaseName]
GO
5.2 添加防火墙规则

默认情况下,SQL Azure会阻止来自任何传入IP地址的服务访问。要更改此设置,需要手动为计划访问服务的所有IP地址添加防火墙规则。具体操作如下:
1. 查看和修改规则 :切换到 “Firewall Settings” 选项卡,这里会列出当前的所有规则。顶部有一个复选框,询问是否要 “Allow Microsoft Services access to this server”,默认是未选中的,这意味着任何托管在Windows Azure上的应用程序都无法与SQL Azure上的数据库通信。如果计划在Windows Azure上托管与SQL Azure通信的应用程序,必须选中此复选框。
2. 添加规则 :点击 “Add Rule” 按钮,会弹出一个对话框。如果已经知道要访问SQL Azure的机器的IP地址范围,可以在此处输入。如果要允许从当前机器访问,使用底部显示的IP地址作为要开放的范围。此IP地址是当前机器的外部面向IP地址,通常由ISP动态分配。如果此IP地址发生变化,必须修改此规则。可以通过 http://whatismyipaddress.com 等网站来了解IP地址的变化情况。

以下是创建和使用SQL Azure数据库的mermaid流程图:

graph LR
    A[注册账户] --> B[创建数据库实例]
    B --> C[添加防火墙规则]
    C --> D[使用数据库]
6. 使用SQL Server Management Studio连接和操作

使用SQL Server Management Studio (SSMS) 连接和操作SQL Azure数据库的步骤如下:
1. 打开SSMS :打开SSMS 2008 R2,会看到一个连接对话框。
2. 输入连接信息 :输入之前看到的DNS名称,将身份验证类型切换为 “SQL Server Authentication”,并使用创建SQL Azure账户时选择的用户名和密码。
3. 连接数据库 :SSMS会连接到数据库并打开对象资源管理器,你可以看到之前创建的主数据库和新数据库。如果在这个阶段出现连接错误,需要检查是否在SQL Azure中设置了正确的防火墙规则以允许外部IP地址访问。
4. 创建表 :可以像平常一样创建表。例如,使用查询编辑器执行以下代码创建一个简单的表:

CREATE TABLE Employees(EmpID int primary key, Name varchar(30))
GO

如果查询执行成功,应该可以在对象资源管理器中看到该表。
5. 插入和查询数据 :可以向表中插入行并进行查询,示例代码如下:

INSERT INTO Employees (EmpID, Name) VALUES
 (1, 'Michael Scott'),
 (2, 'Jim Halpert'),
 (3, 'Dwight Schrute'),
 (4, 'Pam Halpert'),
 (5, 'Andy Bernard')
GO
SELECT * FROM Employees
GO
7. 使用ADO.NET进行编码

使用ADO.NET对SQL Azure进行编码与对普通SQL Server进行编码基本相同,相同的ODBC/ADO.NET习惯用法可以直接使用。需要注意的是,SQL Azure不支持切换数据库上下文,会话在连接的整个生命周期内必须针对同一数据库中的对象进行查询。以下是使用C#应用程序通过ADO.NET查询表的示例代码:

var connectionBuilder = new SqlConnectionStringBuilder();
connectionBuilder.DataSource = "fhdb1swfkd.database.windows.net";
connectionBuilder.InitialCatalog = "booktest";
connectionBuilder.Encrypt = true;
connectionBuilder.UserID = "sriramk";
connectionBuilder.Password = "<MyPassword>";
using(var con = new SqlConnection(connectionBuilder.ToString()))
{
    con.Open();
    using(var command = con.CreateCommand())
    {
        command.CommandText = "SELECT * FROM Employees";
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine("EmpID: {0}, Name:{1}",
                                    reader["EmpID"].ToString(),
                                    reader["Name"].ToString());
            }
        }
    }
}
8. SQL Azure与SQL Server的差异
8.1 资源限制

由于SQL Azure是基于共享资源构建的服务,为了为所有用户保持相同的服务水平,可能会因为以下原因终止与服务的连接:
- 资源使用过多 :当数据库或对服务的使用消耗过多资源时,连接可能会被终止。例如,当达到数据库的大小限制(1GB或10GB)时,尝试插入/更新数据、重建索引或创建新对象时会收到错误代码。
- 长时间运行的事务 :长时间运行的事务通常在执行五分钟后(此限制可能会变化)会被取消。
- 空闲连接 :由于SQL本质上是基于会话的,空闲连接会被终止。

8.2 语言/功能差异

SQL Azure提供了一组物理资源的统一虚拟视图,通常会发现用于操作直接物理资源的T - SQL功能(如文件组)不被支持。此外,一些桌面SQL Server的功能目前还不可用,但会在未来版本中提供,包括支持分析、数据同步、全文搜索等。可以在 http://msdn.microsoft.com/en - us/library/ee336245.aspx 上查看详细的差异列表。

9. 迁移到SQL Azure的技巧

由于SQL Azure是远程服务,为了确保不受延迟或网络故障的影响,需要对代码中调用SQL的方式进行调整。同时,考虑到大小限制(1GB/10GB),必须以不同的方式对数据进行分区。以下是一些迁移到SQL Azure的技巧:
1. 处理连接中断 :与SQL Azure通信时,连接可能比与SQL Server通信时更频繁地断开。当检测到连接关闭时,应立即重新连接。如果仍然连接失败,应进行退避(10 - 15秒是一个合适的时间段),然后再次尝试。如果持续失败,检查门户以查看服务和数据库的健康状况。
2. 使用连接池 :尽可能重用连接,避免昂贵的重新登录逻辑。
3. 减少网络交互 :使与SQL Azure的通信尽可能 “大块化”,而不是 “零碎化”。由于SQL Azure是远程服务,网络延迟对查询性能时间有很大影响。使用存储过程并减少与服务器的往返次数可以大大提高性能。

深入了解Azure数据存储与数据库服务

10. 数据上传与备份的技术要点总结

数据上传和备份是整个Azure数据管理流程中的重要环节,其技术要点总结如下表:
| 要点 | 说明 |
| ---- | ---- |
| 数据分割上传 | 输入数据小于4MB时发起长序列请求,大于4MB时将数据分割成4MB的块上传,块ID使用SHA - 256哈希值 |
| 线程池处理 | 利用 task.py 中的简单线程池,将每个块添加到队列,由线程池的线程读取工作项( block_uploader 函数及参数)进行处理 |
| 备份工具使用 | 通过设置环境变量、生成密钥对、创建新备份和提取现有备份四个步骤完成数据备份和恢复操作 |

11. SQL Azure使用流程梳理

为了更清晰地展示SQL Azure的使用流程,下面以列表和mermaid流程图的形式进行梳理。

使用流程列表
1. 注册账户:访问 http://sql.azure.com 注册,提供管理员用户名和密码。
2. 创建数据库实例:利用管理页面的DNS名称,创建主数据库和新的数据库实例,可指定数据库大小。
3. 添加防火墙规则:在 “Firewall Settings” 选项卡设置规则,允许特定IP地址或Microsoft服务访问。
4. 连接和操作数据库:使用SSMS或ADO.NET进行连接、创建表、插入和查询数据等操作。

graph LR
    A[注册账户] --> B[创建数据库实例]
    B --> C[添加防火墙规则]
    C --> D[连接数据库]
    D --> E[创建表]
    E --> F[插入数据]
    F --> G[查询数据]
12. SQL Azure与其他存储方式的对比分析

除了之前提到的与Windows Azure表存储的对比,这里再从更多方面对SQL Azure与其他常见存储方式进行对比分析。

对比项 SQL Azure 传统SQL Server Windows Azure表存储
硬件管理 微软管理硬件,自动复制数据和扩展 需要自行设置硬件和管理数据复制、扩展 -
RDBMS特性 支持标准SQL概念和工具 支持完整的RDBMS特性 不支持标准RDBMS特性
数据规模 支持最大10GB数据库,可通过分片扩展 可根据硬件配置支持大规模数据 针对大规模、低成本数据访问优化
适用场景 适用于需要关系模型和扩展现有SQL投资的场景 适用于对数据库性能和功能有高要求的企业级应用 适用于可进行数据非规范化处理的场景
13. 代码示例总结与分析

在整个Azure数据存储和数据库服务的使用过程中,涉及到了多个代码示例,下面对这些代码示例进行总结和分析。

数据上传代码

queue.join()
# Now upload block list
resp = conn.put_block_list("enc", filename, \
        blocklist, "application/octet-stream")
return resp

这段代码用于完成数据块列表的上传操作,通过 conn.put_block_list 方法将块列表上传到指定的存储位置。

SQL Server Management Studio创建表和操作数据代码

CREATE TABLE Employees(EmpID int primary key, Name varchar(30))
GO
INSERT INTO Employees (EmpID, Name) VALUES
 (1, 'Michael Scott'),
 (2, 'Jim Halpert'),
 (3, 'Dwight Schrute'),
 (4, 'Pam Halpert'),
 (5, 'Andy Bernard')
GO
SELECT * FROM Employees
GO

这些代码展示了如何在SQL Azure中创建表、插入数据和查询数据,与传统SQL Server的操作方式基本一致。

ADO.NET查询数据代码

var connectionBuilder = new SqlConnectionStringBuilder();
connectionBuilder.DataSource = "fhdb1swfkd.database.windows.net";
connectionBuilder.InitialCatalog = "booktest";
connectionBuilder.Encrypt = true;
connectionBuilder.UserID = "sriramk";
connectionBuilder.Password = "<MyPassword>";
using(var con = new SqlConnection(connectionBuilder.ToString()))
{
    con.Open();
    using(var command = con.CreateCommand())
    {
        command.CommandText = "SELECT * FROM Employees";
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine("EmpID: {0}, Name:{1}",
                                    reader["EmpID"].ToString(),
                                    reader["Name"].ToString());
            }
        }
    }
}

此代码示例展示了如何使用ADO.NET连接SQL Azure数据库并查询数据,与普通SQL Server的编码方式相同,但需要注意SQL Azure不支持切换数据库上下文。

14. 综合应用建议

在实际应用中,根据不同的业务需求和场景,综合使用Azure的数据存储和数据库服务可以达到更好的效果。以下是一些综合应用建议:
1. 数据备份与存储 :使用 azbackup 工具进行数据备份,根据数据大小选择合适的上传方式,同时结合Azure的存储服务确保数据的安全性和可扩展性。
2. 数据库选择 :如果业务需要关系模型和大量的SQL操作,优先选择SQL Azure;如果数据可以进行非规范化处理,考虑使用Windows Azure表存储。
3. 性能优化 :在使用SQL Azure时,遵循迁移技巧,如处理连接中断、使用连接池和减少网络交互,以提高性能。

15. 总结

通过对Azure数据存储与数据库服务的深入了解,我们认识到Azure提供了丰富的功能和灵活的解决方案。从数据备份上传机制到SQL Azure的创建和使用,每个环节都有其独特的技术要点和操作步骤。在实际应用中,我们需要根据业务需求合理选择存储方式和数据库服务,并遵循相应的优化技巧,以确保数据的高效管理和应用的稳定运行。无论是数据备份、数据库操作还是性能优化,Azure都为我们提供了强大的支持,帮助我们更好地应对各种数据管理挑战。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值