HAProxy + Keepalived 动静分离实验记录

前言:在此前的讨论中,我们关注的是 LVS 的功能,这是一种专注于第四层(TCP/UDP协议)的负载均衡解决方案。而HAProxy则更为多才多艺,不仅能在第四层提供负载均衡,还能扩展至第七层,即应用层。HAProxy的这种灵活性允许它执行更加精细化的负载均衡策略,比如基于应用程序的负载均衡、基于URL的请求分发,以及对动态和静态内容的智能分离。

本次实验将专注于实现动静分离策略,并将其与之前介绍的 keepalived 结合起来,构建一个高度可用的动静分离负载均衡架构。这样,我们既保证了系统的高可用性,又通过HAProxy提升了请求处理的效率和速度。

一,实验背景


使用了6台虚拟机分别作为:HA1/2 、HTTP1/2 、PHP1/2 (为了简化数据库都没装,IP是自动分配的),最后客户端使用物理机。

Client:物理机(VMnet8)192.168.229.1
HA1:192.168.229.133
HA2:192.168.229.148
HTTP1:192.168.229.144
HTTP2:192.168.229.145
PHP1:192.168.229.146
PHP2:192.168.229.147
PS:注意要关闭防火墙和SELinux

二,实验步骤

2.1,安装与配置 Keepalived

在HA1-2之间配置keepalived来保证场景的高可用

#安装keepalived
 yum install keepalived.x86_64 -y
 #编辑配置keepalived文件
 vim /etc/keepalived/keepalived.conf 
 ! Configuration File for keepalived
global_defs {
        router_id HA1    #两边不一样。
        }

vrrp_instance VI_1 {
        state MASTER                            #另外一台机器是BACKUP
        interface ens33                         #心跳网卡
        virtual_router_id 100                   #虚拟路由编号,主备要一致
        priority 150                            #优先级
        advert_int 1                            #检查间隔,单位秒
        authentication {
                auth_type PASS
                auth_pass 12345
                }
        virtual_ipaddress {
                192.168.229.200                #keepalived虚拟IP
                }
        }
        
systemctl start keepalived.service  #启动keepalived
HA2上的keepalived配置和这差不多,主要修改以下两点:
state BACKUP
priority 100

2.2,安装与配置 HAProxy


yum install epel-release -y  
yum install haproxy18.x86_64 -y
vim /etc/haproxy/haproxy.cfg  #编辑haproxy配置文件
global
    log /dev/log    local0                     # 定义全局日志级别
    log /dev/log    local1 notice              # 只记录 notice 级别以上的日志
    chroot /var/lib/haproxy                   # 为haproxy进程设定根目录,提高安全性
    user haproxy                              # 指定haproxy工作的系统用户
    group haproxy                             # 指定haproxy工作的系统用户组
    daemon                                    # 以守护进程的方式运行haproxy

defaults
    log         global                         # 使用全局日志设置
    mode        http                            # 工作模式设定为HTTP
    maxconn     2048                           # 最大连接数设置为2048
    retries     3                              # 连接失败后的重试次数为3
    option      httplog                        # 开启HTTP日志格式
    option      redispatch                     # 当server宕机时,重定向连接到其他server
    option      dontlognull                    # 不记录空连接日志
    stats uri   /haproxy?stats                 # 设定统计页面的URI
    stats auth  abc:321                        # 统计页面的认证信息
    stats       hide-version                   # 在统计页面隐藏HAProxy版本
    cookie SERVERID insert indirect nocache    # 启用cookie插入,用于session持久性
    timeout connect 5000                       # 连接超时设置为5000毫秒
    timeout client  50000                      # 客户端超时设置为50000毫秒
    timeout server  50000                      # 服务器超时设置为50000毫秒

frontend http_front
    bind *:80
    acl is_php path_end .php                   # 定义一个名为is_php的ACL用于检测URL是否以.php结尾
    use_backend php_back if is_php             # 如果请求满足is_php,则使用php_back
    default_backend http_back                  # 其他所有请求均使用http_back

