案例分享-百万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主机一般预留1GB至2GB内存。
- 磁盘:结合实际I/O使用情况,建议一台ESXi主机虚拟机数量小于6个,例如:一般一台ESXi主机在3-4台虚拟机之间,这个不是绝对的比如线上另一台mysql从库服务器独享ESXi主机全部资源。
- 网络:由于几台虚拟机共享ESXi主机网络设备,所以高带宽高流量的服务要注意,可以将ESXi主机的某个网卡独享给每台虚拟机