haproxy 支持4层tcp传输层,7层负载http应用层;用于大站点,多用于七层应用层负载
LVS 稳定,效率高,四层调度。不支持7层的内容分发或过滤。
nginx 支持四层,七层调度,现在也有开发的新的模块来扩展调度相关的功能。在会话保持,内容分发过滤方面比haproxy相比要差
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。
LVS就是基于Linux操作系统实现的一种软负载。
HAProxy是开源的并且基于第三应用实现的软负载。
HAProxy相比LVS的使用要简单很多,功能方面也很丰富。
当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。
在4层模式,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求(request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。
根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom‘s 10GbE NICs (Myri-10G PCI-Express),这个作为软件级负载均衡,也是比较惊人的;
HAProxy的8种调度算法有8种:
1、roundrobin,表示简单的轮询,按访问次数轮询。
2、static-rr,表示根据权重分发
3、leastconn,表示最少连接者优先分发
4、source,表示根据源请求IP分发
5、uri,表示根据请求的URL来分发
6、url_param,表示根据请求的URL参数分发
7、hdr(name),表示根据HTTP请求头来锁定每次的HTTP请求
8、rdp-cookie(name),表示根据cookie来锁定并哈希每一次TCP请求
重点关注1-4项,前4项
===================================================================================
在做反向代理服务器的负载均衡时,我们通常会使用nginx的均衡配置。其实,haproxy的负载均衡也是属于这一类的。那么关于这方面的配置过程我们现在来进行一下讲解。首先,对haproxy进行一个简单的介绍,之后就是安装和配置环节。
HAProxy介绍
反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入
第二部分:准备服务器与HAProxy软件安装
haproxy的搭建
架构图:
--下图中haproxy用了两个网段(这里模拟内外网),实际时也可以只用一个网卡(只有内网网卡),公网IP在前端防火墙做映射就可以了
客户端(真实机) 81.1.1.1
|
|
外网 | 81.1.1.3
haproxy
内网 | 192.168.169.161
|
|
web1 web2
192.168.169.153 192.168.169.154
实验前准备:
1,更改主机名与静态IP,并写/etc/hosts文件
192.168.169.161 haproxy.cluster.com haproxy
192.168.169.153 node1.cluster.com node-web1
192.168.169.154 node2.cluster.com node-web2
2,时间同步
3,关闭iptables,selinux,NetworkManager,
使用的HAproxy软件版本 haproxy-1.4.24.tar.gz --软件包
新建haproxy用户
[root@li ~]# useradd haproxy -s /sbin/nologin
准备安装部署
先在192.168.169.161安装haproxy软件
[root@haproxy ~]# tar xf /haproxy-1.4.24.tar.gz -C /usr/src/
[root@haproxy ~]# cd /usr/src/haproxy-1.4.24/
[root@haproxy haproxy-1.4.24]# make target=linux26 CPU=x86_64 PREFIX=/usr/local/haproxy install
target=linux26 --代表指定内核大版本号,使用uname -a 就可以查到
CPU=x86_64 --代表CPU的位数,32位还是64位
PREFIX=/usr/local/haproxy --代表指定安装目录 注意:PREFIX必须为大写,否则不认
--如果你的操作系统为32位,则把上面编译参数CPU=x86_64换成CPU=i686(如果不知道,用uname -m查看,-a显示全部信息)
查看官方软件包提供的文件
# ls /usr/local/haproxy/doc/haproxy/
architecture.txt 架构体系和简单应用例子说明
configuration.txt 配置文档,所有参数都有说明
haproxy-en.txt 使用手册
haproxy-fr.txt
查看安装后的目录文件
[root@haproxy haproxy-1.4.24]# cd /usr/local/haproxy/
[root@haproxy haproxy]# ls
doc sbin share
# cp /usr/local/haproxy/share/man/man1/haproxy.1 /usr/share/man/man1/
--拷man文档到相应的目录,然后就可以man haproxy了
--复制配置文件
[root@haproxy haproxy]# cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /usr/local/haproxy/
--配置HAProxy
# vim /usr/local/haproxy/haproxy.cfg
global
#log 127.0.0.1 local0
#log 127.0.0.1 local1 notice
log 127.0.0.1 local0 info --日志记录
maxconn 4096 --最大链接
chroot /usr/local/haproxy --笼环境 ,haproxy安装家目录
uid 99 --运行haproxy的用户UID,99就是默认用户nobody
gid 99
daemon --以后台守护进程运行
nbproc 1 --打开一个进程,默认也是1,如果打开两个的话,启动后,可以使用lsof -i:80查到两个进程,并且使用RR调度的话会两次web1,再两次web2
pidfile /var/run/haproxy.pid --指定pid文件,可用于一些reload,或关闭操作
#debug --调试模式
#quiet --静默模式,不要打开这句,否则启动时报错你看不到
defaults --defaults里的设置对后面的(frontend,backend,listen)这些配置段都生效
log global --日志记录和global一样
mode http --七层负载,如果改成tcp,就是四层负载
option httplog --日志记录http的会话等信息
option dontlognull --记录一些监控或健康检查
retries 3 --如果连续连接3次失败就认为是不可用
option redispatch --如果后端有服务器宕机,强制切换到正常服务器
maxconn 2000 --每个连接可用的最大连接数
contimeout 5000 --连接超时
clitimeout 50000 --客户端连接超时时间 毫秒
srvtimeout 50000 --服务器连接超时时间
listen haproxy 192.168.169.161:80 --配置haproxy服务器的名称与IP地址和端口
balance roundrobin --改成source时,那同一个IP地址的所有请求发送到同一台服务器
server node-web1 192.168.169.153:80 --配置真实服务器的地址和端口
server node-web2 192.168.169.154:80 --配置真实服务器的地址和端口
----------------------------------------
上面的listen这个配置段,可以换成下面的这两个配置段,也是一样的效果;
这就是haproxy配置灵活的方面
frontend haproxy *:80
default_backend servers
backend servers
balance roundrobin
server node-web1 192.168.169.153:80
server node-web2 192.168.169.154:80
----------------------------------------
--启动服务
# cd /usr/local/haproxy
# ./sbin/haproxy -f haproxy.cfg
-------------------------------------------------------
--关闭服务
# kill $(</var/run/haproxy.pid)
--刷新服务
# ./sbin/haproxy -f haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
这里是可以把三个启动方式,写成脚本
man haproxy 查看相关参数
#./sbin/haproxy –help
haproxy -f <配置文件> [-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p <pid文件>] [-s] [-l] [-dk]
[-ds] [-de] [-dp] [-db] [-m <内存限制M>] [{-sf|-st} pidlist...]
-d 前台,debug模式
-D daemon模式启动
-q 安静模式,不输出信息
-V 详细模式
-c 对配置文件进行语法检查
-s 显示统计数据
-l 显示详细统计数据
-dk 不使用kqueue
-ds 不使用speculative epoll
-de 不使用epoll
-dp 不使用poll
-db 禁用后台模式,程序跑在前台
-sf <pidlist>
程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
-st <pidlist>
程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后
----------------------------------------------------------------
第三部分:安装两个节点端并测试集群效果
把node1和node2安装httpd,然后启动起来,做一个不同的主页方便验证HAProxy的算法
node1上做:
# yum install httpd* -y
# /etc/init.d/httpd restart
# echo web1 > /var/www/html/index.html
node2上做:
# yum install httpd* -y
# /etc/init.d/httpd restart
# echo web2 > /var/www/html/index.html
测试负载均衡效果
找另外的两台以上的机器访问 haproxy服务器的IP ,看是否能达到负载均衡效果
==============================
把日志配置写到syslog服务里
# vim /etc/rsyslog.conf --加上下面一句
local0.* /var/log/haproxy.log
vim /etc/rsyslog.conf --把下面两句话打开,只要打开udp的两句就可以(haproxy这里没有使用tcp的514,用的是udp的514)
$ModLoad imudp
$UDPServerRun 514
修改完后做重新日志服务
# /etc/init.d/rsyslog restart
然后可以去重启一下haproxy
再来验证查看 /var/log/haproxy.log文件就有日志文件了
第四部分:使用haproxy做动静分离
先看架构图
客户端(真实机) 81.1.1.1
|
|
外网 | 81.1.1.3
haproxy
内网 | 192.168.169.161
|
|
web1 web2
192.168.169.153 192.168.169.154
静态文件 动态文件
--修改HAProxy主配置文件/usr/local/haproxy/haproxy.cfg
[root@haproxy haproxy]# /usr/local/haproxy/haproxy.cfg
global
#log 127.0.0.1 local0
#log 127.0.0.1 local1 notice
log 127.0.0.1 local0 info
maxconn 4096
chroot /usr/local/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /var/run/haproxy.pid
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
option redispatch
retries 3
balance roundrobin --设备调度算法,roundrobin 是轮询
option forwardfor
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
frontend haproxy.cluster.com 0.0.0.0:80 --主机名 *代表主机所有IP,:80代表80端口
# acl invalid_src src 1.1.1.1 --如果你要拒绝某个IP访问,就把注释打开并设置IP
# block if invalid_src
acl url_static path_end .html .png .jpg .css .js .txt .xml
use_backend static if url_static
default_backend dynamic
backend static
server node1.cluster.com 192.168.169.153:80 check inter 2000 rise 2 fall 5
server node2.cluster.com 192.168.169.154:80 check inter 2000 rise 2 fall 5
backend dynamic
server node1.cluster.com 192.168.169.153:80 check inter 2000 rise 2 fall 5
server node2.cluster.com 192.168.169.154:80 check inter 2000 rise 2 fall 5
--修改完成后,需要将服务刷新或重启服务
--启动服务
# cd /usr/local/haproxy
# ./sbin/haproxy -f haproxy.cfg
-------------------------------------------------------
--关闭服务
# kill $(</var/run/haproxy.pid)
--刷新服务
# ./sbin/haproxy -f haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
--重启服务后
在后端两个web都去创建一些不同类型的文件,写上不同的内容
然后在客户端访问,会发现所有的定义的静态文件会访问web1,除此之外的都访问web2
如:在客户端firefox上访问 http://haproxy.cluster.com/index.html --只会显示web1上的内容,静态的都指向它
----------------------------
第五部分:开启HAPRoxy自带的监控页面
修改主配置文件/usr/local/haproxy/haproxy.cfg
vi /usr/local/haproxy/haproxy.cfg
global
#log 127.0.0.1 local0
#log 127.0.0.1 local1 notice
log 127.0.0.1 local0 info
maxconn 4096
chroot /usr/local/haproxy
uid 99
gid 99
daemon
pidfile /var/run/haproxy.pid
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
balance roundrobin
contimeout 5000
clitimeout 50000
srvtimeout 50000
#加上这一段,代表开启监控页面
listen stats #监听的管理后台
mode http #服务模式
bind 192.168.169.161:88 #指定ip地址和端口号
stats enable #开启状态页面
stats hide-version #不显示头部信息
stats uri /haproxy-server #访问的路径
stats realm Haproxy\ Statistics #加密方式
stats auth admin:333333 #认证的用户和密码
stats admin if TRUE #管理我们节点
stats refresh 30s #刷新监控界面
frontend haproxy.cluster.com 0.0.0.0:80
# acl invalid_src src 1.1.1.1
# block if invalid_src
acl url_static path_end .html .png .jpg .css .js
use_backend static if url_static
default_backend dynamic
backend static
server node1.cluster.com 81.1.1.129:80 check inter 2000 rise 2 fall 5
backend dynamic
server node1.cluster.com 81.1.1.129:80 check inter 2000 rise 2 fall 5
server node2.cluster.com 81.1.1.130:80 check inter 2000 rise 2 fall 5
--登陆方法:192.168.169.161:88/haproxy-server
输入帐号:admin 密码:333333
==============================================================
第六部分:安装keepalived实现haproxy主备
1、先安装依赖包
yum -y install kernel-devel openssl* openssl-devel gcc* make* libnl*
2、安装keepalived软件包,两台keepalived机器都要安装
a、解压软件包keepalived-1.2.16.tar.gz:tar xf keepalived-1.2.16.tar.gz -C /usr/src/
b、配置keepalived:cd /usr/src/keepalived-1.2.16,再配置./configure --with-kernel-dir=/usr/src/kernel/.6.32-431.el6.x86_64/
c、编译与安装:make && make install
d、复制配置文件与启动命令:
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/sbin/keepalived /usr/sbin/
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
3、配置keepalived主备关系
vi /etc/keepalived/keepalived.conf
global_defs {
notification_email {
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_MASTER
}
vrrp_script chk_haproxy {
script "/etc/keepalived/chk_haproxy.sh" #健康检查脚本
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.169.160
}
track_script {
chk_haproxy
}
}
4、写健康检查脚本
vi /etc/keepalived/chk_haproxy.sh
#!/bin/bash
/etc/rc.d/init.d/functions
status=$(lsof -i:80 | wc -l) natstat -lntup | grep haproxy | grep -v grep | wc -l
if [ "${status}" = "0" ]; then
sh /usr/local/haproxy/haproxy-all.sh start
status2=$(lsof -i:80 | wc -l)
if [ "${status2}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
5、给haproxy写一个启动脚本
vi /usr/local/haproxy/haproxy-all.sh
#!/bin/bash
#cd /usr/local/haproxy
haproxy=/usr/local/haproxy
case "$1" in
start)
$haproxy/sbin/haproxy -f $haproxy/haproxy.cfg
echo "HAproxy Started! OK."
;;
stop)
#pkill haproxy
kill $(</var/run/haproxy.pid)
echo "HAproxy Stoped."
;;
reload)
$haproxy/sbin/haproxy -f $haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
;;
restart)
pkill haproxy
sleep 5
echo "HAproxy Stoped."
$haproxy/sbin/haproxy -f $haproxy/haproxy.cfg
a=`netstat -anlp|grep haproxy |wc -l`
#if [ $a -eq 0 ] then
# echo "haproxy 启动失败"
#else
# echo "HAproxy 启动成功。"
#fi
[ $a -eq 0 ] && echo "HAproxy 启动失败" || echo "HAproxy 启动成功"
;;
*)
echo "请输入 start | stop | reload | restart "
;;
exit 0
esac
原文:https://www.cnblogs.com/The-day-of-the-wind/p/12064086.html