文章目录
- 一、HAProxy基础介绍
- 1. 概述
- 2. 负载均衡的分类
- 二、haproxy基础配置
- 1. 配置监控
- 2. 激活日志
- 3. 监控的用户认证 自动刷新
- 4. 负载均衡调度算法
- 5. 修改端口 添加后端备机
一、HAProxy基础介绍
1. 概述
HAProxy的官方网站是:https://www.haproxy.org/ HAProxy(High Availability Proxy)是一个使用 C 语言编写的自由及开放源代码软件,它为基于TCP和HTTP的应用,提供高可用、负载均衡和代理,支持虚拟主机。HAProxy是一个单线程、事件驱动、非阻塞引擎,结合了一个非常快速的I/O层和一个基于优先级的调度器。
一旦HAProxy启动时,它会做3件事:处理进入的连接;周期性的检查服务器的状态(也就是我们熟知的健康检查);其它的haproxy节点交换信息。
HAProxy特别适用于那些负载特大的 Web站点。运行模式使得它可以很简单安全的整合到当前的架构中,同时可以保护你的web服务器不被暴露到网络上。Haproxy 主要用来做七层负载均衡。
2. 负载均衡的分类
负载均衡就是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁碟驱动器或其它资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
那么,这种计算机技术的实现方式有多种。大致可以分为以下几种:二层负载均衡、三层负载均衡、四层负载均衡、七层负载均衡,其中最常用的是四层和七层负载均衡。
二层负载均衡会通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址;三层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址;四层通过虚拟IP+端口接收请求,然后再分配到真实的服务器;七层通过虚拟的URL或主机名接收请求,然后再分配到真实的服务器。
四层负载均衡工作在 OSI 模型的传输层,由于在传输层,只有 TCP/UDP 协议,这两种协议中除了包含源 IP、目标 IP 以外,还包含源端口号及目的端口号。
四层的负载均衡,就是通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息( IP+端口号 )将流量转发到应用服务器。
七层负载均衡工作在 OSI 模型的应用层,应用层协议较多,常用 HTTP、Radius、DNS 等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个 Web 服务器的负载均衡,除了根据 IP 加端口进行负载外,还可根据七层的 URL、浏览器类别、语言来决定是否要进行负载均衡。
七层负载均衡就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,举个例子,如果你的Web服务器分成两组,一组是中文语言的,一组是英文语言的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应的语言服务器组进行负载均衡处理。
二、haproxy基础配置
环境说明:RHEL7
主机名 | serverb | server2 | server3 | workstation |
IP地址 | 192.168.1.116 | 192.168.1.102 | 192.168.1.103 | 192.168.1.104 |
职能 | 负载均衡,调度器 | RS服务器(RS2) | RS服务器(RS3) | 外部客户端 |
要求 | 安装haproxy | 安装Apache | 安装Apache |
配置RS服务器:
要求在两台RS服务器均安装了Apache服务并设定开机启动;两个节点的网络畅通,可以被同一个网段的主机ping通;为了显示负载到两个不同的节点,分别更改节点的默认发布页面,RS2设定为vm2,RS3设定为vm3,命令:echo vm2 > /var/www/html/index.html。
1. 配置监控
[root@serverb ~]# yum install haprocy -y //安装
[root@serverb ~]# cd /etc/haproxy/
[root@serverb haproxy]# ls
haproxy.cfg
[root@serverb haproxy]# vim haproxy.cfg //编辑配置文件
defaults
stats uri /status //添加监控
frontend main *:80 //修改端口
default_backend app
backend app
balance roundrobin
server app1 192.168.1.103:80 check //设置节点
server app2 192.168.1.102:80 check
[root@serverb haproxy]# systemctl start haproxy
配置负载均衡调度器
(1)在serverb上安装haproxy:yum install haproxy -y
(2)修改haproxy的配置文件,haproxy的默认配置是/etc/haproxy/haproxy.cfg
在修改配置文件之前,首先要搞懂配置文件的含义:
global //全局参数的设置
log 127.0.0.1 local2 // 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local2日志设备
chroot /var/lib/haproxy //改变当前工作目录
pidfile /var/run/haproxy.pid //当前进程id文件
maxconn 4000 //最大连接数
user haproxy //所属用户
group haproxy //所属组
daemon //以守护进程方式运行haproxy
stats socket /var/lib/haproxy/stats //基于本地的文件传输
defaults //默认部分的定义
mode http //mode语法:mode {http|tcp|health} 。http是七层模式,tcp是四层模式,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
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 //设置监听地址,默认为5000
acl url_static path_beg -i /static /images /javascript /stylesheets //定义一个名为ur1_static的acl,当请求的url开头是以/static /images /javascript /stylesheets开头的,
acl url_static path_end -i .jpg .gif .png .css .js //请求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif结尾的,将会被匹配到
use_backend static if url_static //如果满足策略url_static时,就将请求交予backend static
default_backend app //否则,就将请求交予backend app
backend static //定义一个名为static的后端部分,使用了静态动态分离(如果url_static匹配 .jpg .gif .png .css .js等静态文件则访问此后端
balance roundrobin //设置负载均衡算法[banlance roundrobin 轮询;balance source 保存session值;支持static-rr(权重),leastconn,first,uri等参数]
server static 127.0.0.1:4331 check //通过IP和端口,设置静态文件部署在IP所在的主机,check表示接受健康检测
backend app //定义一个名为app的后端部分。PS:此处app只是一个自定义名字而已,但是需要与frontend里面配置项default_backend 值相一致
balance roundrobin //负载均衡算法
server app1 127.0.0.1:5001 check //使用server关键字来设置后端服务器,app1/2/3/4无特殊含义
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
添加参数实现监控功能stats uri /status,并且将端口改为80端口。注意,需要在调度器上关闭Apache服务,避免端口冲突。
此时监控就设置完成了,然后就需要将RS节点添加到配置文件中,haproxy就可以对节点进行负载调度,此时还不需要静态文件访问后端,所以注释掉关于静态static的相关定义。
(3)完成配置文件的修改后,启动haproxy:systemctl start haproxy
外部客户端测试(1)启动成功后,就可以在外部客户端通过访问调度器IP进行负载均衡的测试,可以访问到RS服务器,并且每次刷新页面出现的结果不同,就说明配置成功:
(2)监控功能,可以通过浏览器访问观察到。当单点出现故障后,需要刷新页面后,才可以监控显示出节点故障.
2. 激活日志
haproxy配置文件中默认定义了log 127.0.0.1 local2 说明日志将被记录在本机local2设备中。通过编辑rsyslog配置文件,完成日志的激活。
[root@serverb ~]# vim /etc/rsyslog.conf
\# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
\*.info;mail.none;authpriv.none;cron.none;local2.none /var/log/messages
local2.* /var/log/haproxy.log
[root@serverb ~]# systemctl restart rsyslog
设置完成后,需要重启日志服务。测试时,要注意需要先访问调度器,才会产生日志文件:
3. 监控的用户认证 自动刷新
在上面配置监控时,有两个不完善的地方:一是所有人都可以通过网页查看实时监控,存在安全隐患;二是每次需要刷新监控时,都需要手动刷新网页才会刷新监控,这样就没有监控的意义了,所以可以通过修改配置文件,完善监控不足,只有指定用户才能看到监控页面,而且监控时间隔几秒可以自动刷新,及时监控到节点的问题。
编辑配置文件后,重启haproxy。
[root@serverb ~]# vim /etc/haproxy/haproxy.cfg
stats uri /status
stats auth admin:westos //用户名称为admin 用户密码为westos
stats refresh 5s //间隔5秒自动刷新
[root@serverb ~]# systemctl reload haproxy.service
4. 负载均衡调度算法
[root@serverb haproxy]# vim haproxy.cfg
backend app
balance roundrobin
balance source
balance static-rr //设定此算法时 要在server 后面使用weight设定权重
[root@serverb haproxy]# systemctl restart haproxy.service
在haproxy配置文件中,balance定义后端服务器组内的服务器调度算法。haproxy中调度算法分为动态调度算法和静态调度算法,根据该算法支不支持运行时即时生效来区分动静态算法。
支持的算法有:
(1)roundrobin:基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;并支持慢启动。
(2)source:将请求的源地址进行hash运算,新连接先按权重分配,后续连接按source分配请求。由后端服务器的权重总数相除后派发至某匹配的服务器,这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie1功能的基于TCP的协议;此算法默认为静态,不过也可以使用hash-type修改此特性。
(3)static-rr:基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;不支持慢启动,在高负荷的情况下,服务器重新上线时会立即被分配大量连接。
5. 修改端口 添加后端备机
(1)在haproxy配置文件中,端口默认为80,当修改RS节点的Apache端口被修改后,在haproxy配置文件中也需要修改为对应端口,此时也并不影响外部客户端访问。
[root@server2 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080 //RS节点修改Apache端口
[root@server2 ~]# systemctl restart httpd
[root@serverb haproxy]# vim haproxy.cfg
backend app
balance roundrobin
server app1 192.168.1.103:80 check
server app2 192.168.1.102:8080 check //haproxy配置文件对应IP的端口对应修改
[root@serverb haproxy]# systemctl restart haproxy.service
(2)在调度时,添加的节点RS服务器,如果都同时宕机了,那么怎么才能避免出现外部客户端在访问时,遇到访问失败的问题?
解决方法就是,在haproxy配置文件中,可以把haproxy调度器所在的主机设定为一台备用的节点。通过修改备用节点的默认发布页面来提示用户,此时服务器出现问题,避免造成用户访问体验差。
注意:如果将haproxy主机设为访问的备用节点,要修改主机的Apache端口,因为默认的80,会和haproxy的端口冲突。
[root@serverb haproxy]# vim haproxy.cfg
server backup 127.0.0.1:8000 backup //添加backup
[root@serverb haproxy]# systemctl restart haproxy.service
[root@serverb haproxy]# vim /etc/httpd/conf/httpd.conf
Listen 8000 //修改端口
[root@serverb haproxy]# systemctl restart httpd
[root@serverb haproxy]# cd /var/www/html/
[root@serverb html]# ls
[root@serverb html]# vim index.html
[root@serverb html]# cat index.html
sorry,try again later //编辑默认发布页面
- Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。举例来说, 一个 Web 站点可能会为每一个访问者产生一个唯一的ID, 然后以 Cookie 文件的形式保存在每个用户的机器上。如果使用浏览器访问 Web, 会看到所有保存在硬盘上的 Cookie。在这个文件夹里每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的 Web 站点的信息。在这里的每个 Cookie 文件都是一个简单而又普通的文本文件。透过文件名, 就可以看到是哪个 Web 站点在机器上放置了Cookie(当然站点信息在文件里也有保存) 。 ↩︎