案例:使用Haproxy搭建Web集群

目录

Haproxy

Haproxy和LVS的区别

LVS

Haproxy

代理和调度的区别

Haproxy调度算法原理

案例

拓扑图

Web服务器配置

Haproxy配置

安装Haproxy

Haproxy初步设置

Haproxy配置

配置文件各行说明

监听项配置

启动Haproxy

测试

配置Haproxy日志


Haproxy

Haproxy是一种集群调度工具,可以提供高可用性、负载均衡、基于TCP和HTTP应用的代理软件

Haproxy和LVS的区别

  • LVS

    • LVS在企业应用中抗负载能力强,但存在缺陷
    • LVS不支持健康状态检查和动静分离
    • 对于大型网站,LVS的实施配置复杂,维护成本相对较高
    • 支持4层代理
  • Haproxy

    • 适用于负载大的Web站点
    • 运行在硬件上可支持数以万计的并发连接请求
    • 支持4层和7层代理

代理和调度的区别

Haproxy是代理,而LVS是调度

  • 代理:代替后端服务器接收客户端的请求,并不解析,而是转交给后端服务器
  • 调度:调度器收到客户端的请求调度给后端服务器,后端服务器把结果直接返回给客户端

Haproxy调度算法原理

  • RR(Round Robin)
    • 轮询调度,轮流分配请求给每个后端服务器
    • 适用于每个后端服务器性能差别不大的情况
  • LC(Least Connections)
    • 最小连接数,根据后端服务器建立连接的数量动态分配前端请求
    • 适用于每个后端服务器性能差别大的情况
  • SH(Source Hashing)
    • 基于源IP、Cookie等的进行调度
    • 适用于一些有Session会话记录在服务器端的场景,可以基于源IP和Cookie等属性做集群调度
    • 每次调度器收到请求后,检测源地址生成哈希值,根据哈希值辨别该地址上次请求连接的服务器,分配该请求给上次连接的服务器(会话保持)

会话:会话是客户端登录服务器后,服务器向客户端发送的cookie,短时间内再访问该服务器就无需进行身份验证


案例

拓扑图

操作系统

IP 地址

角色

CentOS

192.168.10.101

Haproxy服务器

CentOS

192.168.10.102

Web服务器

CentOS

192.168.10.102

Web服务器

CentOS或Windows

192.168.10.104

访问网站测试


Web服务器配置

打开所有主机并连接上XShell

两个Web服务器的配置基本一致,因此先开启全部会话同步,然后单独关闭101(Haproxy)的会话同步

在102(Web服务器①)操作

关闭防火墙和内核安全机制,安装Apache网站服务

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd

关闭会话同步

在102(Web服务器①)操作

先关闭会话同步,然后为两个Web服务器添加不同的网页内容

[root@localhost ~]# echo "Test Web 01" > /var/www/html/index.html

在102(Web服务器①)操作

[root@localhost ~]# echo "Test Web 02" > /var/www/html/index.html

Haproxy配置

安装Haproxy

在101(Haproxy服务器)操作

这里我们使用源码包安装Haproxy,导入Haproxy源码包

在安装Haproxy之前需要先提供开发环境

为了方便实验关闭防火墙和内核安全机制,安装Haproxy所需的开发环境

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install pcre-devel bzip2-devel gcc*

解压源码包,进入解压目录

Haproxy的源码包在安装时,编译的时候需要指定当前系统的内核版本,可以先使用uname -r查看当前内核版本,然后make编译,make install安装

[root@localhost ~]# tar zxvf haproxy-1.5.19.tar.gz
[root@localhost ~]# cd haproxy-1.5.19
[root@localhost haproxy-1.5.19]# uname -r
6.9.1-1.el7.elrepo.x86_64
[root@localhost haproxy-1.5.19]# make TARGET=linux26
[root@localhost haproxy-1.5.19]# make install
# Haproxy的命令放到了/usr/local/sbin/
  • linux26:内核的版本为2.6或更高

Haproxy初步设置

然后进入解压目录下的example子目录,在/etc下新建一个目录,用来存放Haproxy的配置文件。拷贝配置文件

[root@localhost haproxy-1.5.19]# cd examples/
[root@localhost examples]# mkdir /etc/haproxy
[root@localhost examples]# cp haproxy.cfg /etc/haproxy/

为了方便在系统中使用Haproxy,拷贝服务脚本到管理服务的目录下,并且重命名把后缀去掉,然后为该脚本添加执行权

使用chkconfig命令将Haproxy添加为系统服务,注意--add选项指定的服务名称对应的是/etc/init.d/目录下服务脚本的名称

[root@localhost examples]# cp haproxy.init /etc/init.d/haproxy
[root@localhost examples]# chmod +x /etc/init.d/haproxy
[root@localhost ~]# chkconfig --add haproxy
[root@localhost ~]# chkconfig haproxy on  # 开机自启

拷贝命令文件,使其他程序也能找到Haproxy的命令

[root@localhost ~]# ln -s /usr/local/sbin/haproxy /usr/sbin/

Haproxy配置

打开Haproxy配置文件

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
配置文件各行说明

先删除26行以下的内容,然后这里讲解一下配置文件中的参数

global  # 全局配置项,如果与default的冲突了,应用default的参数
        log 127.0.0.1   local0  # 配置日志记录,local0为日志设备,默认是系统日志
        log 127.0.0.1   local1 notice # 日志级别为notice
        #log loghost    local0 info    
        maxconn 4096  # 最大连接数
        chroot /usr/share/haproxy  # 禁锢目录,存放Haproxy运行时的数据目录,需要创建出来或把该行注释掉才能启动Haproxy
        uid 99        # 用户uid
        gid 99        # 用户gid
        daemon        # 以守护进程的方式运行
        #debug        # 调试模式,输出启动信息到标准输出
        #quiet        # 安静模式,启动时无输出

