负载均衡方案对比(LVS、HAProxy、OSPF)
一. 方案概述
1. LVS
LVS(Linux Virtual Server)使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性。
特点:
1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
3、工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived;
4、无流量,保证了均衡器IO的性能不会收到大流量的影响;
5、应用范围比较广,可以对所有应用做负载均衡;
6、软件本身不支持正则处理,不能做动静分离,这个就比较遗憾了;其实现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。
7、如果是网站应用比较庞大的话,实施LVS/DR+Keepalived起来就比较复杂了,特别后面有Windows Server应用的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。
2. HAProxy
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
特点:
1、HAProxy支持虚拟主机
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
3、支持url检测后端的服务器出问题的检测会有很好的帮助。
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS,所以我向大家推荐LVS+Keepalived。
6、HAProxy的算法现在也越来越多了,具体有如下8种:
①roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
②static-rr,表示根据权重,建议关注;
③leastconn,表示最少连接者先处理,建议关注;
④source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
⑤ri,表示根据请求的URI;
⑥rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
⑦hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
⑧rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
3. Ospf(ECMP)
OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(autonomous system,AS)内决策路由。
ECMP(Equal-CostMultipathRouting)等价多路径,存在多条不同链路到达同一目的地址的网络环境中,如果使用传统的路由技术,发往该目的地址的数据包只能利用其中的一条链路,其它链路处于备份状态或无效状态,并且在动态路由环境下相互的切换需要一定时间,而等值多路径路由协议可以在该网络环境下同时使用多条链路,不仅增加了传输带宽,并且可以无时延无丢包地备份失效链路的数据传输。
特点:
1.4层负载均衡,效率高
2.配置简单,只需安装基于linux的路由软件quagga
3.无法进行监控检查,服务异常无法处理
4. 无session保持等,功能过于简单
二. 方案测试
1. 测试环境
- LVS服务器
IP:192.168.0.9(主) 192.168.0.10(备)
CPU:Intel(R) Xeon(R) CPU E5649 @ 2.53GHz
内存:32G
网卡:Broadcom NetXtreme II BCM5709 1000Base-T (C0) PCI Express
操作系统:CentOS release 5.8 (Final)
内核版本:2.6.18-308.8.2.el5
- Web服务器
IP:192.168.0.14 192.168.0.15
CPU:Intel(R) Xeon(R) CPU E5640 @ 2.67GHz
内存:32G
网卡:Broadcom NetXtreme II BCM5709 1000Base-T (C0) PCI Express
操作系统:CentOS release 6.3 (Final)
内核版本:2.6.32-220.17.1.el6.x86_64
Web服务:apache+php
2. LVS测试
1.1 部署实施
- 安装
Ipvsadm版本:1.2.1
Keepalived版本:1.2.1
Root用户登录192.168.0.9/10系统依次执行以下命令安装:
yum -y install ipvsadm wget gcc gcc-c++ make openssl-devel kernel-devel
Wget http://keepalived.org/software/keepalived-1.2.1.tar.gz
ln -s /usr/src/kernels/2.6.18-308.1.1.el5-x86_64/ /usr/src/linux
(将2.6.18-308.1.1.el5-x86_64替换为当前系统内核文件夹即可)
tar zxvf keepalived-1.2.3.tar.gz
cd keepalived-1.2.3
./configure
(注意这个步骤要看到以下字样才是正常的)
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
make && make install
- 配置
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/sbin/keepalived /usr/sbin/
chkconfig –add keepalived
chkconfig –level 2345 keepalived on
1). 配置keepalived文件
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc 接收通知的邮箱
}
notification_email_from Alexandre.Cassen@firewall.loc 通知发送邮箱
smtp_server mail.xxx.com 邮箱服务器
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER keepalived状态参数,主为MASTER,备为SLAVE
interface eth1 keepalived信息发送接口
virtual_router_id 51 虚拟路由ID,同一组LVS需要配置为相同ID
priority 100 优先级,主>备即可
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.23 虚拟服务IP
}
}
virtual_server 192.168.0.23 80 { 虚拟服务IP 和端口
delay_loop 6
lb_algo wrr 调度算法
lb_kind DR 工作模式
persistence_timeout 60 会话保持时间
protocol TCP
real_server 192.168.0.14 80 {真实服务IP和端口
weight 1
TCP_CHECK{ 健康检查
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.0.15 80 {
weight 1
TCP_CHECK{
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
备机keepalived文件与主大部分相同,只需要更改state和priority字段即可
2). 配置Realserver 启动脚本
其中红色字段为iptables进行端口转换配置,需要根据相应服务真实端口进行变更。
#!/bin/bash
# description: Config realserver lo and apply noarp
WEB_VIP=192.168.0.23
. /etc/rc.d/init.d/functions
case “$1″ in
start)
ifconfig lo:0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP
/sbin/route add -host $WEB_VIP dev lo:0
echo “1″ >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “2″ >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “1″ >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “2″ >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo “RealServer Start OK”
;;
stop)
ifconfig lo:0 down
route del $WEB_VIP >/dev/null 2>&1
echo “0″ >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “0″ >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “0″ >/proc/sys/net/ipv4/conf/all/arp_ignore
echo “0″ >/proc/sys/net/ipv4/conf/all/arp_announce
echo “RealServer Stoped”
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $WEB_VIP`
isrothere=`netstat -rn | grep “lo:0″ | grep $web_VIP`
if [ ! "$islothere" -o ! "isrothere" ];then
# Either the route or the lo:0 device
# not found.
echo “LVS-DR real server Stopped.”
else
echo “LVS-DR Running.”
fi
;;
*)
# Invalid entry.
echo “$0: Usage: $0 {start|status|stop}”
exit 1
;;
esac
exit 0
- 验证
访问真实服务地址http://192.168.0.14应用正常
访问真实服务地址http://192.168.0.15应用正常
访问虚拟服务地址http://192.168.0.23应用正常
LVS实现负载均衡原理是通过修改mac字段将访问vip的数据包转发到相应realserver,转发要求RIP和DIP(LVS服务器IP)属于同一个网段才可以进行arp广播。所以现有四川三层架构无法支持LVS,需将LVS和RIP(真实服务器IP)修改为同一网段,变动较大,取消测试。
1.2 功能测试
- 端口转发:DR模式+iptables
LVS配置虚IP 192.168.0.23 端口80 对应真实服务IP 192.168.0.14/15 端口80
真实服务器192.168.0.14/15 使用启动脚本
测试结果:正常转发请求
- 主备切换:主LVS停止keepalived服务,service keepalived stop,192.168.0.23端口80服务是否正常
测试结果:实时切换到备LVS提供负载均衡服务,服务正常,且用户不会觉察。
1.3 性能测试
压力测试工具:webbench、http_load
http_load
创建文件#vi urls
写入URL:http://192.168.0.23/index.html
然后执行#./http_load -rate 5 -seconds 10 -parallel 500 urls
参数含义:
-fetches 简写-f :含义是总计的访问次数
-rate 简写-r :含义是每秒的访问频率
-seconds简写-s :含义是总计的访问时间
-parallel 简写-p:并发访问的线程数
urls是一个url 列表,每个url 单独的一行。可以单个页面。
返回结果
369097 fetches, 1000 max parallel, 2.88368e+09 bytes, in 60.0011 seconds
7812.81 mean bytes/connection
6151.5 fetches/sec, 4.80605e+07 bytes/sec
msecs/connect: 105.766 mean, 9036.84 max, 0.117 min
msecs/first-response: 35.2433 mean, 12993.4 max, 0.62 min
9 bad byte counts
HTTP response codes:
code 200 — 369088
结果分析: 例如
219 fetches, 500 max parallel, 1.36262e+06 bytes, in 10.0008 seconds
219个请求,最大并发数500,总计传输的数据为1.36262e+06 bytes,运行时间10.0008秒
6222 mean bytes/connection
每一连接平均传输的数据量1.36262e+06/219=6222
21.8982 fetches/sec, 136251 bytes/sec
每秒的响应请求为21.8982,每秒传递的数据为136251btyes/sec
msecs/connect: 411.015 mean, 9080.76 max, 69.914 min
没连接的平均响应时间是411.015 means,最大响应时间9080.76 msecs,最小响应时间69.914 msecs
msecs/first-response: 148.292 mean, 3686.02 max, 70.624 min
HTTP response codes:
code 200 — 219
Webbench
参数说明:-c表示并发数,-t表示持续时间(秒)
Webbench –c 1000 –t 60 http://192.168.0.23/index.html
Webbench – Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://192.168.0.23/index.html
1000 clients, running 60 sec.
Speed=398317 pages/min, -17916648 bytes/sec.
Requests: 398284 susceed, 33 failed.
3. HAProxy测试
2.1 部署实施
- 安装
使用root用户登录192.168.0.9
依次运行以下命令:
Wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.21.tar.gz
1). 在haprxoy安装包目录下生成安装脚本haproxy_install.sh
#!/bin/bash
#install haproxy
#20111207 by dongnan
#variables
dir=/usr/local
ha_dir=${dir}/haproxy
ha_cfg=${ha_dir}/haproxy.cfg
kernel=`uname -r | grep ’2.6′`
pcre=$(rpm -qa | grep ‘pcre’ | wc -l)
echo “$dir, $ha_dir, $ha_cfg, $kernel, $pcre”
#check
if [ ! "$kernel" -o "$pcre" -lt "2" ];then
echo -e “the script need linux 2.6 kernel and pcre pcre-devel \nyou can usage ‘yum install pcre pcre-devel’ or ‘rpm -ivh pcre-devel-6.6-2.el5_1.7.x86_64.rpm’”
exit 1
fi
#function
install_ha_cfg (){
#configure haproxy.cfg
#default configure file for test,but need your change the frontend server and backend server ip address,
#good luck!
echo ‘
global
log 127.0.0.1 local0
maxconn 40960 #单个进程最大连接数
chroot /usr/local/haproxy #安装目录
uid 99 #用户haproxy
gid 99 #组haproxy
daemon #守护进程运行
nbproc 1 #进程数量
pidfile /usr/local/haproxy/logs/haproxy.pid #haproxy pid
defaults
log global
mode http #7层 http;4层tcp
option httplog #http 日志格式
option httpclose #主动关闭http通道
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option log-health-checks #记录健康检查日志
option dontlognull #不记录空连接
maxconn 30000 #最大连接数
contimeout 5000 #连接超时(毫秒)
clitimeout 50000 #客户端超时(毫秒)
srvtimeout 50000 #服务器超时(毫秒)
frontend haproxy_kx #定义前端服务器(haproxy)
bind 0.0.0.0:80 #监听地址
default_backend server_pool #指定后端服务器群
#errorfile 502 /usr/local/haproxy/html/maintain.html
#errorfile 503 /usr/local/haproxy/html/maintain.html
#errorfile 504 /usr/local/haproxy/html/maintain.html
backend server_pool #定义后端服务器群(web server/apache/nginx/iis..)
mode http
option forwardfor #后端服务器(apache/nginx/iis/*),从Http Header中获得客户端IP
#balance roundrobin #负载均衡的方式,轮询方式
balance leastconn #负载均衡的方式,最小连接
cookie SERVERID insert nocache #插入serverid到cookie中,serverid后面可以定义
#option httpchk HEAD /check.html #用来做健康检查html文档
server server1 192.168.0.14:80 cookie server1 check inter 2000 rise 3 fall 3 weight 3
server server2 192.168.0.15:80 cookie server2 check inter 2000 rise 3 fall 3 weight 3
#服务器定义:
#cookie server1表示serverid为server1;
#check inter 2000 是检测心跳频率(check 默认 );
#rise 3 表示 3次正确认为服务器可用;
#fall 3 表示 3次失败认为服务器不可用;
#weight 表示权重。
listen admin_stat #status
bind *:8080 #监听端口
mode http #http的7层模式
stats refresh 30s #统计页面自动刷新时间
stats uri /haproxy-stats #统计页面URL
stats realm Haproxy\ Statistics #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
stats hide-version #隐藏统计页面上HAProxy的版本信息
stats admin if TRUE #手工启用/禁用,后端服务器’ > “$ha_cfg” && sed -i ’1 d’ “$ha_cfg”
}
#install
if [ ! -e "$ha_dir" ];then
tar zxf haproxy*.tar.gz
cd haproxy*/
make TARGET=linux26 USE_STATIC_PCRE=1 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy && mkdir /usr/local/haproxy/{html,logs}
cd ../
#
if [ ! -e "$ha_dir" ];then
echo “error! can’t install haproxy please check ! Will now out of the script !”
exit 1
else
! grep ‘haproxy’ /etc/syslog.conf && echo ‘local1.* /var/log/haproxy.log’ >> /etc/syslog.conf
sed -ir ‘s/SYSLOGD_OPTIONS=”-m 0″/SYSLOGD_OPTIONS=”-r -m 0″/g’ /etc/sysconfig/syslog && /etc/init.d/syslog restart
install_ha_cfg
rm -rf haproxy*/
fi
else
echo “haproxy is already exists!”
fi
2). 运行脚本安装
sh haproxy_install.sh(注意脚本要和安装包在同一个目录下)
3). 主备双机热备部署
Root用户执行:
yum -y install heartbeat
yum -y install heartbeat
cp /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d/ #heartbeat主配置文件
cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/ #权限验证文件
cp /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d/ #资源配置文件,设置共享IP
cd /etc/ha.d
chmod 600 /etc/ha.d/authkeys
vi authkeys
auth 1
1 crc
vi ha.cf
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 10
warntime 5
initdead 120
udpport 694
ucast eth0 192.168.0.9 # 注意,此处各服务器上的配置不同,此参数应设置为另一台服务器的IP地址
auto_failback on
node HA01 #主服务器 uname –n 显示的主机名
node HA02#备服务器 uname –n 显示的主机名
vi haresources
HA01 IPaddr::192.168.0.24/32/eth0(HA01为主节点主机名,192.168.0.24为服务虚地址,32为掩码,eth0为接口)
chkconfig heartbeat on
service heartbeat start(注意先起主服务器heartbeat,等主服务虚地址启用后再起备服务器的heartbeat)
service heartbeat start
- 配置
1). 生成haproxy启动脚本haproxy.sh
内容如下:
# cat /usr/local/sbin/haproxy.sh
#!/bin/bash
#haproxy command
#ver:0.1bate
#20111129 by dongnan
#/usr/local/haproxy/sbin/haproxy
#HA-Proxy version 1.4.18 2011/09/16
#Copyright 2000-2011 Willy Tarreau <w@1wt.eu>
#
#Usage : haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ]
# [ -p <pidfile> ] [ -m <max megs> ]
# -v displays version ; -vv shows known build options.
# -d enters debug mode ; -db only disables background mode.
# -V enters verbose mode (disables quiet mode)
# -D goes daemon
# -q quiet mode : don’t display messages
# -c check mode : only check config files and exit
# -n sets the maximum total # of connections (2000)
# -m limits the usable amount of memory (in MB)
# -N sets the default, per-proxy maximum # of connections (2000)
# -p writes pids of all children to this file
# -de disables epoll() usage even when available
# -ds disables speculative epoll() usage even when available
# -dp disables poll() usage even when available
# -sf/-st [pid ]* finishes/terminates old pids. Must be last arguments.
#variables
haproxy_dir=/usr/local/haproxy/
haproxy_conf=${haproxy_dir}haproxy.cfg
haproxy_pid=${haproxy_dir}logs/haproxy.pid
haproxy_cmd=${haproxy_dir}sbin/haproxy
#test variables
#file $haproxy_dir; file $haproxy_conf; file $haproxy_cmd; file $haproxy_pid
if [ "$#" -eq "0" ];then
echo “usage: $0 {start|stop|restart}”
exit 1
fi
if [ "$1" = "start" ];then
#echo $1
$haproxy_cmd -f $haproxy_conf
elif [ "$1" = "stop" ];then
#echo $1
kill `cat $haproxy_pid`
elif [ "$1" = "restart" ];then
#echo $1
$haproxy_cmd -f $haproxy_conf -st `cat $haproxy_pid`
else
echo “usage: $0 arguments only start and stop or restart !”
fi
2). 更改文件
Chmod 777 haproxy_install.sh haproxy.sh
在haproxy安装包目录下执行安装脚本,安装完毕,更改haproxy.cfg配置文件
./haproxy_install.sh
vi /usr/local/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
maxconn 40960 #最大连接数
chroot /usr/local/haproxy #安装目录
uid 99 #用户haproxy
gid 99 #组haproxy
daemon #守护进程运行
nbproc 1 #进程数量
pidfile /usr/local/haproxy/logs/haproxy.pid #haproxy pid
defaults
log global
mode http #7层 http;4层tcp
option httplog #http 日志格式
option httpclose #主动关闭http通道
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option dontlognull
maxconn 30000 #最大连接数
contimeout 5000 #连接超时(毫秒)
clitimeout 50000 #客户端超时(毫秒)
srvtimeout 50000 #服务器超时(毫秒)
frontend haproxy_kx #定义前端服务器(haproxy)
bind 192.168.0.9:80 #监听地址
default_backend server_pool #指定后端服务器群
#errorfile 502 /usr/local/haproxy/html/maintain.html
#errorfile 503 /usr/local/haproxy/html/maintain.html
#errorfile 504 /usr/local/haproxy/html/maintain.html
backend server_pool #定义后端服务器群(web server/apache/nginx/iis..)
mode http
option forwardfor #后端服务器(apache/nginx/iis/*),从Http Header中获得客户端IP
#balance roundrobin #负载均衡的方式,轮询方式
balance leastconn #负载均衡的方式,最小连接
cookie SERVERID #插入serverid到cookie中,serverid后面可以定义
#option httpchk HEAD /check.html #用来做健康检查html文档
server server1 192.168.0.14:80 cookie server1 check inter 2000 rise 3 fall 3 weight 3
server server2 192.168.0.15:80 cookie server2 check inter 2000 rise 3 fall 3 weight 3
#server server3 10.0.1.254:80 cookie server3 check maxconn 90 rise 2 fall 3 weight 3
#服务器定义:
#cookie server1表示serverid为server1;
#check inter 2000 是检测心跳频率(check 默认 );
#rise 3 表示 3次正确认为服务器可用;
#fall 3 表示 3次失败认为服务器不可用;
#weight 表示权重。
listen admin_stat #status
bind *:8080 #监听端口
mode http #http的7层模式
stats refresh 30s #统计页面自动刷新时间
stats uri /haproxy-stats #统计页面URL
stats realm Haproxy\ Statistics #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
stats hide-version #隐藏统计页面上HAProxy的版本信息
stats admin if TRUE #手工启用/禁用,后端服务器
3). 启动haproxy
/usr/local/haproxy/haproxy.sh start
查看进程ps –ef | grep haproxy已经运行
- 验证
多次访问http://192.168.0.24显示相应页面即说明负载成功
访问http://192.168.0.24:8080/haproxy-stats 查看当前负载状态
默认用户admin 密码admin
2.2 功能测试
- 负载均衡测试
多次访问http://192.168.0.24显示realserver ip address 在192.168.0.14和
192.168.0.15之间切换
- 主备切换测试
主192.168.0.9上执行service heartbeat stop
虚IP 192.168.0.24漂移到192.168.0.10(备)上,访问服务http://192.168.0.24正常
主192.168.0.9上执行service heartbeat start
虚IP 192.168.0.24漂移回192.168.0.9(主)上,访问服务http://192.168.0.24正常
2.3 性能测试
- http性能测试
http_load
参数说明 –p 并发用户数 –f 总的访问次数 urllist1 http://192.168.0.24
测试1:
[root@HA010 ~]# http_load -p 1000 -f 20000 urllist1
20000 fetches, 1000 max parallel, 5.4e+06 bytes, in 5.08898 seconds
270 mean bytes/connection
3930.06 fetches/sec, 1.06112e+06 bytes/sec
msecs/connect: 2.59386 mean, 3000.77 max, 0.079 min
msecs/first-response: 143.209 mean, 3246.75 max, 1.292 min
HTTP response codes:
code 200 – 20000
测试2:
[root@HA010 ~]# http_load -p 1000 -f 30000 urllist1
30000 fetches, 1000 max parallel, 8.1e+06 bytes, in 8.2654 seconds
270 mean bytes/connection
3629.59 fetches/sec, 979989 bytes/sec
msecs/connect: 0.348845 mean, 1.385 max, 0.08 min
msecs/first-response: 145.923 mean, 6260.67 max, 5.663 min
HTTP response codes:
code 200 – 30000
测试3
http_load -p 1000 -f 50000 urllist1
总访问次数50000 并发1000 导致haproxy服务异常,realserver TCP连接大量time wait
Siege
参数说明 –c 并发用户数量 –r 重复测试次数 urllist1 http://192.168.0.24
测试1:
[root@HA010 ~]# siege -c 1000 -r 20 -f urllist1
** SIEGE 2.72
** Preparing 1000 concurrent users for battle.
The server is now under siege.. done.
Transactions: 20000 hits
Availability: 100.00 %
Elapsed time: 19.25 secs
Data transferred: 5.15 MB
Response time: 0.08 secs
Transaction rate: 1038.96 trans/sec
Throughput: 0.27 MB/sec
Concurrency: 78.64
Successful transactions: 20000
Failed transactions: 0
Longest transaction: 3.24
Shortest transaction: 0.00
测试2:
[root@HA010 ~]# siege -c 1000 -r 30 -f urllist1
** SIEGE 2.72
** Preparing 1000 concurrent users for battle.
The server is now under siege.. done.
Transactions: 30000 hits
Availability: 100.00 %
Elapsed time: 26.16 secs
Data transferred: 7.72 MB
Response time: 0.06 secs
Transaction rate: 1146.79 trans/sec
Throughput: 0.30 MB/sec
Concurrency: 65.63
Successful transactions: 30000
Failed transactions: 0
Longest transaction: 3.15
Shortest transaction: 0.00
测试3:
[root@HA010 ~]# siege -c 1000 -r 50 -f urllist1
** SIEGE 2.72
** Preparing 1000 concurrent users for battle.
The server is now under siege…[error] socket: unable to connect sock.c:222: Connection timed out
[error] socket: unable to connect sock.c:222: Connection timed out
siege aborted due to excessive socket failure; you
can change the failure threshold in $HOME/.siegerc
Transactions: 37886 hits
Availability: 95.08 %
Elapsed time: 58.34 secs
Data transferred: 9.95 MB
Response time: 0.42 secs
Transaction rate: 649.40 trans/sec
Throughput: 0.17 MB/sec
Concurrency: 275.07
Successful transactions: 37886
Failed transactions: 1960
Longest transaction: 18.00
Shortest transaction: 0.00
5%访问无法响应
总访问次数50000 并发1000 导致haproxy服务异常,realserver TCP连接大量time wait
4. Ospf测试
3.1 部署实施
- 安装
Web服务器192.168.0.14、192.168.0.15上安装quagga软件
Yum install quagga
- 配置
1). 配置web服务器quagga
使用root用户登录192.168.0.14和192.168.0.15
cd /etc/quagga
cp ospfd.conf.sample ospfd.conf
chkconfig zebra on
chkconfig ospfd on
service zebra start
service ospfd start
telnet localhost ospfd
输入默认密码zebra
ospfd> en
ospfd# conf t
ospfd(config)# router ospf
ospfd(config-router)# router-id 192.168.2.66
ospfd(config-router)# network 192.168.0.23/32 area 0.0.0.0(lo IP)
ospfd(config-router)# network 192.168.2.64/30 area 0.0.0.0(接口IP)
ospfd(config-router)#end
ospfd#wr
2). 配置交换机端
根据交换机类型配置ospf与主机quagga建立ospf邻居关系
3). 配置主机
使用root用户分别在2台web服务上执行以下命令
ifconfig lo:0 192.168.0.23 netmask 255.255.255.255 up
- 验证
多次访问http://192.168.0.23显示相应页面即说明负载成功
3.2 功能测试
- 负载均衡测试
多次访问http://192.168.0.23显示realserver ip address 在192.168.0.14和
192.168.0.15之间切换
- 服务切换测试
Down掉192.168.0.14/15上的服务IP 192.168.0.23可以正常访问应用
3.3 性能测试
- http性能测试
http_load
参数说明 –p 并发用户数 –f 总的访问次数 urllist1 http://192.168.0.23
测试1:
[root@HA010 ~]# http_load -p 1000 -f 20000 urllist2
20000 fetches, 1000 max parallel, 5.4e+06 bytes, in 5.16173 seconds
270 mean bytes/connection
3874.67 fetches/sec, 1.04616e+06 bytes/sec
msecs/connect: 128.888 mean, 3001.72 max, 0.068 min
msecs/first-response: 25.953 mean, 3031.86 max, 0.63 min
HTTP response codes:
code 200 – 20000
测试2:
[root@HA010 ~]# http_load -p 1000 -f 30000 urllist2
30000 fetches, 1000 max parallel, 8.1e+06 bytes, in 5.72167 seconds
270 mean bytes/connection
5243.23 fetches/sec, 1.41567e+06 bytes/sec
msecs/connect: 84.9997 mean, 3001.48 max, 0.062 min
msecs/first-response: 18.0883 mean, 2813.84 max, 0.605 min
HTTP response codes:
code 200 – 30000
测试3:
[root@HA010 ~]# http_load -p 1000 -f 50000 urllist2
50000 fetches, 1000 max parallel, 1.35e+07 bytes, in 8.0187 seconds
270 mean bytes/connection
6235.43 fetches/sec, 1.68356e+06 bytes/sec
msecs/connect: 101.749 mean, 3001.27 max, 0.07 min
msecs/first-response: 16.8017 mean, 1964.43 max, 0.601 min
HTTP response codes:
code 200 – 50000
总访问次数50000 并发1000,有TCP time wait,但http_load返回正常
测试4:
[root@HA010 ~]# http_load -p 1000 -f 100000 urllist2
总访问次数100000 并发1000 导致TCP连接大量time wait
Siege
参数说明 –c 并发用户数量 –r 重复测试次数 urllist1 http://192.168.0.23
测试1:
[root@HA010 ~]# siege -c 1000 -r 20 -f urllist2
** SIEGE 2.72
** Preparing 1000 concurrent users for battle.
The server is now under siege.. done.
Transactions: 20000 hits
Availability: 100.00 %
Elapsed time: 19.16 secs
Data transferred: 5.15 MB
Response time: 0.03 secs
Transaction rate: 1043.84 trans/sec
Throughput: 0.27 MB/sec
Concurrency: 30.30
Successful transactions: 20000
Failed transactions: 0
Longest transaction: 3.01
Shortest transaction: 0.00
测试2:
[root@HA010 ~]# siege -c 1000 -r 30 -f urllist2
** SIEGE 2.72
** Preparing 1000 concurrent users for battle.
The server is now under siege.. done.
Transactions: 30000 hits
Availability: 100.00 %
Elapsed time: 24.14 secs
Data transferred: 7.72 MB
Response time: 0.01 secs
Transaction rate: 1242.75 trans/sec
Throughput: 0.32 MB/sec
Concurrency: 15.34
Successful transactions: 30000
Failed transactions: 0
Longest transaction: 3.00
Shortest transaction: 0.00
测试3:
[root@HA010 ~]# siege -c 1000 -r 50 -f urllist2
** SIEGE 2.72
** Preparing 1000 concurrent users for battle.
The server is now under siege.. done.
Transactions: 50000 hits
Availability: 100.00 %
Elapsed time: 37.18 secs
Data transferred: 12.87 MB
Response time: 0.01 secs
Transaction rate: 1344.81 trans/sec
Throughput: 0.35 MB/sec
Concurrency: 9.42
Successful transactions: 50000
Failed transactions: 0
Longest transaction: 3.01
Shortest transaction: 0.00
总访问次数50000 并发1000,有TCP time wait,但siege返回正常
测试4:
[root@HA010 ~]# siege -c 1000 -r 100 -f urllist2
** SIEGE 2.72
** Preparing 1000 concurrent users for battle.
The server is now under siege.. done.
Transactions: 100000 hits
Availability: 100.00 %
Elapsed time: 66.28 secs
Data transferred: 25.75 MB
Response time: 0.01 secs
Transaction rate: 1508.75 trans/sec
Throughput: 0.39 MB/sec
Concurrency: 9.66
Successful transactions: 100000
Failed transactions: 0
Longest transaction: 3.02
Shortest transaction: 0.00
总访问次数100000 并发1000,有TCP time wait,但siege返回正常
三. 方案对比
方案名称 |
HAProxy |
Ospf(ECMP) |
LVS |
方案复杂度 |
简单 |
简单 |
略复杂 |
实施难度 |
简单 |
简单 |
困难 |
会话保持 |
有 |
无 |
有 |
监控统计 |
有监控统计界面 |
无 |
无 |
主备冗余 |
有 |
无 |
有 |
性能 |
中 |
好 |
好 |
四. 附录
- 测试用PHP主页代码
<?php
session_start();
$_SESSION['time'] =date(“Y:m:d:H:s”,time());
echo “time”.”<font color=red>”.$_SESSION['time'].”</font>”.”<br>”;
echo “realserver ip address”.”<font color=red>”.$_SERVER['SERVER_ADDR'].”</font>”.”<br>”;
echo “local address”.”<font color=red>”.$_SERVER['SERVER_NAME'].”</font>”.”<br>”;
echo “SESSIONNAME”.”<font color=red>”.session_name().”</font>”.”<br>”;
echo “SESSIONID”.”<font color=red>”.session_id().”</font>”.”<br>”;
?>
查看主机TCP连接情况 netstat -nat|awk ‘{print awk $NF}’|sort|uniq -c|sort -n
转自:http://www.anste.com/blog/67