目录
HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。
1.LVS Nginx Haproxy 的区别
- 负载均衡性能: [硬件负载均衡器F5 >] LVS 最好 > Haproxy 其次 > Nginx 弱于其它两种
- 支持的代理类型:LVS基于Linux系统内核实现的软负载均衡,只支持4层代理的IP转发,不支持正则匹配
- Haproxy和Nginx基于应用程序实现的软负载均衡,都能支持4层和7层代理转发,支持正则匹配
- 支持的节点健康检查方式:LVS可以配合keepalived实现支持对TCP端口和URL路径方式的健康检查
- Nginx默认情况下只支持被动健康检查,主动健康检查模块需要依赖第三方模块
- Haproxy支持TCP端口、URL路径、脚本等方式的健康检查
2.haproxy的调度算法
Haproxy 有 8 种调度算法:
- roundrobin 轮询
- static-rr 加权轮询
- leastconn 最小连接
- source 根据源地址哈希
- uri 根据请求的URI地址哈希
- url_param 根据请求的URL参数哈希
- hdr(name) 根据请求头哈希
- rdp-cookie(name) 根据cookie的key哈希
3.Haproxy 的会话保持
- 源地址hash
- 设置cookie
- 会话粘性表stick-table
4.Haproxy搭建 Web 群集
Haproxy服务器:192.168.64.10
Nginx 服务器1:192.168.64.40
Nginx 服务器2:192.168.64.50
1.haproxy 服务器部署
1.获取安装包
cd /opt
wget http://www.haproxy.org/download/2.8/src/haproxy-2.8.3.tar.gz
# 将安装Haproxy所需软件包传到/opt目录下
2.编译安装haproxy
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-2.8.3.tar.gz
cd haproxy-2.8.3/
make TARGET=linux-glibc PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
# 编译安装haproxy
3.修改haproxy服务器配置
useradd -M -s /sbin/nologin haproxy
mkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf
vim haproxy.cfg
global
log 127.0.0.1 local3
maxconn 4096
user nobody
group nobody
daemon
defaults
log global
mode http
maxconn 2048
retries 3
option redispatch
stats uri /haproxy
stats auth qianfeng:123
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http-in
bind *:80
acl url_jsp path_end -i .jsp
use_backend tomcat_server if url_jsp
default_backend nginx_server
backend nginx_server
balance roundrobin
option httpchk GET /test.html
server ngx01 192.168.64.40:80 check inter 2000 fall 3 rise 2
server ngx02 192.168.64.50:80 check inter 2000 fall 3 rise 2
backend tomcat_server
balance roundrobin
option http-server-close
cookie HA_STICKY_dy insert indirect nocache
server tomcat01 192.168.64.20:8080 cookie tomcat01 check inter 2000 fall 3 rise 2
server tomcat02 192.168.64.30:8080 cookie tomcat02 check inter 2000 fall 3 rise 2
# 修改haproxy服务器配置
4.添加haproxy 系统服务
vim /etc/init.d/haproxy
#!/bin/bash
#chkconfig: 2345 90 30
#description: Haproxy Service Control Script
PROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/conf/$PROGNAME.cfg
PIDFILE=/var/run/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
start()
{
echo -e "Starting $DESC: $PROGNAME\n"
$DAEMON -f $CONFIG
echo "......"
}
stop()
{
echo -e "Stopping $DESC: $PROGNAME\n"
haproxy_pid="$(cat $PIDFILE)"
kill $haproxy_pid
echo "......"
}
restart()
{
echo -e "Restarting $DESC: $PROGNAME\n"
$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
echo "......"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}"
exit 1
;;
esac
exit 0
cd /etc/init.d/
chmod +x haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
service haproxy start 或 /etc/init.d/haproxy start
2.节点服务器部署
yum install -y pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
make && make install
# 以上两个服务器同时配置
# 以下分开配置
--192.168.64.40---
echo "this is pc web" > /usr/local/nginx/html/test.html
--192.168.64.50---
echo "this is mo web" > /usr/local/nginx/html/test.html
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx
#启动nginx 服务
3.测试 Web群集
浏览器访问 http://192.168.64.10/test.html 并不断刷新
5.定义日志
vim /usr/local/haproxy/conf/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
# 在global下添加日志存放位置
# 将 haproxy 的 info 及 notice 日志分别记录到不同的日志文件中
defaults
log global
vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
# 需要修改rsyslog配置
service rsyslog restart
service haproxy restart
tail -f /var/log/haproxy/haproxy-info.log
# 查看haproxy的访问请求日志信息
6.keepalive和haproxy高可用
配置主备keepalive服务器
yum install -y keepalived
vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
if ! killall -0 haproxy; then
systemctl stop keepalived
fi
# 使用killall -0检查haproxy实例是否存在,性能高于ps命令
chmod +x /etc/keepalived/check_haproxy.sh
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_HA1 #虚拟路由名称
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh" #指定健康检查脚本
interval 2 #脚本运行周期
weight 2 #每次检查的加权权重值
}
# HAProxy健康检查配置
vrrp_instance VI_1 {
state MASTER #本机实例状态,MASTER/BACKUP,备机配置文件中设置BACKUP
interface ens33 #本机网卡名称,使用ifconfig命令查看
virtual_router_id 51 #虚拟路由编号,主备机保持一致
priority 100 #本机初始权重,备机设置小于主机的值
advert_int 1 #争抢虚地址的周期,秒
virtual_ipaddress {
192.168.64.100 #虚地址IP,主备机保持一致
}
track_script {
chk_haproxy #对应的健康检查配置
}
}
# 虚拟路由配置
systemctl start keepalived
ip a
7.内核优化
vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
#开启重用。允许将TIME-WAITsockets重用于新的TCP连接,默认0,表示关闭;
net.ipv4.ip_local_port_range = 1024 65535
#用于向外连接的端口范围。缺省情况下很小
net.ipv4.tcp_max_syn_backlog = 10240
#SYN队列长度,记录尚未收到客户端确认信息的连接请求的最大值。默认为1024,加大队列长度可容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT最大数量,如果超过,TIME_WAIT将立刻被清除并打印警告信息。默认180000,此项参数可控制TIME_WAIT 最大数量
net.ipv4.tcp_max_orphans = 3276800
#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上,如超过,连接将即刻被复位并打印警告信息,这个限制仅是为防止简单的DoS攻击,不能过分依靠它或人为减小这个值,更应该增加这个值(如果增加内存后)
net.ipv4.tcp_synack_retries = 3
#为打开对端的连接,内核需发送个SYN并附带个回应前一个SYN的ACK。即三次握手中的第二次握手。该设置决定内核放弃连接前发SYN+ACK包的数量。
net.core.somaxconn = 32768
#如web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而 nginx 定义的 NGX_LISTEN_BACKLOG 默认511,所以有必要调整这个值。