HAProxy是一款开源的高性能的代理转发软件,提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。用途最多的还是将它用着前端的负载均衡器,他可以提供第4层和第7层的负载,用的最多还是第7层(mode http),HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
关于性能方面,haproxy 官方说同等条件下lvs>haproxy>nginx 原因lvs的转发直接在内核空间完成,haproxy 和nginx 还需要使用用户空间的资源,而相对于nginx haproxy调用的资源比较少而已
[img]http://dl2.iteye.com/upload/attachment/0113/0544/d0ace760-3eac-32b3-871f-4ca515bbc92f.png[/img]
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。
[img]http://dl2.iteye.com/upload/attachment/0113/0546/4ef41026-f6d2-3eb6-a133-e9f647123793.png[/img]
[b]软件下载:[/b]
下载地址:http://www.haproxy.org/download/1.5/src/haproxy-1.5.5.tar.gz
[b]依赖包安装:[/b]
# yum install gcc gcc-c++ make zlib-devel bzip2-devel openssl-devel
[b]haproxy安装:[/b]
# tar -zvxf haproxy-1.5.5.tar.gz
# cd haproxy-1.5.5
# uname -a ## 查看linux内核版本
# make TARGET=linux26 PREFIX=/usr/local/haproxy-1.5.5
# make install PREFIX=/usr/local/haproxy-1.5.5
编辑启动文件:
# vi /etc/init.d/haproxy --添加以下内容
#!/bin/sh
#
# haproxy
#
# haproxy starting and stopping the haproxy load balancer
#
# chkconfig: 345 55 45
# description: HAProxy is a free, very fast and reliable solution
# offering high availability, load balancing, and
# proxying for TCP and HTTP-based applications
# config: /etc/haproxy/haproxy.cfg
# pidfile: /var/run/haproxy.pid
# probe: true
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /usr/local/haproxy-1.5.5/sbin/haproxy ] || exit 0
[ -f /etc/haproxy/haproxy.conf ] || exit 0
# Define our actions
checkconfig() {
# Check the config file for errors
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -f /etc/haproxy/haproxy.conf
if [ $? -ne 0 ]; then
echo "Errors found in configuration file."
return 1
fi
# We're OK!
return 0
}
start() {
# Check config
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -f /etc/haproxy/haproxy.conf
if [ $? -ne 0 ]; then
echo "Errors found in configuration file."
return 1
fi
echo -n "Starting HAProxy: "
daemon /usr/local/haproxy-1.5.5/sbin/haproxy -D -f /etc/haproxy/haproxy.conf -p /var/run/haproxy.pid
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/haproxy
return $RETVAL
}
stop() {
echo -n "Shutting down HAProxy: "
killproc haproxy -USR1
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/haproxy
[ $RETVAL -eq 0 ] && rm -f /var/run/haproxy.pid
return $RETVAL
}
restart() {
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -f /etc/haproxy/haproxy.conf
if [ $? -ne 0 ]; then
echo "Errors found in configuration file."
return 1
fi
stop
start
}
check() {
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -V -f /etc/haproxy/haproxy.conf
}
rhstatus() {
status haproxy
}
reload() {
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -f /etc/haproxy/haproxy.conf
if [ $? -ne 0 ]; then
echo "Errors found in configuration file."
return 1
fi
echo -n "Reloading HAProxy config: "
/usr/local/haproxy-1.5.5/sbin/haproxy -f /etc/haproxy/haproxy.conf -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
success $"Reloading HAProxy config: "
echo
}
# Possible parameters
case "$1" in
start)
start
;;
stop)
stop
;;
status)
rhstatus
;;
restart)
restart
;;
reload)
reload
;;
checkconfig)
check
;;
*)
echo "Usage: haproxy {start|stop|status|restart|reload|checkconfig}"
exit 1
esac
exit 0
[b]授权:[/b]
# chmod +x /etc/init.d/haproxy
[b]编辑haproxy配置文件:[/b]
# mkdir /etc/haproxy
# vi /etc/haproxy/haproxy.conf
global
maxconn 4096 #默认最大连接数
pidfile /var/run/haproxy.pid #haproxy的pid存放路径
daemon #以后台形式运行haproxy
nbproc 1 #进程数量
defaults
log global
mode http #所处理的类别 (#7层 http;4层tcp )
retries 3 #三次连接失败就认为是服务器不可用
option httplog
option httpclose
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
maxconn 4096 #最大连接数
timeout connect 50000 #连接超时
timeout client 50000 #客户端超时
timeout server 50000 #服务器超时
balance roundrobin #默认的负载均衡的方式,轮询方式
listen mysql_proxy
bind *:3366 #监听端口
mode tcp #tcp的4层模式
balance roundrobin
option tcpka
option httpchk
server mysqldb1 172.16.10.70:3306 weight 1 #weight代表权重
server mysqldb1 172.16.10.71:3306 weight 1 #weight代表权重
listen stats
bind *:8888
mode http
option httplog
option httpclose
balance roundrobin
stats refresh 5s
stats uri / #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
stats realm Haproxy\ Statistics
stats auth admin:admin #账号密码
[b]启动并检查:[/b]
# service haproxy start
# netstat -plantu | grep 3366
tcp 0 0 0.0.0.0:3366 0.0.0.0:* LISTEN 23626/haproxy
关于性能方面,haproxy 官方说同等条件下lvs>haproxy>nginx 原因lvs的转发直接在内核空间完成,haproxy 和nginx 还需要使用用户空间的资源,而相对于nginx haproxy调用的资源比较少而已
[img]http://dl2.iteye.com/upload/attachment/0113/0544/d0ace760-3eac-32b3-871f-4ca515bbc92f.png[/img]
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。
[img]http://dl2.iteye.com/upload/attachment/0113/0546/4ef41026-f6d2-3eb6-a133-e9f647123793.png[/img]
[b]软件下载:[/b]
下载地址:http://www.haproxy.org/download/1.5/src/haproxy-1.5.5.tar.gz
[b]依赖包安装:[/b]
# yum install gcc gcc-c++ make zlib-devel bzip2-devel openssl-devel
[b]haproxy安装:[/b]
# tar -zvxf haproxy-1.5.5.tar.gz
# cd haproxy-1.5.5
# uname -a ## 查看linux内核版本
# make TARGET=linux26 PREFIX=/usr/local/haproxy-1.5.5
# make install PREFIX=/usr/local/haproxy-1.5.5
编辑启动文件:
# vi /etc/init.d/haproxy --添加以下内容
#!/bin/sh
#
# haproxy
#
# haproxy starting and stopping the haproxy load balancer
#
# chkconfig: 345 55 45
# description: HAProxy is a free, very fast and reliable solution
# offering high availability, load balancing, and
# proxying for TCP and HTTP-based applications
# config: /etc/haproxy/haproxy.cfg
# pidfile: /var/run/haproxy.pid
# probe: true
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /usr/local/haproxy-1.5.5/sbin/haproxy ] || exit 0
[ -f /etc/haproxy/haproxy.conf ] || exit 0
# Define our actions
checkconfig() {
# Check the config file for errors
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -f /etc/haproxy/haproxy.conf
if [ $? -ne 0 ]; then
echo "Errors found in configuration file."
return 1
fi
# We're OK!
return 0
}
start() {
# Check config
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -f /etc/haproxy/haproxy.conf
if [ $? -ne 0 ]; then
echo "Errors found in configuration file."
return 1
fi
echo -n "Starting HAProxy: "
daemon /usr/local/haproxy-1.5.5/sbin/haproxy -D -f /etc/haproxy/haproxy.conf -p /var/run/haproxy.pid
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/haproxy
return $RETVAL
}
stop() {
echo -n "Shutting down HAProxy: "
killproc haproxy -USR1
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/haproxy
[ $RETVAL -eq 0 ] && rm -f /var/run/haproxy.pid
return $RETVAL
}
restart() {
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -f /etc/haproxy/haproxy.conf
if [ $? -ne 0 ]; then
echo "Errors found in configuration file."
return 1
fi
stop
start
}
check() {
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -V -f /etc/haproxy/haproxy.conf
}
rhstatus() {
status haproxy
}
reload() {
/usr/local/haproxy-1.5.5/sbin/haproxy -c -q -f /etc/haproxy/haproxy.conf
if [ $? -ne 0 ]; then
echo "Errors found in configuration file."
return 1
fi
echo -n "Reloading HAProxy config: "
/usr/local/haproxy-1.5.5/sbin/haproxy -f /etc/haproxy/haproxy.conf -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
success $"Reloading HAProxy config: "
echo
}
# Possible parameters
case "$1" in
start)
start
;;
stop)
stop
;;
status)
rhstatus
;;
restart)
restart
;;
reload)
reload
;;
checkconfig)
check
;;
*)
echo "Usage: haproxy {start|stop|status|restart|reload|checkconfig}"
exit 1
esac
exit 0
[b]授权:[/b]
# chmod +x /etc/init.d/haproxy
[b]编辑haproxy配置文件:[/b]
# mkdir /etc/haproxy
# vi /etc/haproxy/haproxy.conf
global
maxconn 4096 #默认最大连接数
pidfile /var/run/haproxy.pid #haproxy的pid存放路径
daemon #以后台形式运行haproxy
nbproc 1 #进程数量
defaults
log global
mode http #所处理的类别 (#7层 http;4层tcp )
retries 3 #三次连接失败就认为是服务器不可用
option httplog
option httpclose
option redispatch #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
maxconn 4096 #最大连接数
timeout connect 50000 #连接超时
timeout client 50000 #客户端超时
timeout server 50000 #服务器超时
balance roundrobin #默认的负载均衡的方式,轮询方式
listen mysql_proxy
bind *:3366 #监听端口
mode tcp #tcp的4层模式
balance roundrobin
option tcpka
option httpchk
server mysqldb1 172.16.10.70:3306 weight 1 #weight代表权重
server mysqldb1 172.16.10.71:3306 weight 1 #weight代表权重
listen stats
bind *:8888
mode http
option httplog
option httpclose
balance roundrobin
stats refresh 5s
stats uri / #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
stats realm Haproxy\ Statistics
stats auth admin:admin #账号密码
[b]启动并检查:[/b]
# service haproxy start
# netstat -plantu | grep 3366
tcp 0 0 0.0.0.0:3366 0.0.0.0:* LISTEN 23626/haproxy