迁移应用数据库到MySQL Database on Azure

by Rong Yu 有用户问怎么把他们应用的数据库迁移到MySQL Database on Azure上,有哪些方式,有没有需要注意的地方。今天我们来概括介绍一下迁移应用数据库到MySQL Database on Azure的方式和需要考虑的事项。 应用的可迁移性 首先您可能会想您的应用是否可以顺利的运行在MySQL Database on Azure上。MySQL Database on Azure兼容MySQL 5.5 和 MySQL 5.6,所以绝大部分应用可以不用做任何改动可以顺利地运行在MySQL Database on Azure上。当然为了更好地在MySQL Database on Azure上运行您的应用,我们建议应用要有数据库重连机制以保证良好的容错性,避免由于数据库短暂连不上的时候应用死掉,因为即使是高可用的云端的数据库也不可避免有故障切换和服务器维护等会导致短暂数据库连不上的情况出现。另外我们也建议尽量采用连接池和长连接来访问数据库,特别是对性能要求比较高的应用,详细可以参考如何高效连接到MySQL Database on Azure。 另外一个需要注意的地方是MySQL Database on Azure不支持老的MYISAM引擎,可以参考这个FAQ,为什么MySQL Database on Azure不支持MYISAM格式的数据库?了解为什么。在大多数情况下,您可以直接在建表的code里把MyISAM数据引擎改成InnoDB就可以了。 基于数据导入导出的迁移 如果您的系统可以接受较长时间(比如一二个小时)因系统迁移导致的downtime,您可以用比较简单的数据库导出和导入的方式进行数据库的迁移。 具体步骤: 登录Azure管理门户,在MySQL Database on Azure上创建一个新的MySQL服务器并进行必要的配置比如每天的备份时间,具体步骤可以参考http://www.windowsazure.cn/documentation/articles/mysql-database-get-started#step1 。 通过Azure管理门户在新创建的MySQL服务器上创建要迁移的目标数据库。具体步骤可以参考http://www.windowsazure.cn/documentation/articles/mysql-database-get-started#step4 。 如果有多个数据库账号需要访问原数据库,您需要通过Azure管理门户在新的数据库服务器上创建对应的账号。 如果数据库比较大(比如超过1GB),我们建议在同一个Azure数据中心准备一台VM这样可以先把数据传输到VM上然后再导入到DB里。 在Azure上完成应用的除了数据库之外的组件的部署(比如website)。 所有准备工作做好后,现在开始迁移。首先建议把应用关停或运行在只读模式(如果支持),这样以避免迁移过程中有新的数据。 从当前数据库服务器导出应用数据库到一个文件。您可以用您熟悉的工具比如mysqldump,workbench,等等。下面是用mysqldump导出数据库的例子: >mysqldump –databases <数据库名> –single-transaction…

0

释放虚拟磁盘未使用空间来减少计费容量

