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