haproxy

Posted ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了haproxy相关的知识,希望对你有一定的参考价值。

haproxy

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这

负载均衡类型

四层负载均衡

将网络流量负载均衡到多个服务器的最简单方法是使用第4层(传输层)负载均衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量。
用户访问负载均衡器,调度器将用户的请求转发给后端服务器的Web后端组。无论选择哪个后端服务器,都将直接响应用户的请求。通常,Web后端中的所有服务器应该提供相同的内容 - 否则用户可能会收到不一致的内容。

七层负载均衡

7层负载均衡是更复杂的负载均衡网络流量的方法是使用第7层(应用层)负载均衡。使用第7层允许调度器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。

haproxy的特点

  • 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
  • 能够补充nginx的一些缺点比如Session的保持,Cookie的引导等工作
  • 支持url检测后端的服务器出问题的检测会有很好的帮助。
  • 更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
  • 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
  • HAProxy可以对mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
  • 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
  • 不能做Web服务器即Cache。

haproxy配置文件

HAProxy 配置文件根据功能和用途,主要有 5 个部分组成,但有些部分并不是必须的, 可以根据需要选择相应的部分进行配置。

global 部分

用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。

defaults 部分

默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的 frontend、
backend 和 listen 部分中,因此,如果某些参数属于公用的配置,只需在 defaults 部分添加一次即可。而如果在 frontend、backend 和 listen 部分中也配置了与 defaults 部分一样的参数,那么defaults 部分参数对应的值自动被覆盖。

frontend 部分

此部分用于设置接收用户请求的前端虚拟节点。frontend 是在 HAProxy1.3 版本之后才引入的一个组件,同时引入的还有 backend 组件。通过引入这些组件,在很大程度上简化了 HAProxy 配置文件的复杂性。frontend 可以根据 ACL 规则直接指定要使用的后端

backend 部分

此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。添加的真实服务器类似于 LVS 中的real server 节点。

listen 部分

此部分是 frontend 部分和 backend 部分的结合体。在 HAProxy1.3 版本之前,
HAProxy 的所有配置选项都在这个部分中设置。为了保持兼容性,HAProxy 新的版本仍然保留了 listen 组件的配置方式。目前在 HAProxy 中,两种配置方式任选其一即可。

配置实例

安装haproxy

[root@lb ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel
[root@lb ~]# useradd -r -M -s /sbin/nologin haproxy
[root@lb ~]# tar xf haproxy-2.4.0.tar.gz 
[root@lb ~]# cd haproxy-2.4.0
[root@lb haproxy-2.4.0]# make clean
[root@lb haproxy-2.4.0]# make -j $(grep 'processor' /proc/cpuinfo |wc -l)  \\
> TARGET=linux-glibc  \\
> USE_OPENSSL=1  \\
> USE_ZLIB=1  \\
> USE_PCRE=1  \\
> USE_SYSTEMD=1
make install PREFIX=/usr/local/haproxy
[root@lb haproxy-2.4.0]# echo "export PATH=/usr/local/haproxy/sbin:$PATH">/etc/profile.d/haproxy.sh
[root@lb haproxy-2.4.0]# . /etc/profile.d/haproxy.sh
[root@lb haproxy-2.4.0]# which haproxy 
/usr/local/haproxy/sbin/haproxy

配置各个负载的内核参数

[root@lb haproxy-2.4.0]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>  /etc/sysctl.conf
[root@lb haproxy-2.4.0]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf[root@lb haproxy-2.4.0]# sysctl  -p 
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1

编写配置文件

[root@lb haproxy-2.4.0]# cat > /etc/haproxy/haproxy.cfg <<EOF
> #--------------全局配置----------------
> global
>     log 127.0.0.1 local0  info
>     #log loghost local0 info
>     maxconn 20480
> #chroot /usr/local/haproxy
>     pidfile /var/run/haproxy.pid
>     #maxconn 4000
>     user haproxy
>     group haproxy
>     daemon
> #---------------------------------------------------------------------
> #common defaults that all the 'listen' and 'backend' sections will
> #use if not designated in their block
> #---------------------------------------------------------------------
> defaults
>     mode http
>     log global
>     option dontlognull
>     option httpclose
>     option httplog
>     #option forwardfor
>     option redispatch
>     balance roundrobin
>     timeout connect 10s
>     timeout client 10s
>     timeout server 10s
>     timeout check 10s
>     maxconn 60000
>     retries 3
> #--------------统计页面配置------------------
> listen admin_stats
>     bind 0.0.0.0:8189
>     stats enable
>     mode http
>     log global
>     stats uri /haproxy_stats
>     stats realm Haproxy\\ Statistics
>     stats auth admin:admin
>     #stats hide-version
>     stats admin if TRUE
>     stats refresh 30s
> #---------------web设置-----------------------
> listen webcluster
>     bind 0.0.0.0:80
>     mode http
>     #option httpchk GET /index.html
>     log global
>     maxconn 3000
>     balance roundrobin
>     cookie SESSION_COOKIE insert indirect nocache
>     server web01 192.168.247.211:80 check inter 2000 fall 5
>     server web02 192.168.247.100:80 check inter 2000 fall 5
> EOF

启用日志

[root@lb haproxy-2.4.0]# vim /etc/rsyslog.conf 
local0.*                        /tmp/haproxy.log
[root@lb haproxy-2.4.0]# systemctl restart rsyslog

编写.service文件

[root@lb haproxy-2.4.0]# cat > /usr/lib/systemd/system/haproxy.service <<EOF
> [Unit]
> Description=HAProxy Load Balancer
> After=syslog.target network.target
> 
> [Service]
> ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg   -c -q
> ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg  -p /var/run/haproxy.pid
> ExecReload=/bin/kill -USR2 $MAINPID
> 
> [Install]
> WantedBy=multi-user.target
> EOF
[root@lb haproxy-2.4.0]# systemctl daemon-reload

重启服务

[root@lb haproxy-2.4.0]# systemctl enable --now haproxy 
[root@lb haproxy-2.4.0]# ss -anlt
State   Recv-Q  Send-Q   Local Address:Port    Peer Address:Port  Process  
LISTEN  0       128            0.0.0.0:80           0.0.0.0:*              
LISTEN  0       128            0.0.0.0:22           0.0.0.0:*              
LISTEN  0       128            0.0.0.0:8189         0.0.0.0:*              
LISTEN  0       128               [::]:22              [::]:*              
LISTEN  0       80                   *:3306               *:*         

测试效果


以上是关于haproxy的主要内容,如果未能解决你的问题,请参考以下文章

用 HAproxy 搭建 RabbitMQ 集群

Anaconda环境配置

Anaconda环境配置

HAProxy基于cookie实现客户端会话保持

案例二(构建双主高可用HAProxy负载均衡系统)

Linux真正零停机 HAProxy 重载