跳转至

案例分享-百万PV项目与虚拟化方案


2013-04-08 by dongnan

开始之前

某个项目日访问量大约100万PV,说大不大、说小又具备了一定规模,最近公司网站的这个项目从物理机迁移到了VMware虚拟化平台, 这里总结下该项目的网站架构,供新朋友当作参考案例。

环境描述

项目架构

这个项目开始于2007年,目前日均PV 100万左右,带宽峰值(BGP)60Mbit左右,Haproxy并发峰值4000左右, 项目共占用两个机柜(14U机位),共计13台服务器,分别为12台Dell 1950、1台Dell 2950组成,分工如下 :

  • 1台Apache做CDN源站服务器。
  • 1台Haproxy负载均衡服务器。
  • 4台IIS web服务器。
  • 2台Memcache 缓存服务器。
  • 2台Lucene检索服务器。
  • 1台SqlServer主数据库服务器。
  • 2台SqlServer从数据库服务器。

网站架构

项目逻辑上可以分为5个层次:

  • CDN层,为提高用户体验度,公司网站全部使用商用CDN来加速网站,CDN源站服务器用于存储用户或者CMS发布的静态文件。
  • 代理层,使用haproxy反向代理IIS服务器,haproxy拥有强大的负载均衡能力与健康检查功能,提供友好的监控页面。
  • 应用层,IIS服务器适用于.net程序等。
  • 缓存层,Memcache、lucene都是为了减轻数据库压力而设置的。
  • 数据库层,SqlServer数据库由1主(写)2从(读)组成。

架构拓扑图:

一些问题

CDN源站单点问题,在不考虑费用的情况下这个可以考虑双机HA,或者将 xxximg.xxx.com 合并到主站CDN源服务器。

Haproxy单点问题,这个可以通过 haproxy + keepalived方式解决,不过需要添加服务器。

其实缓存层中无论是Memcache还是Lucene都是为了减轻数据库压力而存在的, 目前数据库是1主(写)2从(读)在缓存层服务器的帮助下,负载并不高,不过一旦缓存服务器崩溃压力立刻增加。

项目虚拟化

为什么要进行虚拟化?

原因有以下几个方面:

  • 项目的服务器已经运行近5年原计划更换新的服务器代替老旧的服务器,但是不能忽略成本这个重要的因素。
  • 托管的机房是目前中国IDC行业的头部,它的机柜资源紧张,以我们公司为例4个月前向其申请新的机柜,至今还在“排队”等待。
  • 机房限制机柜用电量,比如每个机柜限制在6.8安,所以老旧服务器耗电量是一个问题。
  • 服务器集中管理,可以使用Vmware Vcenter集中管理ESXi主机。例如,如果我要重启一台服务器只需要在Vcenter直接重启ESXi主机即可。

不适用于虚拟化场景

目前来讲,假如系统负载IO/cpu/内存/网络等开销较小,都可以迁移至虚拟化平台, 但是如果应用对IO/cpu/内存/网络等资源要求极高,例如"繁忙"的数据库或者本项目中的CDN源站服务器(磁盘IO),虚拟化就需要三思而后行了。

当然为了方便集中管理,可以将ESXi主机全部资源分给此虚拟机,此虚拟机独享ESXi素主机全部资源,也是可以的。

虚拟化后服务器数量

机柜由两个调整成一个,服务器由13台调整为6台:

  • 1台Vmware vCenter服务器。
  • 4台Vmware ESXi服务器。
  • 1台CDN源站服务器(保持不变)。

虚拟机分配方案

虚拟机分布如下:

haproxy01    sql_master  sql_slave01  sql_slave02 
iis01        iis02       iis03        iis04 
memcache01   memcache02  lucene01     lucene02 
                                      haproxy02 
-------------------------------------------------------- 
Esxi-1       Esxi-2      Esxi-3       Esxi-4

宿主机服务器配置:

型号:Dell R610 1U 
cpu:*2 XEON 5620 
内存:32GB 
磁盘:disk *4 300G 10k sas  
阵列卡:perc 6i raid 10

虚拟机资源配置:

Haproxy服务器: 2 vcpu/2GB mem/30GB vdisk/       # 耗网络(相对) 
IIS服务器: 4vcpu/6GB mem/60GB vdisk/            # 耗cpu+内存 
Memcache服务器: 2vcpu/10GB mem/30GB vdisk/      # 耗内存 
Lucene服务器: 4vcpu/10GB mem/80GB vdisk/        # 耗内存 
SqlServer服务器: 4vcpu/10GB mem/100GB vdisk/    # 耗cpu+内存+IO

我们可以看到,虚拟机部署是按照不同服务类型来分摊到每个一ESXI主机上的,而不是把全部的鸡蛋放在一个篮子里面, 这样做的原因是如果服务器硬件造成的故障,生产服务影响到最小限度。

其次,分析不同服务类型占用的资源不同再对虚拟机作出调整,比如Haproxy占用资源较少,只分给其很少的资源。

成本对比

项目      服务器数量   机位数量    耗电量  
物理机     13台       14         约10安  
虚拟机     5台        6          约5安

小结

最后总结下虚拟机资源分配原则,从四个方面考虑:

  • CPU:为虚拟机分配资源要考虑服务器类型,不建议为虚拟机分配过多的vcpu够用则好,否则将导致此虚拟机抢占资源太多,会影响同一宿主机上的其它虚拟机的正常工作 。
  • 内存:分配内存也是够用则好,不过不要忘记为ESXi主机预留一定内存用于自身开销,线上ESXi主机一般预留1GB2GB内存。
  • 磁盘:结合实际I/O使用情况,建议一台ESXi主机虚拟机数量小于6个,例如:一般一台ESXi主机在3-4台虚拟机之间,这个不是绝对的比如线上另一台mysql从库服务器独享ESXi主机全部资源。
  • 网络:由于几台虚拟机共享ESXi主机网络设备,所以高带宽高流量的服务要注意,可以将ESXi主机的某个网卡独享给每台虚拟机
回到页面顶部