一些Azure上的Linux虚拟机用户遇到过一个令人困惑的虚拟磁盘计费问题。一旦写入大量数据使得磁盘容量变大后,即使删除那些数据,仍会一直按照最大使得磁盘容量计费。这实际上是由于一部分虚拟机上的Linux操作系统不支持一些必要的功能或用户没有做一些磁盘维护所致的。 在Azure上,如果我有一个100GB的虚拟磁盘,里面实际只保存了20GB的数据,这个磁盘的实际大小会是20GB,也只会以20GB计费(除非这个磁盘由高级存储帐户提供支持高级存储帐户提供支持)。然而当我再加入60GB,然后删除30GB后,这个磁盘的大小仍会是80GB而不是50GB。它的原理是这样的: 虚拟磁盘在Azure上是作为页Blob来存储的。页Blob是一种稀疏的存储方式,只有实际写入数据的容量会被计费。这就是为什么上面的例子中一开始以20GB计费。在普通的文件系统中,当一个文件被删除后,它只是被标记为删除,而实际的存储介质上的数据不会被清空。这也是为什么我们能通过一些反删除软件来恢复已经删除的文件。在页Blob这样的稀疏存储系统中也是一样的,它的存储结构如下图所示,包含了Header, Footer和Data blocks。我们在对它执行写操作时,文件系统会去寻找符合待写入文件大小的连续数据块。假设一个文件数据被写入了Data Block i ~ Data Block i+k,当该文件被删除后,这些Data Block并不会被完全释放,与普通文件系统类似,它们只是被标记为可写数据块。这就导致在计算存储使用量时,这部分容量仍然被计算在内。Azure虚拟机作为一个IaaS,没有操作系统的配合无法从外部判断哪些空间可以释放。 为了改善这个问题,Azure虚拟机支持了TRIM功能。这个功能原先用于来自于固态硬盘(SSD),用于释放写入过的空间。在Azure上,虚拟机操作系统通过这个命令来告知页Blob哪些空间可以释放,从而减少计费容量。现在大部分Azure上由Microsoft提供的映像所使用的操作系统都支持TRIM功能,包括所有Windows的映像,和较新的Linux映像(如所有UBUNTU,centos 7.2,和SUSE Linux Enterprise Server 12)。对TRIM功能支持的确切版本信息,请查询具体Linux发行版本提供商的技术文档。对于不支持的TRIM的Linux版本,可尝试安装Linux Integration Services Version 4.1 for Hyper-V驱动,增加对TRIM的支持。 在Windows系统中,这个功能是通过驱动器优化提供的,默认每周会自动执行一次。当然也可以在“控制面板->系统和安全->对你的驱动器进行碎片整理和优化”中进行手动执行或更改设置。另一个必要条件是启用UnMap,因为在Azure虚拟机上是默认不启用的,需要通过以下命令启用。 fsutil behavior set DisableDeleteNotify 0 在支持TRIM功能的Linux系统中,可以用fstrim命令来执行。例如对一个挂载在/mnt/data的Azure磁盘执行TRIM操作可以用以下命令: sudo /sbin/fstrim /mnt/data 现在我们明白了虚拟磁盘计费的原理,就可以理解导致“已释放”空间被计费问题的原因。为了减少计费容量,首先要确定操作系统是否支持TRIM功能。尤其在Linux的情况下,各种不同的系统和版本的支持情况都略有不同,需要用户自己根据实际配置去确认和启用。如果系统支持,还须在必要时去执行它。为了方便维护,可以建一个计划任务来定期执行。 最后,笔者再介绍一个用于查询Azure上的虚拟磁盘实际可计费大小的工具(https://github.com/sandrinodimattia/WindowsAzure-VhdSize/releases/tag/v1.0)。它由Microsoft Azure MVP,Sandrino Di Mattia开发,默认用于国际版Azure,也可用于中国版。用法:wazvhdsize.exe <存储账户名> <访问密钥> <VHD的URL> 常见问题 问:如果在虚拟机上挂载一个100GB的数据盘,是只对使用的部分收费,还是整个100GB 收费? 答:如果您的存储账号类型是高级存储,那么我们会按照磁盘大小(如P10,P20, P30)收取每月固定费用;如果您的存储账号是其他类型(比如普通账号),则按照您的实际使用量进行收费。 问:Azure存储是如何统计磁盘计费容量的? 答:请参考这篇文档,里面详细阐述了存储容量的计算算法。算法的PowerShell实现样例可以在这里下载。 参考文献 Release unused space from…

0

解读 Windows Azure 存储服务的账单 – 带宽、事务数量,以及容量

经常有人询问我们,如何估算 Windows Azure 存储服务的成本,以便了解如何更好地构建一个经济有效的应用程序。本文我们将从带宽、事务数量,以及容量这三种存储成本的角度探讨这一问题。 在使用 Windows Azure Blob、表,以及队列时,存储成本是由下列因素决定的: 带宽 – 从承载存储帐户的位置传入和传出的数据总量 事务– 针对您的存储帐户所执行的请求数量 存储容量 – 持久存储的数据总容量 请注意,随着存储系统增加新的功能,本文所涉及内容可能会有变化。本文将作为指导原则,使服务能够在应用程序运行于生产环境之前估算其存储带宽、事务和容量使用情况。 有关价格的详细信息请参阅这里。 下文将概括介绍账单中的这三项内容: 带宽 – 因为应用程序的运算过程需要用到已存储的数据,因此我们可以将托管服务与相应的存储放置在同一个位置。这样即可在同一位置的计算和存储服务之间提供免费带宽,而只需要为访问当前位置之外的存储服务所产生的带宽付费。 事务 – 每一个针对存储服务产生的 Blob、表,以及队列 REST 请求都会被视作可计费的事务。因此为了控制事务成本,应用程序可以控制发送至存储服务的请求的频率和数量。我们会分析接获的每一个请求,随后,我们会根据这些请求的处理情况,以及请求的来源,确定是否需要对该请求计费。 容量 – 为了统计需要计费的存储容量,我们会将存储的对象(Blob、实体,以及消息),以及相关应用程序和系统元数据的总容量进行累加。 下文中,我们将向您介绍如何解读您的应用程序所产生的这三项指标。 带宽何时会被计算在内 为了访问 Blob、表,以及队列,首先您需要访问 Windows Azure 开发者门户,并创建存储帐户。在创建存储帐户时,您可以选择您的存储帐户保存的位置。目前我们为您提供下列六个位置: 美国中北部 美国中南部 欧洲北部 欧洲西部 亚洲东部 亚洲东南部 存储帐户内所有数据的存储和访问都要通过创建时所选择的位置进行。为了尽量降低客户访问时遇到的延迟,一些应用程序会尽可能选择距离主要客户最近的位置。这里一个最重要的问题在于,对需要访问该存储帐户的托管服务,您也需要在开发者门户中选择与存储帐户相同的区域。这是因为同一个位置内部的数据传输带宽是免费的。相反,如果要从不同于存储帐户位置的其他位置传入或传出数据,将需要根据本文开头处列出的费率收取带宽费用。 另外还要注意,同一位置内“访问”操作产生的带宽是免费的,但是所产生的事务并不免费。对存储系统的每次访问都会被视作一个需要计费的事务。此外,只有被视作可计费事务所产生的带宽才需要收费,关于可计费事务的详情请参阅下文。 如果您在 Windows Azure 内容传送网络(CDN)中使用了 Blob,那么关于带宽还有一个需要注意的问题。如果 CDN 节点中没找到所需 Blob(或者该 Blob…

0