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命令访问)
四,扩展: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一模一样。
评论
发表评论