haproxy

haproxy

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

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy监听的端口是1080,代理192.168.18.2:10000,127.0.0.1:10000

HAProxy实现的是一种事件驱动、单一进程的架构模型,此类模型的优点在于能够支撑高并发大规模的连接。反之,多进程或多线程模型受内存和系统调度器的限制以及无处不在的锁限制,很难应对数以万计的高并发连接。HAProxy支持连接拒绝,通过拒绝连接,可以限制某些非法或有意的攻击型连接,从而降低其对网站带来的危害。的这一功能已成为目前应对小型 DDOS攻击的主要方法之一,并且其他负载均衡器很难做到这点。此外, HAProxy还支持全透明代理,即可以将客户端地址或者任何指定地址直接连接到后端服务器,通过全透明代理,可以不用修改某些特殊服务器地址而使其直接接收并处理部分特定流量。

haproxy的特点
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、支持url检测后端的服务器;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
6、HAProxy的算法较多,达到8种;

根据功能用途不同,其配置文件主要由五个部分组成,分别为global部分,defaults部分,frontend部分,backend部分,listen部分

global部分

用于设置全局配置参数,属于进程级的配置,通常与操作系统配置相关

defaults部分

默认参数的配置部分。在些部分设置的参数,默认会自动引用到下面的frontend, backend和listen部分

frontend部分

用于设置接收用户请求的前端虚拟节点。frontend可以根据ACL规则直接指定要使用的后端backend

backend部分

用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求

listen部分

此部分是frontend和backend部分的结合体

配置过程

安装haproxy

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

配置各个负载的内核参数

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

编辑配置文件
[root@czh haproxy-2.3.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.31.140:80 check inter 2000 fall 5
server web01 192.168.31.139:80 cookie web01 check inter 2000 fall 5
EOF

启动服务

[root@czh haproxy-2.3.0]# haproxy -f /etc/haproxy/haproxy.cfg 
[root@czh haproxy-2.3.0]# ss -antl
State    Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process   
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              0.0.0.0:80              0.0.0.0:*                
LISTEN   0        128                 [::]:22                 [::]:*  

编写service文件

[root@czh haproxy-2.3.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@czh haproxy-2.3.0]# systemctl daemon-reload

启用日志

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

重启服务

[root@czh haproxy-2.3.0]# pkill haproxy
[root@czh haproxy-2.3.0]# systemctl enable --now haproxy
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
[root@czh haproxy-2.3.0]# ss -antl
State    Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process   
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              0.0.0.0:80              0.0.0.0:*                
LISTEN   0        128                 [::]:22                 [::]:*   

查看效果
haproxy
haproxy

上一篇:Haproxy搭建 Web 群集


下一篇:MySQL 负载均衡集群部署