Centos7部署haproxy负载均衡

Haproxy是一个使用C语言编写的自由及开放代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理,可以运行于大部分主流的Linux操作系统上。

本次实验用到三台服务器,一台服务器安装haproxy实现调度,另两台服务器搭建nginx提供web服务,两台web服务器的部署这里暂时不再介绍,如需要搭建请查看之前的nginx相关笔记

haproxy服务器:172.26.61.51
web服务器1:172.26.61.52
web服务器2:172.26.61.53

首先关闭selinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

关闭防火墙并停用开机启动

systemctl stop firewalld.service
systemctl disable firewalld.service

更换阿里云yum源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

更新yum缓存

yum makecache

打IP转发功能

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

haproxy服务器安装

yum install haproxy -y

我们先来看看haproxy默认配置

#cat /etc/haproxy/haproxy.cfg | egrep -v "^$|#"
global
    log         127.0.0.1 local2 #指定服务器的日志级别
    chroot      /var/lib/haproxy #改变工作目录
    pidfile     /var/run/haproxy.pid 
    maxconn     4000 #最大连接数
    user        haproxy #用户
    group       haproxy #用户组
    daemon #以守护进程的方式运行
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
    log                     global #应用全局的日志配置
    option                  httplog #启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
    option                  dontlognull #启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
    option http-server-close #每次请求完毕后主动关闭http通道
    option forwardfor       except 127.0.0.0/8 ##如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP
    option                  redispatch #当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常
    retries                 3   #定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
    timeout http-request    10s #一次完整的HTTP请求的最大等待时长
    timeout queue           1m  #一个请求在队列里的超时时间
    timeout connect         10s #连接超时(毫秒)
    timeout client          1m  #客户端超时(毫秒)
    timeout server          1m  #服务器超时(毫秒)
    timeout http-keep-alive 10s #设置http-keep-alive的超时时间
    timeout check           10s #检测超时时间
    maxconn                 3000 #最大连接数
frontend  main *:5000
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
    use_backend static          if url_static
    default_backend             app #定义一个名为app前端部分。此处将对应的请求转发给后端
backend static
    balance     roundrobin #负载均衡算法
    server      static 127.0.0.1:4331 check #静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器)
backend app #定义一个名为app后端部分,需要和frontend中default_backend对应
    balance     roundrobin #负载均衡算法,最后支持4095个backend
    server  app1 127.0.0.1:5001 check #定义的多个后端
    server  app2 127.0.0.1:5002 check #定义的多个后端
    server  app3 127.0.0.1:5003 check #定义的多个后端
    server  app4 127.0.0.1:5004 check #定义的多个后端

我们看到默认的配置项已经大致有了我们需要的配置,加上上述配置说明,我们可以稍作修改来适合我们的使用场景

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
listen stats #haproxy监控页
    mode http
    bind 0.0.0.0:10080
    option httplog
    stats enable
    stats hide-version
    stats uri /stats
    stats admin if TRUE
frontend web #前端配置
    bind 0.0.0.0:80 #发起的http请求到80端口,会转发到设置的ip及端口
    mode http
    log global
    option httplog #启用http日志
    default_backend app
backend app
    option httpchk GET /index.html #设置健康检查页面
    option forwardfor header X-Forwarded-For #传递客户端真实IP 
    balance     roundrobin
    server  app1 172.26.61.52:80 check
    server  app2 172.26.61.53:80 check

保存退出
添加haproxy的日志
修改日志配置

#vi /etc/rsyslog.conf
#去掉下面两行前面的#号
$ModLoad imudp
$UDPServerRun 514

添加haproxy日志配置

#vi /etc/rsyslog.d/haproxy.conf
local2.=info     /var/log/haproxy-access.log    # 访问日志
local2.notice    /var/log/haproxy-info.log      # haproxy执行信息

重启rsyslog

systemctl restart rsyslog

启动haproxy

systemctl start haproxy
systemctl enable haproxy

我们访问haproxy的IP地址看看

{74300AA8-0064-426B-9E8C-DB91C84E891F}_20191104154033.jpg

已经代理访问到app1的网站了,我们多刷新几次看看

{1F10EC47-7131-4699-A30A-EAFF02D67ABF}_20191104154021.jpg

有时访问到app2的后端网站,说明我们的配置基本没有问题了

我们访问下haproxy状态统计页面http://ip:10080/stats,显示如下

{2D504EC7-7DAA-49C8-92A9-C5BC5F2015D3}_20191104152607.jpg


Balance 配置调度算法

balance:后端服务器组内的服务器调度算法
balance <algorithm> [ <arguments> ]
balance url_param <param> [check_post]

haproxy中调度算法同样分为动态调度算法和静态调度算法,与nginx调度算法中区分动静态调度算法的概念不同,nginx用能不能根据后端服务器的负载状况进行调度来区分动静态调度算法的差别,而haproxy中则根据该算法支不支持运行时的即时生效来区分动静态算法。 

roundrobin:基于权重轮询,动态算法,支持权重的运行时调整,支持慢启动;每个后端backend中最多支持4095个server,server [标识] ip check weight num
static-rr:基于权重轮询,静态算法,不支持权重的运行时调整及慢启动;后端主机数量无上限
leastconn:加权最少连接,动态算法,最少连接的后端服务器优先分配接收新连接,相同连接时轮询,适用于长连接场景,例如 MySQL、LDAP等,不适合http
first:根据服务器在列表中的位置,自上而下进行调度;前面服务器的连接数达到上限,新请求才会分配给下一台服务
source:源地址hash,新连接先按权重分配,后续连接按source分配请求

server设置

server <name> <address>[:[port]] [param*]
定义后端主机的各服务器及其选项 server <name> <address>[:port] [settings ...] default-server [settings ...]
<name>:服务器在haproxy上的内部名称;出现在日志及警告信息
<address>:服务器地址,支持使用主机名
[:[port]]:端口映射;省略时,表示同bind中绑定的端口
[param*]:参数
check:对当前server做健康状态检测,只用于四层检测
注意:httpchk,“smtpchk”, “mysql-check”, “pgsql-check” and “sslhello-chk” 用于定义应用层检测方法
addr :检测时使用的IP地址
port :针对此端口进行检测
inter <delay>:连续两次检测之间的时间间隔,默认为2000ms
rise <count>:连续多少次检测结果为“成功”才标记服务器为可用 ;默认为2
fall <count>:连续多少次检测结果为“失败”才标记服务器为不可 用;默认为3
cookie <value>:为当前server指定cookie值,实现基于cookie的会话黏性
disabled:标记为不可用
redir <prefix>:将发往此server的所有GET和HEAD类的请求重定向至指 定的URL
weight <weight>:权重,默认为1最大值为256,0表示不参与负载均衡(不被调度)
backlog <backlog>:当server的连接数达到上限后的后援队列长度
backup:设定当前server为备用服务器
default-server [param*] 为backend中的各server设定默认选项

统计接口启用相关的参数

stats enable启用统计页;基于默认的参数启用stats page
stats uri : /haproxy?stats uri默认值
stats realm : HAProxy Statistics启用统计信息并设置身份验证领域
stats auth : no authentication 带有身份验证和授予访问帐户权限的统计信息
stats uri <prefix> 自定义stats page uri
stats auth <user>:<passwd> 认证时的账号和密码,可使用多次
stats realm <realm> 认证时的realm
stats hide-version 隐藏版本
stats refresh <delay> 设定自动刷新时间间隔
stats admin { if | unless } <cond> 启用stats page中的管理功能

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/746.html