基于开源软件在Azure平台建立大规模系统的最佳实践
作者 王枫 发布于2014年5月28日
前言
Microsoft Azure 是微软公有云的唯一解决方案。借助这一平台,用户可以以多种方式部署和发布自己的应用。 这是一个开放的平台,除了对于Windows服务器和SQL Server的支持,Microsoft Azure也支持了大量主流开源软件和框架,包括Linux, Tomcat®, Java®等。如何将一个基于开源软件的系统迁移到Microsoft Azure平台,并充分发挥云在弹性、敏捷性等方面的优势? 本文和读者分享一些最佳实践经验,并在文末以中国网络电视台的系统迁移作为参考案例。
阅读本文之前,希望读者对Microsoft Azure有所了解。读者可以登录http://www.windowsazure.cn 得到关于这一平台的各项信息。本文提到了如下概念:
- 基础设施即服务(IaaS: Infrastructure as a Service): 消费者通过互联网获得计算机基础设施类的资源,包括计算资源(虚机),存储资源和网络资源等。
- 平台即服务(PaaS: Platform as a Service): 云平台的服务提供商对资源在IaaS的基础上做进一步封装,将IaaS层对用户透明。消费者借助开发工具和一系列开发语言,在云平台上构建自己的应用,而无需管理和维护虚机、存储、网络等基础设施。
在Azure中使用Linux虚拟服务器:
Azure平台目前支持三种类型的Linux操作系统: UBUNTU, CENTOS和SUSE。他们的版本分别是:
- Ubuntu Server 12.04 LTS
- Ubuntu Server 12.10
- Ubuntu Server 13.10
- Ubuntu Server 14.04 LTS
- OpenLogic
- SUSE Linux Enterprise Server 11 SP3
在Azure平台使用Linux虚机,有如下最佳实践帮助用户得到更好的体验。
为Linux 配置交换分区(SWAP)
在Linux中保留swap分区有两个重要的原因:
- 当物理内存不足以支撑系统和应用程序(进程)的运作时,这个 swap 空间可以用作临时存放使用率不高的内存分页,把腾出的内存交给急需的应用程序(进程)使用。
- 即使你的机器拥有足够多的物理内存,也有一些程序会在它们初始化时残留的极少再用到的内存分页内容转移到 swap 空间,以此让出物理内存空间。对于有发生内存泄漏几率的应用程序(进程),swap 空间更是重要,因为谁也不想看到由于物理内存不足导致系统崩溃。
在Azure平台上,当用户通过镜像库,创建出一台Linux服务器时,默认并没有分配任何交换分区。运行free命令,我们可以看到swap所对应的数字为0。
读者也许会问,既然swap分区如此重要,为什么Azure平台的镜像不自动配置好swap分区?一个重要的原因是, swap分区的大小和位置是由用户各自的使用场景决定的,Azure保留客户自己定制的灵活性,把这一工作留给用户,在虚机创建之后进行。
如何创建swap分区?下面的例子在/mnt/resource目录下创建5GB的swap分区。
- 切换至root用户
- 运行命令: fallocate –l 5g /mnt/resource/swap5g
- 运行命令: chmod 600 /mnt/resource/swap5g
- 运行命令: mkswap /mnt/resource/swap5g
- 运行命令: swapon /mnt/resource/swap5g
Linux虚机的非持久化磁盘
每一台Linux虚拟服务器都自带一块非持久化磁盘。这块磁盘的读写速度很高,但它并不存在于Azure的持久化存储设备上,而且在宿主机上。用户一定要注意不能把需要持久化的数据放在这个目录下/mnt/resource,否则当服务器重启以后,这些数据将会丢失。
在Azure中使用Tomcat
如果用户原有的应用部署于Tomcat服务器上,有两种迁移模式:IaaS和PaaS。使用IaaS模式,用户通过Azure创建虚机,并把Tomcat安装到虚拟服务器上,然后部署应用。使用PaaS模式,用户借助Azure提供的工具,将原有应用部署为“云服务”。如果客户的应用并不一定要求是Linux操作系统(即应用中没有使用到Linux操作系统的特殊功能),我们推荐的方式是PaaS。下面我们仔细讲解把Tomcat应用部署为Azure Cloud Service的优势和便利之处。(如何通过Eclipse将Tomcat应用部署到Azure,请参考官方文档: http://msdn.microsoft.com/library/azure/hh694271.aspx )
当我们在Eclipse中创建了Windows Azure工程以后,单击右键,选择“部署”。在弹出的部署对话框中,我们可以看到对于JDK和Tomcat的部署有三种方式:
- 使用客户本地开发环境的JDK和Tomcat。
这种方式最为直观,客户只需指定自己机器上JDK和Tomcat所在的位置即可。缺点是上传的时间较长。不过这样的工作只需在第一次部署时进行,以后更新应用程序时将不再需要。
- 使用第三方提供的在Windows Azure上的JDK。
- 使用Azure存储中的JDK和Tomcat。
这种方式需要客户提前将JDK和Tomcat压缩包上传到Azure存储中。客户可以借助一系列工具,例如Windows Azure Storage Explorer, AzCopy等。这种方法最为快捷,也是笔者推荐的。
在Azure中使用MySQL
通过Microsoft Azure的镜像库部署CentOS虚拟服务器,在YUM Repository里自带了MySQL的安装程序包。用户可以很方便的通过”yum install mysql”安装MySQL服务器。对于部署了MySQL的虚机,请执行命令“chkconfig --list mysql”将MySQL进程加入到虚机启动程序里。这样,当虚机被重启时,可以保证MySQL服务自动恢复正常。
如何实现MySQL的高可用性架构。客户有多种选择,例如通过MySQL, Heartbeat, DRBD来做虚机状态监控和数据同步。也可以选择Oracle版本的MySQL Cluster。在全球的Azure实例上,客户还可以直接采用ClearDB提供的MySQL as a Service。
对于大规模应用的最佳实践
使用Azure PowerShell批量部署虚机
当我们需要部署上百台甚至更多的虚机时,使用基于浏览器的Azure管理门户是非常耗时的。特别是如果我们需要在短时间内将服务器就绪,使用图形界面人工操作更是不现实的。Azure管理门户提供的所有管理功能都可以通过PowerShell来实现。对于非Windows环境,Azure也提供了命令行接口。
例如,我们需要部署100台基于CentOS的Apache服务器。推荐的方法是首先通过Azure镜像库部署一台CentOS服务器(目前的版本是CentOS 6.5)。安装Apache,并对其进行自己需要的配置。之后,将这台虚机制作为镜像(image)。制作方法参考: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-capture-image/ 。制作完成后,我们就可以通过这个镜像文件,批量部署虚机。参考下面的PowerShell脚本。
注意: Azure的云服务(Cloud Service)目前最多可以容纳50台虚机。如果您的应用程序需要50台以上的虚机,则需要创建多个云服务。
使用Azure的自动伸缩功能
很多时候,我们对系统规模的需要是动态的。例如一个投票系统,平时的用户访问量不大。当有大型活动(例如春晚)的时候,系统访问量激增。这是我们需要系统的规模随需而变。还有些爆发性增长是不可预测的。针对这种场景,Azure提供了自动伸缩功能。您可以根据 CPU 使用率的平均百分比或基于队列中的消息数指定缩放。
在 Windows Azure 管理门户的“缩放”页上,您可以手动缩放应用程序,也可以设置参数使其自动缩放。您可以缩放运行 Web 角色、辅助角色或虚拟机的应用程序。若要缩放运行 Web 角色或辅助角色实例的应用程序,您需要添加或删除角色实例以适应工作负载。
在配置应用程序的缩放之前,应考虑以下信息:
- 您必须将虚拟机添加到可用性集,才能缩放使用它们的应用程序。您添加的虚拟机最初可能处于打开或关闭状态,但它们在扩展操作中将打开,在缩减操作中将关闭。有关虚拟机和可用性集的更多信息,请参见管理虚拟机的可用性。
- 缩放受内核使用情况影响。较大的角色实例或虚拟机使用更多内核。您只能在您的订阅的内核限制内缩放应用程序。例如,如果您的订阅的上限是二十个内核,并且您通过两个中等规模的虚拟机(一共四个内核)运行某个应用程序,则对于订阅中的其他云服务部署,您只能扩展十六个内核。可用性集中用于缩放应用程序的所有虚拟机必须具有相同大小。
- 您必须先创建队列并使其与角色或可用性集关联,然后才能基于消息阈值缩放应用程序。
- 您可以缩放链接到云服务的资源。
使用Azure虚拟网络提高整体性能
当我们使用Azure的IaaS服务创建虚机时,往往需要几台虚机之间达到高速的互连互通。例如,我们创建了一个Windows Server 2008 R2作为应用服务器,还创建了一台SQL Server 2008 R2 Standard作为数据库服务器。当应用服务器访问数据库服务器时,我们希望它们通过Azure内部网络(即后台数据中心中的网络)彼此对话,而不是要绕过Internet。要达到这个目标,有两种方法:
- 将这些虚机放在同一个云服务里。
- 将这些虚机放在同一个虚拟网络里。
在一个经典的三层架构的系统中,我们通常都要借助虚拟网络来部署虚机。由于目前一个云服务最多容纳50台虚机,仅使用云服务往往是不够的。因为系统规模扩大后,很可能超过50台的限制,这样我们就需要部署多个云服务。在多个云服务中,Azure并不保证虚机的互联互通走的是内网IP。如何使用虚拟网络部署虚机,读者可以参考这篇文章: http://blog.csdn.net/azureincubationchina/article/details/10212871 。
在某种情况下,系统被部署成PaaS和IaaS混合的模式。例如Web服务器部署为云服务,数据库服务器部署在虚机上。这时,我们仍然希望Web服务器和数据库服务器处于同一虚拟网络中。要达到这一点,用户首先将IaaS虚机部署到某个虚拟网络中,之后编辑云服务的*.csfg文件,加入下面的段落即可。
中国网络电视台 (CNTV) 案例参考
有关CNTV在Microsoft Azure的应用场景和商业价值,读者可参考下面的文章。本文集中介绍技术架构部分。
- Windows Azure助力马年春晚网络直播,为CNTV带来三大惊喜: http://blog.sina.com.cn/s/blog_6b8988220102edgt.html
- CNTV转型“一云多屏”新媒体 微软Windows Azure保驾护航: http://www.cnetnews.com.cn/2014/0216/3011306.shtml
技术架构
CNTV原有数据中心存在丰富的IT资源和关键数据,如何将原有IT系统与Windows Azure融合,以获得系统资源最佳的利用率和的效率是需要重点考虑的问题。CNTV的VDN视频分发网络需要达到每秒处理8万次用户请求,经过多次测试与论证,CNTV原有IT系统承担40%的用户请求,另外60%的用户请求将有Windows Azure完成,也就是CNTV内部设有一条基线,基线以下的业务放在原有IT系统中,而基线以上的业务则放在Windows Azure,比如每天有4000万的UV访问,基线是1600万的UV,超过1600万UV请求就会放在Windows Azure之上,而整个的切换过程属于无缝切换,用户完全感受不到。
在Windows Azure中,CNTV的VDN前端Tomcat服务器采用Azure Cloud Service中的Worker Role,接收来自客户端的请求,并返回结果。用户使用Eclipse,安装Azure SDK插件作为开发和发布环境。在前端,用户部署了两个Cloud Service,一个部署在Azure北京数据中心,另一个在上海数据中心。在两个VIP的前端,用户的F5设备对HTTP请求进行分流。
当Tomcat服务器接收到请求后,需要首先访问MEMCACHE服务器,查找数据,如果缓存中不存在要查询的数据,则访问后台MySQL数据库,并更新MEMCACHE。在Windows Azure中,MEMCACHE服务器和MySQL服务器,分别由多个实例组成负载均衡集。
用户自有数据中心中运行着MySQL的主库。主库通过VPN连接,定期将数据同步到Windows Azure上的从库中。
在Azure Cloud Service中,每种角色对应多个实例,属于同一个负载均衡集。当其中一台虚机发生问题,Windows Azure会自动生成一台新的虚机替换。当系统发生后台维护时,Windows Azure也会确保这组虚机不会同时重启,从而保证服务的延续性和系统的高可用性。
对于数据库管理系统,MySQL Master DB在客户自有数据中心,Slave MySQL在Windows Azure中。两边通过MySQL Bin-log进行数据同步。同时,两台从库属于一个高可用集。通过开源框架Guzz实现了MySQL的读写分离。
参考文档
- Windows Azure Plugin for Eclipse with Java
- http://msdn.microsoft.com/library/azure/hh694271.aspx
- 下载Eclipse IDE: http://www.eclipse.org/downloads/
- 下载Azure Storage Explorer: http://azurestorageexplorer.codeplex.com/
- 下载针对Azure存储的高速上传和下载工具AzCopy: http://blogs.msdn.com/b/windowsazurestorage/archive/2012/12/03/azcopy-uploading-downloading-files-for-windows-azure-blobs.aspx
- 下载Azure PowerShell: http://az412849.vo.msecnd.net/downloads01/windowsazure-powershell.0.6.15.msi
- 下载跨平台命令行接口: http://az412849.vo.msecnd.net/downloads02/windowsazure-cli.0.6.17.msi
- 在Azure中为Linux虚机制作镜像文件: http://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-capture-image/
- 如何缩放应用程序: http://www.windowsazure.cn/zh-cn/manage/services/cloud-services/how-to-scale-a-cloud-service/
感谢马国耀对本文的审校,刘大玮和Shirley Wang对本文的策划。
本文转载自: http://www.infoq.com/cn/articles/best-practices-of-building-large-scale-systems