一:haproxy简介
haproxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
二:负载均衡
负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。
二层负载均衡(mac)
用于虚拟mac地址方式,外部对虚拟mac地址请求,负载均衡接收后分配给后端实际的mac地址响应。
三层负载均衡(ip)
一般用于虚拟ip地址的方式,外部对虚拟ip地址请求,负载均衡接收后分配给后端实际的ip地址响应。
四层负载均衡(tcp)
主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡,如常见的 LVS、F5 等。
- 工作原理:四层负载均衡器在网络层(IP 层)和传输层(TCP/UDP 层)进行操作,它根据源 IP 地址、目标 IP 地址、端口号等信息进行流量分发,不涉及应用层数据。
- 优点:处理速度快,因为它只需查看数据包头部的信息而不需解析数据包的内容。
- 缺点:功能相对简单,不能根据应用层的信息(如 URL、Cookie)做出复杂的调度决策。
七层负载均衡器(http)
位于 OSI 模型的最高层,即应用层,此负载均衡器支持多种协议,如 HTTP、FTP、SMTP 等。七层负载均衡器可根据报文内容(例如 URL、Cookie、主机名)进行流量分发,如常见的 HAProxy、Nginx。
- 工作原理:七层负载均衡器在应用层进行操作,可以解析应用层的内容,根据具体的请求信息(如 HTTP 头、URL 路径、Cookie 等)进行更加精细的负载均衡。
- 优点:功能强大,能够进行复杂的调度决策,适用于需要根据应用层数据进行调度的场景。
- 缺点:处理开销较大,因为需要解析和分析应用层的数据。
三.haproxy的安装和环境搭建
主机安装haproxy
[root@localhost ~]# yum install haproxy
进入配置文件编辑,设置前端http,指定web1主机和web2主机
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
启动haproxy服务,检测是否成功
[root@localhost ~]# systemctl restart haproxy.service
[root@localhost ~]# systemctl status haproxy.service
客户端web1
安装nginx
[root@localhost ~]# yum install nginx
将内容输入目录底下的文件
[root@localhost ~]# echo webserve1 - 172.25.254.10 > /usr/share/nginx/html/index.html
启动nginx服务
[root@localhost ~]# systemctl restart nginx.service
[root@localhost ~]# systemctl status nginx.service
客户端web2
安装nginx
[root@localhost ~]# yum install nginx
将内容输入目录底下的文件
[root@localhost ~]# echo webserver2 - 172.25.254.20 > /usr/share/nginx/html/index.html
启动nginx服务
[root@localhost ~]# systemctl restart nginx.service
[root@localhost ~]# systemctl status nginx.service
使用主机进行测试,haproxy环境搭建成功
[root@localhost ~]# curl 172.25.254.10
[root@localhost ~]# curl 172.25.254.20
四:global 配置参数说明
参数 | 类型 | 作用 |
chroot | 全局 | 锁定运行目录 |
deamon | 全局 | 以守护进程运行 |
user, group, uid, gid | 全局 | 运行haproxy的用户身份 |
stats socket | 全局 | 套接字文件 |
nbproc N | 全局 | 开启的haproxy worker 进程数,默认进程数是一个 |
nbthread 1 (和nbproc互斥) | 全局 | 指定每个haproxy进程开启的线程数,默认为每个进程一个线程 |
cpu-map 1 0 | 全局 | 绑定haproxy worker 进程至指定CPU,将第1个work进程绑定至0号CPU |
cpu-map 2 1 | 全局 | 绑定haproxy worker 进程至指定CPU,将第2个work进程绑定至1号CPU |
maxconn N | 全局 | 每个haproxy进程的最大并发连接数 |
maxsslconn N | 全局 | 每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景下 |
maxconnrate N | 全局 | 每个进程每秒创建的最大连接数量 |
spread-checks N | 全局 | 后端server状态check随机提前或延迟百分比时间,建议2- 5(20%-50%)之间,默认值0 |
pidfile | 全局 | 指定pid文件路径 |
log 127.0.0.1 local2 info | 全局 | 定义全局的syslog服务器;日志服务器需要开启UDP协议,最多可以定义两个 |
4.1:设置多进程(nbproc N)
进入配置文件global模块中配置全局,haproxy默认情况下是一个进程
[root@localhost ~]# pstree -p | grep haproxy
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
[root@localhost ~]# systemctl restart haproxy.service#重新启动
[root@localhost ~]# pstree -p |grep haproxy
4.2:进程至指定CPU(cpu-map )
[root@localhost ~]# systemctl restart haproxy.service#重新启动
[root@localhost ~]# pstree -p |grep haproxy
4.3:查看进程中有几个子进程(cat)
[root@localhost ~]# cat /proc/17422/status | grep -i thread
4.5:设置多线程(nbthread N)
注意:多线程和多进程不可以同时设置,两者相互排斥
进入配置文件,重启服务查看进程
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
五:haproxy的状态界面
启动状态页
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
重新启动haproxy
[root@localhost ~]# service haproxy restart
[root@localhost ~]# systemctl restart haproxy.service
注意:防火墙关闭,关闭selinux,将VIP、LVS等内容清理干净!!!!!
删除所有设备的VIP,清空所有LVS设置,关闭keepalived!!!
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
成功进入状态页
haproxy的状态监控页面编辑可以加下面参数
listen admin_statsstats enable bind *:9999 //监听的ip端口 mode http //开关option httploglog globalmaxconn 10 stats refresh 30s //统计页面自动刷新时间 stats uri /status //访问的status ip:9999/status stats realm haproxy stats auth lee:lee //认证用户名和密码stats hide-version //隐藏HAProxy的版本号stats admin if TRUE //管理界面,如果认证成功了,可通过webui管理节
六:基于cookie的会话保持
cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替。
注意:不支持tcp mode,使用http mode
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
重新启动程序
[root@localhost ~]# service haproxy restart
使用浏览器访问地址
也可以使用虚拟机进行检测,基于cookie的会话保持完成。
[root@nginx ~]# curl -b WEBCOOKIE=lee1 172.25.254.100
七:自定义错误文件
获取错误文件的默认路径
[root@localhost ~]# rpm -ql haproxy |grep http
新建目录存放文件
[root@localhost errorpage]# mkdir /etc/haproxy/errorpage/503.http -p
编辑访问路径错误文件的内容
[root@localhost errorpage]# vim /etc/haproxy/errorpage/503.http
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html;charset=UTF-8<html><body><h1>什么动物生气最安静</h1>
大猩猩!!
</body></html>
进入配置文件,插入新建错误文件路径,必须和存放文件一模一样
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
重新启动服务
[root@localhost ~]# systemctl restart haproxy.service
使用浏览器访问主机地址
八:hapoxy的四层负载示例
针对除HTTP以外的TCP协议应用服务访问的应用场景,如MySQL Redis Memcache RabbitMQ。
客户端1号MySQL
[root@localhost ~]# yum install mariadb-server
进入默认配置文件编辑信息,id号为1
[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf
重新启动服务
进入数据库查看id
[root@localhost ~]# mysql
MariaDB [(none)]> SELECT @@server_id;
同理客户端2号MySQL
进入默认配置文件编辑信息,id号为2
[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf
然后将两个客户端改为远程连接
rs1 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';rs2 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
[root@localhost ~]# systemctl restart haproxy.service
测试
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like 'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs2 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h 172.25.254.100 -e "show variables like 'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs1 |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
[root@node10 ~]# mysql -ulee -plee -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------