defaults  # 默认配置项
        log     global       # 使用globle中定义的日志
        mode    http         # 模式为http
        option  httplog      # 采用http的格式记录日志
        option  dontlognull  # 保证Haproxy不记录上级负载均衡发送过来的用于检测状态数据的心跳包
        retries 3            # 检查节点连接失败的次数,超过3次认为节点不可用
        #redispatch          # 当负载很高时,自动结束当前队列处理比较久的连接
        maxconn 2000         # 最大连接数
        contimeout      5000    # 连接超时时间ms
        clitimeout      50000   # 客户端超时时间ms
        srvtimeout      50000   # 服务器超时时间ms

listen  webcluster 0.0.0.0:80   # 定义群集和监听的端口号
        option  httpchk GET /index.html  # 检查服务器的index.html文件,心跳检测URL设置
        balance roundrobin   # 调度算法为轮询
        server  inst1 192.168.1.61:80 check inter 2000 fall 3   # 定义在线节点
        server  inst2 192.168.1.62:80 check inter 2000 fall 3   
       
# check inter 2000是检测心跳频率(每2000ms检测一次),fall 3是3次失败认为服务器不可用

在新版本中,超时的设置做了调整,具体如下

contimeout 被 timeout connect取代:定义haproxy将客户端请求转发至后端服务器所等待的超时时长

clitimeout 被 timeout client取代:客户端非活动状态的超时时长,是 app 连接 haproxy的时间  

srvtimeout 被 timeout server取代:客户端与服务器端建立连接后,等待服务器端的超时时长,是haproxy 连接后端web服务器的时间

监听项配置

在Haproxy配置文件中,分为全局配置选项,默认配置选项,还有监听项

因为刚才我们删除了Haproxy提供的监听项模板,这里我们添加自己的监听项参数

在第26行之后添加以下内容,保存退出

listen myweb 0.0.0.0:80
    option httpchk GET /index.html
    balance roundrobin
    server inst1 192.168.10.102:80 check inter 2000 fall 3 weight 1
    server inst2 192.168.10.103:80 check inter 2000 fall 3 weight 2

Haproxy的特点包含了能够给后端服务器做健康状态检查

如果检测的类型是网站(httpchk),就是给该网站发送请求,这里指定为GET请求,然后指定想要访问的网页文件

roundrobin:指定的调度算法,轮询

inst1:实例名,可以自由定义

check inter 2000:心跳频率检查,单位是毫秒 (ms)

weight:指定权重值,请求分发的次数

fall:检测次数

启动Haproxy

注意配置文件中的参数:chroot /usr/share/haproxy:存放Haproxy运行时的数据目录,需要创建出来或把该行注释掉

启动服务

[root@localhost ~]# systemctl start haproxy
测试

在104(客户端)操作

使用curl命令测试,这里使用Haproxy服务器的IP来访问(代理)

[root@localhost ~]# curl 192.168.10.101
Test Web 02
[root@localhost ~]# curl 192.168.10.101
Test Web 02
[root@localhost ~]# curl 192.168.10.101
Test Web 01
配置Haproxy日志

在102(Web服务器①)操作

此时如果去查看某个Web服务器的访问日志就可以发现访问的IP都是代理服务器的IP

[root@localhost httpd]# tail /var/log/httpd/access_log
192.168.10.101 - - [07/Aug/2024:10:22:07 +0800] "GET /index.html HTTP/1.0" 200 12 "-" "-"
192.168.10.101 - - [07/Aug/2024:10:22:09 +0800] "GET /index.html HTTP/1.0" 200 12 "-" "-"
192.168.10.101 - - [07/Aug/2024:10:22:11 +0800] "GET /index.html HTTP/1.0" 200 12 "-" "-"

在101(Haproxy服务器)操作

Haproxy的日志需要手动配置才能生成

修改配置文件,在全局配置选项添加下方内容

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
global
    log 127.0.0.1   local0
    log 127.0.0.1   local1 notice
    log 127.0.0.1   local3  # 添加该行

新建Haproxy配置日志的文件,添加下方内容

使用rsyslog服务的udp-514端口接收local3的日志,存放在/var/log/haproxy.log文件中

[root@localhost ~]# vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log

imudp:用于接收日志

因为修改了配置文件,重启rsyslog和Haproxy服务

[root@localhost ~]# systemctl restart rsyslog
[root@localhost ~]# systemctl restart haproxy

在104(客户端)操作

来到客户端访问几次,让日志生成信息

[root@localhost ~]# curl 192.168.10.101
Test Web 01
[root@localhost ~]# curl 192.168.10.101
Test Web 02
[root@localhost ~]# curl 192.168.10.101
Test Web 01

在101(Haproxy服务器)操作

最后来到在rsyslog配置文件中指定local3的位置就可以看到生成的文件,文件内也生成了日志信息了

[root@localhost ~]# cd /var/log/
[root@localhost log]# ls
haproxy.log
[root@localhost log]# cat haproxy.log 
Aug  7 16:27:00 localhost haproxy[12499]: Proxy myweb started.
Aug  7 16:27:13 localhost haproxy[12500]: 192.168.10.104:49790 [07/Aug/2024:16:27:13.957] myweb myweb/inst1 0/0/0/0/0 200 252 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Aug  7 16:27:14 localhost haproxy[12500]: 192.168.10.104:49796 [07/Aug/2024:16:27:14.644] myweb myweb/inst2 0/0/0/0/0 200 252 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
Aug  7 16:27:14 localhost haproxy[12500]: 192.168.10.104:49808 [07/Aug/2024:16:27:14.904] myweb myweb/inst1 0/0/0/0/0 200 252 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值