LB-Haproxy/Nginx
💯 解析:七层负载均衡器,为与七层模型上的应用层,通过URL地址(应用层)进行负载均衡。
优点:详细地址,数据精准定位
缺点:地址长、范围广
一、HAproxy
原理解析
别名:七层负载均衡、应用程序负载、URL负载、动静分离技术 用80端口
简介: 免费、快速可靠、高性能的负载均衡软件
亲缘性:
- 后方有三台Web服务器,用户进行数据请求,当用户访问Web1时(一些特定的敏感话题会进行认证)
- 当我们的用户再次访问时,请求分发到我们的Web2上,又要进行认证。
- 所有我们通过用户访问得特性让用户访问到固定的服务器(IP port seesion cookie…),解决了身份再次验证导致的用户体验感。
seesion(会话窗口 服务器): 用户进行身份认证,保存信息 ==> 用户访问淘宝,加购物车,第一次要进行身份认证,后面无需认证
cookie(缓存 浏览器): 保存用户身份认证信息,通常由浏览器存储,windows端
TCP连接(秒表)
- User <==> Web
- 当User向Web请求数据时,会有一个计时器,当在一定的时间没响应,直接返还给用户,数据未找到。
- 当三次握手完成之后,向Web请求数据,服务器没反应,开启秒表,将数据进行重传递
- User <=> HA <=> Web
- 多了中间人(HAproxy)作为代理,用户访问HA,HA在分发给Web,HA的两边都是互相无感知的
- 会出现问题,当User在请求数据后直接关机,请求到达HA,HA不将数据发送给Web,
如果Web服务出现问题,HA将User的请求分发给其他的Web(这时,秒表计时器有很大的体现)。
1、环境准备
1、HAproxy:192.168.178.60
2、Web1:192.168.178.7
3、Web2:192.168.178.16
# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0
2、Web
1、安装httpd:
# yum -y install httpd
2、Web1 添加内容:
# echo "Web1" > /var/www/html/index.html
3、Web2 添加内容
# echo "Web2" > /var/www/html/index.html
3、HAproxy
3.1、安装软件
# yum -y install epel-release haproxy
3.2、编写配置文件
# cd /etc/haproxy/
# cp -r haproxy.cfg haproxy.cfg.bak
# vim haproxy.cfg
global #全局配置
log 127.0.0.1 local3 info #日志配置
maxconn 4096 #最大连接数
uid 99 #用户
gid 99 #用户组
daemon #进程守护
nbproc 1 #HAproxy的进程数,该值与服务器的CPU核心数一致,比如2颗8核心的,这是设置值为16
pidfile /run/haproxy.pid #进程ID存储位置
#----------------------------------------------------------------
defaults #系统默认配置
log global #日志使用上方的全局配置
mode http #模式为7层LB
maxconn 2048 #最大连接数
retries 3 #健康检测,3次连接失败认为服务器不可用
option redispatch # 服务器不可用,重定向到其他服务器,进行服务器之间的故障转移
timeout connect 50000 # HAproxy 将 用户请求 转至 后端的超时时长
timeout client 50000 # HAproxy作为客户端,与后端空闲的交互超时时长
timeout server 50000 # HAproxy作为服务端,与用户之间空闲交互的超时时长
option abortonclose # 当服务端负载较高时,自动结束当前队列比较久的链接
stats uri /admin?stats # 监控页面的URL IP:/admin?stats
stats auth Private land # 登入监控页面提示的内容
stats auth admin:admin # 登入页面使用的 用户与密码 用户:密码
stats hide-version # 隐藏监控页面的 HAproxy版本号,
#----------------------------------------------------------------
frontend httpd-in # 前端配置,面向与用户
bind 0.0.0.0:80 # HAproxy 的监听端口,用户通过 IP+端口访问
mode http # 模式为 七层的 http请求
log global # 使用上方的全局Log
option httplog # 日志格式变得更丰富,获取更详细的信息
option httpclose # 每次请求后,关闭 http 通道
acl html url_reg -i \.html$ # (html自定义名,方便下方的调用) 如果用户访问以 .html 结尾的页面
use_backend html-server if html # 如果命中上方的 html 定义的策略,分发到 html-server 后端
default_backend html-server # 默认用户请求的 后端
#-----------------------------------------------------------------
backend html-server # 定义 后端的服务器
mode http # 模式为 七层 http请求
balance roundrobin # 负载算法 为 轮询
option httpchk GET /index.html # 允许 HAproxy 进行 HTTP-GET Web服务的 /index.html,进行健康检查
cookie SERVERID insert indirect nocache # 增加亲缘性,Web服务返回给用户带有Cookie的数据,用户可以访问到相同的服务器
server Web1 192.168.178.7:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
server Web2 192.168.178.16:80 weight 1 cookie 4 check inter 2000 rise 1 fall 3
# server1 服务器ID 真实Web-IP端口 权重 cookie值 进行检测 检测5次,其中连续有2次成功,代表该Web服务器健康,反之Web服务器故障
3.3、启动HAproxy
1、启动服务:
# systemctl start haproxy
2、查看是否有报错信息:
# vim /var/log/messages
3、查看服务启动成功:
# ss -anpt | grep 80
3.4、进行测试
# curl 192.168.178.60
web2
# curl 192.168.178.60
web1
3.5、登入 Web 监控页面
二、实战一 动静分离技术+Keepalived
动静分离技术
简介:
- 用户请求数据时,访问的是图片,到达后方的图片服务器
- 访问的是视频,到达后方的视频服务器
- 访问的文本服务器,到达文字服务器
1、环境准备
1、HAproxy1-keepalived1:192.168.178.60
2、HAproxy2-keepalived2:192.168.178.61
3、keepalived-VIP:192.168.178.200
2、Web1-html静:192.168.178.7
3、Web2-php动:192.168.178.16
# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0
2、Web
2.1、Web1-html静
# yum -y install httpd
# echo 'Web1-html' > /var/www/html/index.html
# systemctl --now enable httpd
# curl localhost
Web1-html
2.2、Web2-php动
a、安装软件
# yum -y install epel-release && yum -y install php php-fpm nginx
b、配置nginx 连接PHP
# vim /etc/nginx/nginx.conf
#在Server 中进行添加
server {
.........
location / {
html index.php index.html index.htm;
}
location ~ \.php$ { #连接PHP服务器
root /usr/share/nginx/html; #php存放文件的目录
fastcgi_pass 127.0.0.1:9000; #PHP服务器的地址:端口 !!!!!!
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
.........
}
因为Nginx 与 PHP 部署在一台机器上,不许要修改PHP 配置,直接启动
c、 启动服务
1、重启nginx 与 启动 php-fpm:
# systemctl restart nginx
# systemctl start php-fpm
2、查看服务是否启动成功:
# ss -anpt | egrep '(80|9000)'
d、编写index.php,访问
# echo '<?php phpinfo() ?>' > /usr/share/nginx/html/index.php
2、HAproxy
两台主机同时进行
2.1、安装软件
# yum -y install epel-release && yum -y install haproxy keepalived
2.2、编写haproxy配置
# cd /etc/haproxy/
# cp -r haproxy.cfg haproxy.cfg.bak
# vim haproxy.cfg
global
log 127.0.0.1 local3 info
maxconn 4096
uid 99
gid 99
daemon
nbproc 1
pidfile /run/haproxy.pid
#--------------------------------------
defaults
log global
mode http
maxconn 2048
retries 3
option redispatch
timeout connect 50000
timeout client 50000
timeout server 50000
option abortonclose
stats uri /admin?stats
stats auth Private land
stats auth admin:admin
stats hide-version
#--------------------------------------
frontend httpd-in
bind 0.0.0.0:80 # 监听端口
mode http
log global
option httplog
option httpclose
acl php url_reg -i \.php$ #匹配 .php 结尾
acl html url_reg -i \.html$ #匹配 .html 结尾
use_backend php-server if php #上方匹配成功后对应的后端
use_backend html-server if html
default_backend php-server
#--------------------------------------
backend php-server #匹配 .php 对应的后端服务器,可以有多个,自定义
mode http
balance roundrobin
option httpchk GET /index.php
cookie SERVERID insert indirect nocache
server Php1 192.168.178.16:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
backend html-server #匹配 .html 对应的后端服务器
mode http
balance roundrobin
option httpchk GET /index.html
cookie SERVERID insert indirect nocache
server Web1 192.168.178.7:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
2.3、启动服务
1、启动服务:
# systemctl start haproxy
2、查看日志:
# vim /var/log/messages
3、查看服务启动:
# ss -anpt | grep 80
2.4、测试效果
1、访问 HAproxy1:
# curl 192.168.178.60/index.html
Web1-html
2、访问 HAproxy2:
# curl 192.168.178.61/index.html
Web1-html
3、Keepalived
3.1、Keepalived1
a、修改配置
# cd /etc/keepalived/
# cp -r keepalived.conf keepalived.conf.bak
# vim keepalived.conf
! Configuration File for keepalived
global_defs { #全局配置
router_id HA1 #设备在组中的标识,设置不一样即可
}
vrrp_script chk_haproxy { #健康检查
script "/etc/keepalived/ck_HA.sh" #检查脚本
interval 6 #检查频率.秒(每隔6秒去执行脚本)
weight -5 #priority减5
fall 3 #失败三次(尝试三次,每隔两秒去执行脚本,如果脚本失败,就记下来,等检查三次后,将优先级减5)
}
vrrp_instance VI_1 { #VI_1(组号)。实例名两台路由器相同。
state MASTER #主或者从状态
interface ens33 #监控网卡(心跳网卡)
mcast_src_ip 192.168.178.60 #心跳源IP
virtual_router_id 55 #虚拟路由编号(组编号),主备要一致。
priority 100 #优先级 (主要应用与1主多从)
advert_int 1 #心跳间隔S (对方主机运行状态的监控)/可以为毫秒级监控
authentication { #秘钥认证(1-8位)
auth_type PASS #密码认证类型
auth_pass 123456 #密码
}
virtual_ipaddress { #VIP
192.168.178.200/24
}
track_script { #引用脚本,监控脚本
chk_haproxy
}
}
b、编写监控脚本
🔺解析:因为是与HAproxy部署在同一台机器上,所以对HAproxy的高可用进行监控,HAproxy会对后方的Web服务进行监控。
# vim ck_hA.sh
#!/bin/bash
#检查HAproxy进程是否存在
counter=$(ps -C haproxy --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl restart haproxy
sleep 5 #尝试启动一次HAproxy,停止5秒后再次检测
counter=$(ps -C haproxy --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived #如果启动没成功,就杀掉keepalive触发主备切换
fi
fi
# chmod +x ck_HA.sh
c、拷贝文件至 Keepalived2
# scp -r keepalived.conf 192.168.178.61:/etc/keepalived/
# scp -r ck_HA.sh 192.168.178.61:/etc/keepalived/
3.2、Keepalived2
1、修改配置:
# vim keepalived.conf
#找到进行修改
router_id hA2
state BACKUP
mcast_src_ip 192.168.178.61
priority 99
2、启动 keepalived:
#systemctl start keepalived
3.3、所有Keepalived启动
# systemctl --now enable keepalived
# ip a
3.4、访问测试
# curl 192.168.178.200/index.html
Web1-html
3.5、故障模拟
解析:将HAproxy1的配置文件移除,致使HAproxy起不来,实现VIP的转移
1、移动 HAproxy1 的配置文件:
# mv /etc/haproxy/haproxy.cfg /opt/
# systemctl stop haproxy
2、查看 HAproxy2 上的IP,IP进行转移:
# ip a
3、再次访问服务,访问成功:
# curl 192.168.178.200/index.html
Web1-html
# curl -I 192.168.178.200/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 04:49:01 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/ # cookie ID
Cache-control: private
三、实战二 生产环境
解析:这也是企业中常用的一种架构,在生产环境中,haproxy与LVS等负载均衡设备往往不是单种存在的,主要是每一个设备都有自身的优点与缺点。把四层与七层组合起来使用,进行互补,既有四层的吞吐量,又有七层的精准定位与动静分离等,这是再好不过了。
1、环境准备
LVS-VIP:192.168.178.100
LVS1-keepalived:192.168.178.60
LVS2-keepalived:192.168.178.61
HAproxy1:192.168.178.62
HAproxy2:192.168.178.63
Web1:192.168.178.7
Web2:192.168.178.16
1、关闭防火墙:
# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0
2、修改主机名:
# hostnamectl set-hostname lvs1/lvs2/ha1/ha2/web1/web2
3、时间同步:
# yum -y install ntpdate
# ntpdate ntp1.aliyun.com
4、计划任务,时间同步
# systemctl --now enable crond
# crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
2、Web 配置
2.1、Web1-html静
# yum -y install httpd
# echo 'Web1-html' > /var/www/html/index.html
# systemctl --now enable httpd
# curl localhost
Web1-html
2.2、Web2-php动
a、安装软件
# yum -y install epel-release && yum -y install php php-fpm nginx
b、配置nginx 连接PHP
# vim /etc/nginx/nginx.conf
#在Server 中进行添加
server {
.........
location / {
html index.php index.html index.htm;
}
location ~ \.php$ { #连接PHP服务器
root /usr/share/nginx/html; #php存放文件的目录
fastcgi_pass 127.0.0.1:9000; #PHP服务器的地址:端口 !!!!!!
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
.........
}
因为Nginx 与 PHP 部署在一台机器上,不许要修改PHP 配置,直接启动
c、 启动服务
1、重启nginx 与 启动 php-fpm:
# systemctl restart nginx
# systemctl start php-fpm
2、查看服务是否启动成功:
# ss -anpt | egrep '(80|9000)'
d、编写index.php,访问
# echo '<?php phpinfo() ?>' > /usr/share/nginx/html/index.php
3、HAproxy 配置
两台主机同时进行
3.1、安装软件
# yum -y install epel-release && yum -y install haproxy keepalived
3.2、编写haproxy配置
# cd /etc/haproxy/
# cp -r haproxy.cfg haproxy.cfg.bak
# vim haproxy.cfg
global
log 127.0.0.1 local3 info
maxconn 4096
uid 99
gid 99
daemon
nbproc 1
pidfile /run/haproxy.pid
#--------------------------------------
defaults
log global
mode http
maxconn 2048
retries 3
option redispatch
timeout connect 50000
timeout client 50000
timeout server 50000
option abortonclose
stats uri /admin?stats
stats auth Private land
stats auth admin:admin
stats hide-version
#--------------------------------------
frontend httpd-in
bind 0.0.0.0:80 # 监听端口
mode http
log global
option httplog
option httpclose
acl php url_reg -i \.php$ #匹配 .php 结尾
acl html url_reg -i \.html$ #匹配 .html 结尾
use_backend php-server if php #上方匹配成功后对应的后端
use_backend html-server if html
default_backend php-server
#--------------------------------------
backend php-server #匹配 .php 对应的后端服务器,可以有多个,自定义
mode http
balance roundrobin
option httpchk GET /index.php
cookie SERVERID insert indirect nocache
server Php1 192.168.178.16:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
backend html-server #匹配 .html 对应的后端服务器
mode http
balance roundrobin
option httpchk GET /index.html
cookie SERVERID insert indirect nocache
server Web1 192.168.178.7:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
3.3、启动服务
1、启动服务:
# systemctl --now enable haproxy
2、查看日志:
# vim /var/log/messages
3、查看服务启动:
# ss -anpt | grep 80
3.4、测试效果
1、访问 HAproxy1:
# curl 192.168.178.62/index.html
Web1-html
2、访问 HAproxy2:
# curl 192.168.178.63/index.html
Web1-html
4、LVS 配置
4.1、安装软件
LVS1:
# yum -y install ipvsadm keepalived
LVS2:
# yum -y install keepalived
4.2、LVS1配置
a、修改配置文件
# cd /etc/keepalived/
# cp -r keepalived.conf keepalived.conf.bak
# vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS1 #名称,自定义
}
vrrp_instance VI_1 {
state MASTER #另外一台机器是BACKUP
interface ens33 #心跳网卡
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 150 #优先级
advert_int 1 #检查间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.178.100/24 dev ens33 #VIP和工作接口
}
}
virtual_server 192.168.178.100 80 { #LVS 配置,VIP
delay_loop 3 #服务论询的时间间隔,#每隔3秒检查一次real_server状态
lb_algo rr #LVS 调度算法
lb_kind DR #LVS 集群模式
protocol TCP
real_server 192.168.178.62 80 { #HAproxy1服务器
weight 1
TCP_CHECK {
connect_timeout 3 #健康检查方式,连接超时时间 (每隔三秒去连接Web,如果超时,就认为Web服务down机)
}
}
real_server 192.168.178.63 80 { #HAproxy2服务器
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
b、启动服务,重启
# scp -r keepalived.conf 192.168.178.61:/etc/keepalived/
# systemctl --now enable keepalived
# reboot
4.3、LVS2配置
a、修改配置
# vim /etc/keepalived/keepalived.conf
#找到进行修改
router_id LVS2
state BACKUP
priority 145
b、自启动服务与重启
# systemctl --now enable keepalived
# reboot
5、再次配置HAproxy lo:0虚拟接口
两台机器同时操作
5.1、配置虚拟IP -> lo:0
# cd /etc/sysconfig/network-scripts/
# cp -r ifcfg-lo ifcfg-lo:0
# vim ifcfg-lo:0
DEVICE=lo:0 #接口名
IPADDR=192.168.178.100 #LVS的虚拟IP
NETMASK=255.255.255.255 #地址唯一性
ONBOOT=yes #自启
#其他的注释
5.2、配置路由
# vim /etc/rc.local
#添加
# 开机生效 确保如果请求的目标IP是$VIP,那么让出去的数据包的源地址也显示为$VIP
/sbin/route add -host 192.168.178.100 dev lo:0
5.3、配置ARP
1、忽略arp请求,可以回复
# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
5.4、重启生效
# reboot
6、故障测试
6.1、访问服务
# curl 192.168.178.100/index.html
Web1-html
# curl -I 192.168.178.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 11:00:33 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/
Cache-control: private
6.2、停止LVS1的keepalived,再次访问服务
# systemctl stop keepalived
# curl 192.168.178.100/index.html
Web1-html
# curl -I 192.168.178.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 11:02:57 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/
Cache-control: private
6.3、停止 HAproxy1服务,再次访问服务
# systemctl stop haproxy
# curl 192.168.178.100/index.html
Web1-html
# curl -I 192.168.178.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 11:04:46 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/
Cache-control: private