haproxy

目录

1.LVS  Nginx  Haproxy 的区别

2.haproxy的调度算法

3.Haproxy 的会话保持

4.Haproxy搭建 Web 群集

1.haproxy 服务器部署

1.获取安装包 

 2.编译安装haproxy

 3.修改haproxy服务器配置

4.添加haproxy 系统服务 

2.节点服务器部署

 3.测试 Web群集

5.定义日志

6.keepalive和haproxy高可用 

7.内核优化


HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。

1.LVS  Nginx  Haproxy 的区别

  1. 负载均衡性能: [硬件负载均衡器F5 >] LVS 最好 >  Haproxy 其次 > Nginx 弱于其它两种
  2. 支持的代理类型:LVS基于Linux系统内核实现的软负载均衡,只支持4层代理的IP转发,不支持正则匹配
  3. Haproxy和Nginx基于应用程序实现的软负载均衡,都能支持4层和7层代理转发,支持正则匹配
  4. 支持的节点健康检查方式:LVS可以配合keepalived实现支持对TCP端口和URL路径方式的健康检查
  5. Nginx默认情况下只支持被动健康检查,主动健康检查模块需要依赖第三方模块
  6. 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 的会话保持

  1. 源地址hash
  2. 设置cookie
  3. 会话粘性表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

haproxy_第1张图片

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  并不断刷新

haproxy_第2张图片

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

haproxy_第3张图片 

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的访问请求日志信息

haproxy_第4张图片

haproxy_第5张图片

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,所以有必要调整这个值。

你可能感兴趣的:(linux,运维,haproxy)