LVS+Haproxy

LVS+Haproxy

一、Haproxy简介

Haproxy 是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

1.1、Haproxy应用分析

  • LVS在企业应用中抗负载能力很强,但存在不足

    • LVS不支持正则处理,不能实现动静分离

    • 对于大型网站,LVS的实施配置复杂,维护成本相对较高

  • Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理软件

    • 适用于负载大的web站点
    • 运行在硬件上可支持数以万计的并发连接的连接请求

1.2、Haproxy的特性

  1. 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美
  2. 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s
  3. 支持多达8 种负载均衡算法,同时也支持会话保持
  4. 支持虚拟主机功能,从而实现web负载均衡更加灵活
  5. 支持连接拒绝、全透明代理等独特功能
  6. 拥有强大的ACL支持,用于访问控制
  7. 其独特的弹性二叉树数据结构,使数据结构的复杂性上升到了0(1),即数据的查询速度不会随着数据条目的增加而速度有所下降
  8. 支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源量费,让多个请求在一个tcp连接中完成
  9. 支持TCP加速,零复制功能,类似于mmap机制
  10. 支持响应池(response buffering)
  11. 支持RDP协议
  12. 基于源的粘性,类似于nginx的ip_hash功能,把自同一客户端的请求在一定时间内始终调度到上游的同一服务器
  13. 更好统计数据接口,其web接口显示后端冀全中各个服务器的接受、发送、拒绝、错误等数据的统计信息
  14. 详细的健康状态检测,web接口中有关对上流服务器的健康检测状态,并提供了一定的管理功能
  15. 基于流量的健康评估机制
  16. 基于http认证
  17. 基于命令行的管理接口
  18. 日志分析器,可对日志进行分析

1.3、常见负载均衡策略

Haproxy支持多种调度算法,最常用的有8种
1)RR(Round Robin)

RR算法是最简单最常用的一种算法,即轮询调度

理解举例:有三个节点A、B、C

第一个用户访问会被指派到节点A

第二个用户访问会被指派到节点B

第三个用户访问会被指派到节点C

第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果

2)LC(Least Connections)

1.最小连接数算法,根据后端的节点连接数大小动态分配前端请求

2.理解举例: 有三个节点A、B、C,各节点的连接数分别为A:4 B:5 C:6

3.第一个用户连接请求,会被指派到A上,连接数变为A:5 B:5 C:6

4.第二个用户请求会继续分配到A上,连接数变为A:6 B:5 C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端

3.由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况

4.此算法相比较rr算法有很大改进,是米钱用到比较多的一种算法
3)SH(Source Hashing)

基于来源访问调度算法,用于一些有Session会话记录在服务端的场景,可以基于来源的IP、Cookie等做集群调度

理解举例 有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被指派到了B

当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡器不重启,第一个用户都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度

此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用
4)uri

表示根据请求的URI,做cdn需使用
5)url_param

表示根据HTTP请求头来锁定每 一 次HTTP请求。

6)rdp---cookie(name)

表示根据据cookie (name)来锁定并哈希每一次TCP请求。

7) source

表示根据请求的源IP,类似Nginx的IP hash机制。

8) static-rr

表示根据权重,轮询

1.4、LVS、Haproxy、Nginx区别

  • LVS基于Linux操作系统实现软负载均衡,而Haproxy和Nginx是基于第三方应用实现的软负载均衡

  • LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而实现Haproxy和Nginx都可以实现4层和7层技术,Haproxy可提供TCP和Http应用的负载均衡综合解决方案

  • LVS因为工作在ISO模型的第四层,其状态监测功能单一,而Haproxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态监测方式

  • Haproxy功能强大,但整体性能低于4层模式的LVS负载均衡

  • Nginx主要用于web服务器或缓存服务器

1.5、 Haproxy的优点

  • Haproxy也是支持虚拟主机的

  • Haproxy支持8种负载均衡器策略

  • Haproxy的优点能补充nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定url来检测后端服务器的状态

  • Haproxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲Haproxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的

  • Haproxy支持TCP协议的负载均衡转发

1.6、常见的Web集群调度器

  • 目前常见的Web集群调度器分为软件和硬件

  • 软件通常使用开源的LVS、Haproxy、Nginx

  • 硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等

二、Haproxy部署实例

Keepalived+Haproxy 实现负载均衡+动静分离

名称 IP地址

HAproxy-Master 192.168.2.100
HAproxy-Backup 192.168.2.106
Web-A 192.168.2.103
Web-B 192.168.2.104
Tomcat1 192.168.2.102
Tomcat2 192.168.2.105

编译安装Haproxy

bash 复制代码
#获取安装包
wget https://www.haproxy.org/download/2.8/src/haproxy-2.8.3.tar.gz  
#解压
tar zxvf haproxy-2.8.3.tar.gz

cd haproxy-2.8.3/

#编译
make TARGET=linux31 PREFIX=/usr/local/haproxy 
make install PREFIX=/usr/local/haproxy


#新建管理用户
useradd -M -s /sbin/nologin haproxy

mkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf

修改Haproxy配置文件,配置前后端,分别处理动态资源和静态资源

bash 复制代码
#配置文件
vim haproxy.cfg

global		
    log 127.0.0.1 local0 info
    log 127.0.0.1 local1 warning	
	
    maxconn 30000


    pidfile     /var/run/haproxy.pid
    user haproxy
    group haproxy
    daemon
    spread-checks 2
    