backend http_back
    balance roundrobin                        # 使用轮询负载均衡算法
    option httpchk GET /index.html            # 设置健康检查页面
    server HTTP1 192.168.229.144:80 cookie 1 inter 2000 rise 2 fall 5  # 定义HTTP后端服务器1
    server HTTP2 192.168.229.145:80 cookie 2 inter 2000 rise 2 fall 5  # 定义HTTP后端服务器2

backend php_back
    balance roundrobin                         # 使用轮询负载均衡算法
    option httpchk GET /test.php              # 设置PHP健康检查页面
    server PHP1 192.168.229.146:80 cookie 3 inter 2000 rise 2 fall 5  # 定义PHP后端服务器1
    server PHP2 192.168.229.147:80 cookie 4 inter 2000 rise 2 fall 5  # 定义PHP后端服务器2
    
systemctl restart haproxy        #启动haproxy服务
systemctl status haproxy			#查看启动状态
haproxy -c -f /etc/haproxy/haproxy.cfg    #如果状态报错,使用此命令检查配置文件是否有语法错误

HA1-2的配置一样

2.3,在http1-2开启httpd服务,并设置测试页

#安装httpd
yum install httpd -y
#这里内容自定义,区分开http1和http2就行了
echo "<h1>This is the static page of HTTP1</h1>" >/var/www/html/index.html
systemctl start httpd
systemctl status httpd

查看访问效果




2.4,在PHP1-2开启HTTPD + PHP服务,并设置PHP测试页

#安装httpd 、PHP模块
yum install httpd php php-mysql -y  
systemctl restart httpd
#创建PHP页面,这里以HTTP1为例
vim /var/www/html/test.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>PHP Test Page</title>
</head>
<body>
    <h1>PHP Test</h1>
    <?php echo "Hello, World! This is HTTP1(229.146)  PHP test page."; ?>
    </body>
</html>

三,验证&测试

3.1,查看master是否生效,通过虚拟IP访问haproxy状态页/haproxy?stats状态页



状态页可以打开,且状态页验证生效

3.2,分别访问静态(index.html),动态(test.php)




用浏览器看不到轮询效果,因为有cookie的缘故。下面使用命令行查看更加直观。

3.3,查看日志验证动静分离(用curl命令访问)



keepalived、HAproxy  URL动静分离、轮询效果,都可以看出来。

四,扩展:NGINX作为七层负载均衡器来代替haproxy

4.1,思路:关掉HA1,通过keepalived自动切换master为HA2,修改HA2的配置


可以看到切换成功,然后在HA2上进行以下配置:
#关掉haproxy服务
systemctl stop haproxy.service
#安装nginx
yum install nginx -y
#添加nginx配置文件
cat /etc/nginx/conf.d/uptream.conf
upstream html {
    server 192.168.229.144 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.229.145 weight=1 max_fails=3 fail_timeout=30s;
    # 可以通过调整后面的参数来分配流量及超时设置
}

upstream php {
    #ip hash   可以修改负载均衡算法,默认是轮询rr
    server 192.168.229.146;
    server 192.168.229.147;
}

server {
        listen 80;
        server_name 192.168.229.200;

        location / {
        proxy_pass http://html;
        }

        location ~ \.php$ {
        proxy_pass http://php;
        }
}

可以看到现象和使用haproxy一模一样。

选择Nginx还是HAProxy,通常取决于特定环境和需求:


  • 性能:两者都非常高效,具体性能可能取决于工作负载特性。
  • 功能需求:如果需要web服务器或者其他HTTP相关的高级功能,比如静态内容缓存,Nginx可能是更好的选择。如果需要高度自定义的负载分配和健康检查,HAProxy可能是更合适的选项。
  • 配置和管理:不同的工具有不同的学习曲线,选择那个更容易配置和管理对团队来说也很重要。
  • 现有基础设施:某些环境下可能已有Nginx或HAProxy在用,若能继续用同一工具,可能有利于减少学习和迁移的复杂性。
  • 社区和支持:考虑到问题解决和学习资源的丰富程度,及时获取社区和商业支持也是决策的一个因素。

评论

此博客中的热门博文

ELK日志平台——Elasticsearch 8.x安装部署

Linux终端中文字体显示乱码问题解决方法

部署ELK日志平台集群(Elasticsearch, Logstash, Kibana)实验记录