HAproxy

简介

HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。

HAproxy工作原理

HAProxy由前端(frontend)和后端(backend),前端和后端都可以有多个。也可以只有一个listen块来同时实现前端和后端。这里主要讲一下frontend和backend工作模式。


前端(frontend)区域可以根据HTTP请求的header信息来定义一些规则,然后将符合某规则的请求转发到相应后端(backend)进行处理。

HAproxy官方文档

调度算法

roundrobin
动态算法,支持权重的运行时调整及慢启动机制;最大支持4095个后端主机;
static-rr
静态算法,不支持权重的运行时调整及慢启动机制;后端主机无数量上限;

leastconn
推荐使用在较长时间会话场景中;例如,LDAP, MySQL等协议;

first
根据服务器在列表中的位置,自下而下进行调度;前面服务连接数达到上限,新请求将调度至下一个服务器;
适用于会话较长的tcp连接;

source:源地址hash
取模法:将源地址hash计算后除以服务器总权重;服务器变动会影响全局调度效果;静态调度;
一致性hash:服务器变动仅影响局部调度;动态调度;

uri
对URI的左半部分或整个uri做hash计算,并由服务器的总权重相除后派发至某挑选出的后端主机;作用在于能够将对同一个uri的请求始终发往同一个backend server。适用于后端为缓存服务器的场景。

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
左半部分:/<path>;<params>
整个uri:/<path>;<params>?<query>#<frag>

url_param
对用户请求的uri中的<params>中的参数的值作hash计算,并由服务器的总权重相除后派发至某挑选出的后端主机;此算法通常用于追踪请求中的用户标识,以确保来自同一个用户的请求始终发往同一个backend server;
<params>

hdr(<name>)
对于每个http请求,此处由<name>指定的http首部会被取出;此首部如果没有有效值,则轮询调度;否则,对其值做hash计算,并由服务器的总权重相除后派发至某挑选出的后端主机;
hdr(Cookie), hdr(Host)

hdr(Host)

rdp-cookie
rdp-cookie(<name>)

此段由马哥教育总结

前段时间太想放弃治疗因此欠下太多作业没做,就不写详细使用方法了,有机会再补充

help

更多详情戳这里查看马帮大湿兄所写~ HAproxy

实验环境

CentOS Linux release 7.1.1503 (Core)
SElinux Disable
YUM源: Base,EPEL
IPTABLES: ACCEPT

haproxy
Host0:172.18.56.70

static
Host1:172.18.56.71
Host2:172.18.56.72

dynamic
Host3:172.18.56.73

Host0

bash> yum install haproxy

bash> rpm -ql haproxy | less

配置文件:/etc/haproxy/haproxy.cfg

配置文件首部信息

# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#

这段英文大概意思就是需要自己修改rsyslog配置文件记录日志

/etc/rsyslog.conf文件
如下两行前面#去掉

bash> vim /etc/rsyslog.conf

$ModLoad imudp
$UDPServerRun 514

任意位置添加如下

# Save haproxy log
local2.* /var/log/haproxy.log

haproxy记录日志时会自动创建/var/log/haproxy.log

修改/etc/sysconfig/rsyslog文件:这里不改好像也可以

bash> vim /etc/sysconfig/rsyslog

SYSLOGD_OPTIONS=""
改为
SYSLOGD_OPTIONS="-r -m 0 -c 2"

重启rsyslog

bash> systemctl restart rsyslog

修改配置文件 /etc/haproxy/haproxy.cfg 如下

bash> vim /etc/haproxy/haproxy.cfg

global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2

chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

# turn on stats unix socket
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

backend phpsrvs
balance roundrobin
cookie PHP indirect nocache
server phpsrv1 172.18.56.73:80 check weight 1 cookie phpsrv1 maxconn 300
server phpsrv2 172.18.56.74:80 check weight 2 cookie phpsrv2 maxconn 600

backend websrvs
balance roundrobin
server websrv1 172.18.56.71:80 check maxconn 10000
server websrv2 172.18.56.72:80 check maxconn 10000

frontend mysrvs
bind *:80
acl php_page path_end -i .php
# 匹配用户所请求的url 结尾 不区分大小写 .php结尾

use_backend phpsrvs if php_page
# 条件符合 php_page 则使用 phpsrvs
default_backend websrvs

Host1

bash> yum install nginx

bash> echo MASTER > /usr/share/nginx/html/index.html
bash> systemctl start nginx

Host2

bash> yum install nginx

bash> echo BACKUP > /usr/share/nginx/html/index.html
bash> systemctl start nginx

Host3

bash> yum install httpd php

bash> cat > /var/www/html/index.php <<EOF
> <?php
> phpinfo();
> ?>
> EOF
bash> systemctl start httpd

Host0

bash> systemctl start haproxy

查看状态
http://172.18.56.70:9000/haproxy?stats
因为172.18.56.74根本就没有开机,所以喃~ Status 为 DOWN

stats


http://172.18.56.70
测试静态内容
static1
static2

http://172.18.56.70/index.php
测试动态内容
dynamic

没毛病

闪~