defaults   
    log     global
    mode    http #七层代理
    option  http-keep-alive
    option  forwardfor
    option  httplog
    option  dontlognull
    option  redispatch
    option  abortonclose
    maxconn 20000
    retries 3
    timeout http-request 2s
    timeout queue 3s
    timeout connect 1s
    timeout client 10s
    timeout server 2s
    timeout http-keep-alive 10s
    timeout check 2s

#前端配置,根据用户的访问请求,跳转到对应的后端?
frontend http-in 
    #监听地址 
    bind *:80
    acl dynamic   path_end  -i .jsp
    use_backend tomcat_server if dynamic

    #都没匹配到,跳转到默认
    default_backend nginx_servers

backend tomcat_server
    balance roundrobin
    option http-server-close
    cookie HA_STICKY_dy insert indirect nocache
    server tomcat1 192.168.2.102:8080 cookie tomcat1 inter 2000 rise 2 fall 3
    server tomcat2 192.168.2.105:8080 cookie tomcat2 check
    

backend nginx_servers
    balance roundrobin
    #节点服务器根目录下要有此文件
    option httpchk     GET /test.html     
    server nginx1 192.168.2.103:80 check inter 2000 rise 2 fall 3
    server nginx2 192.168.2.104:80 check inter 2000 rise 2 fall 3

listen stats
    bind *:1080
    stats enable
    stats refresh 30s
    stats uri /stats
    stats realm HAProxy\ Stats
    stats auth admin:admin

添加haproxy 系统服务

bash 复制代码
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

#补充知识
chkconfig --list haproxy 
chkconfig --level 3 5 haproxy on 

部署Tomcat并配置动态页面

bash 复制代码
#动态资源
tar xf ap..
cd ap..
mv ap..  /usr/local/tomcat 
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   
</head>
<body>
<% out.println("动态页面 1,https://blog.csdn.net/q2524607033?type=blog");%>
</body>
</html>


#Tomcat2 
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   
</head>
<body>
<% out.println("动态页面 1,https://blog.csdn.net/q2524607033?type=blog");%>
</body>
</html>


bash 复制代码
#启动tomcat,测试动态页面
/usr/local/tomcat/bin/startup.sh

192.168.2.102:8080/test/index.jsp
192.168.2.105:8080/test/index.jsp

安装keepalived

bash 复制代码
#安装keepalive
yum install -y keepalived


#写检测脚本
vim /etc/keepalived/ch.sh

#!/bin/bash
#使用killall -0检查haproxy实例是否存在,性能高于ps命令
if ! killall -0 haproxy; then
  systemctl stop keepalived
fi

chmod +x /etc/keepalived/check_haproxy.sh

编写Keepalived配置文件,确定主备

bash 复制代码
#主服务器
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id LVS_HA1    #虚拟路由名称
}

#HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "/etc/keepalived/ch.sh"    #指定健康检查脚本
    interval 2                                   #脚本运行周期
    weight 2                                     #每次检查的加权权重值
}

#虚拟路由配置
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.2.188        #虚地址IP,主备机保持一致
    }
    track_script {
        chk_haproxy           #对应的健康检查配置
    }
}


systemctl start keepalived

ip addr

备服务器的配置类似

效果测试

动静分离+负载均衡测试

高可用测试


四、日志定义优化

复制代码
默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中。
需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
bash 复制代码
1. #修改配置文件
vim /etc/haproxy/haproxy.cfg
global
	    log 192.168.59.118      local6 info
    	log /dev/log            local0 notice
	
2. #修改rsyslog配置
vim /etc/rsyslog.conf
14 # Provides UDP syslog reception
15 $ModLoad imudp  #注释掉
16 $UDPServerRun 514   #注释掉
...
74 local6.*                                                /var/log/haproxy.log
 
 
3. # 重启服务
systemctl restart rsyslog.service 
service haproxy restart
 
4. #查看haproxy的访问请求日志信息
访问网页后查看日志
tail -f /var/log/haproxy.log 

修改配置文件

修改rsyslog配置

重启服务

查看haproxy的访问请求日志信息

相关推荐
新加坡内哥谈技术13 分钟前
Meta计划借助AI实现广告创作全自动化
运维·人工智能·自动化
zyjyyds11319 分钟前
win11系统 Docker Desktop 突然提示Docker Engine stopped解决情况之一
运维·docker·容器
Altairr20 分钟前
Docker基础(一)
运维·docker·容器·eureka
筏.k38 分钟前
grep、wc 与管道符快速上手指南
linux
文牧之39 分钟前
PostgreSQL 的扩展pageinspect
运维·数据库·postgresql
Johny_Zhao43 分钟前
华为MAAS、阿里云PAI、亚马逊AWS SageMaker、微软Azure ML各大模型深度分析对比
linux·人工智能·ai·信息安全·云计算·系统运维
CodeOfCC1 小时前
c语言 封装跨平台线程头文件
linux·c语言·windows
科文小白狼1 小时前
Linux下VSCode开发环境配置(LSP)
linux·vscode·里氏替换原则·lsp
小兔子酱#1 小时前
【Docker 01】Docker 简介
运维·docker·容器
还有几根头发呀2 小时前
UDP 与 TCP 调用接口的差异:面试高频问题解析与实战总结
网络·网络协议·tcp/ip·面试·udp