案例分享-百万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主机的某个网卡独享给每台虚拟机