1. ✅负载均衡处理用户的流程
- 处理静态资源
-
- 用户 -- >|b
-
-
- dns解析 -- 域名 --- >lb ip上.
- 通过三次握手与负载均衡+80端口建立连接.
- 发出http请求报文:GET+URI,Host头信息,UA.
- 到达负载均衡lb,80端口,http区域,server区域多个server
- 请求的Host信息与80端口server的server_name进行匹配
- 匹配成功对应站点处理,失败默认或按顺序处理.
- location/ proxy_pass转发,转发到对应的分组中或ip.
- proxy_pass的时候,带上Host头记录域名,XFF头,XRI记录ip.
-
-
- lb -- >web
-
-
- 三次握手,与web+80端口.
- 发出http请求,GET+URI,Host头信息,UA,XFF头,XRI记录ip.
- 到达web服务器,80端口,与nginx,http区域 server匹配
- 根据请求的Host头与80端口的server中server_name 匹配
- 匹配成功对应站点处理,失败默认或按顺序处理.
- 对应的站点处理,静态站点目录+uri直接返回给用户
-
-
- web --- >lb
- Ib --- >用户
- 用户拿到http响应.
- 处理动态资源
-
- 用户 -- >负载均衡lb
-
-
- dns解析 -- 域名 --- >负载均衡lb ip上.
- 三次握手与负载均衡+80端口建立连接.
- 发出http请求报文:GET/POST+URI,Host头信息,UA.
- 到达负载均衡lb,80端口,与nginx,http区域 server匹配.
- 根据请求的Host信息与80端口server的server_name进行匹配
-
-
-
- 匹配成功对应站点处理,失败默认或按顺序处理.
- location/ proxy_pass转发,转发到对应的分组中或ip.
- proxy_pass的时候,带上Host头记录域名,XFF头,XRI记录ip.
-
-
- Ib -- >web
-
-
- 三次握手,与web+80端口.
- 发出http请求,GET+URI,Host头信息,UA,XFF头,XRI记录ip.
- 到达web服务器,80端口,与nginx,http区域 server匹配
- 根据请求的Host头与80端口的server中server_name 匹配
- 匹配成功对应站点处理,失败默认或按顺序处理.
- 对应的站点处理
- 转发给9000端口,带着php页面绝对路径(站点目录+uri)
- php处理:解析运行php文件.
-
-
- php -- >ngx:处理结果.
- web --- >lb 请求web -- >lb
- Ib --- >用户
- 用户拿到http响应.
2. ✅负载均衡轮询算法🌟🌟🌟🌟🌟
算法 |
说明 |
应用 |
轮询 |
rr轮询 |
nginx默认算法 |
加权轮询 |
wrr轮询 |
通过修改权重让服务器增加或减少请求 |
ip哈希 |
ip_hash |
对客户端ip地址进行hash计算,只要ip地址一样,就会访问相同的web节点 容易负载不均,可以解决会话保持(登录保持)问题 |
url哈希 |
url_hash |
对客户端请求的url进行哈希,访问相同的url就会访问相同的web节点(缓存服务器) |
最小连接数 |
least_conn |
动态算法,根据连接情况转发,哪台web连接数最小就发给哪台 |
最小连接时间 |
least_time |
动态算法,根据连接情况转发,哪台web响应快就转发给哪台 |
一致性哈希算法 |
hast $remote_addr consistent; |
ip_hash的加强版,智能版本,增加或减少web节点,原来的客户端还会访问相同的web节点 |
2.1. ☀️加权轮询
- 通过修改权重让服务器增加或减少请求
upstream lb_pools {
server 10.0.0.7:80 weight=3;
server 10.0.0.8:80 weight=1;
}
server {
listen 80;
server_name lb.zbl.cn;
#error_log
#access_log
location / {
proxy_pass http://lb_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
}
2.2. 🔥ip哈希
- 对客户端ip地址进行hash计算,只要ip地址一样,就会访问相同的web节点
upstream lb_pools {
ip_hash;
server 10.0.0.7:80 weight=3;
server 10.0.0.8:80 weight=1;
}
2.3. 🌏url哈希
upstream lb_pools {
hash $request_uri;
server 10.0.0.7:80 weight=3;
server 10.0.0.8:80 weight=1;
}
3. 负载均衡模块指令补充
upstream中server中指令 |
说明 |
weight |
权重 |
max_fails |
认为这个节点无法访问,失败次数,默认是1,可以设置3次左右即可 |
fail_timeout |
默认是10秒,失败后10s后再次测试 |
backup |
备用节点,其他所有节点挂了才会启动 |
- 雪崩:某个机器挂了,导致其他机器也跟着挂了
4. ✅HA高可用服务
4.1. 📝概述
- 高可用:HA HighAvailablity -->keepalived
- keepalived生成vip(虚拟ip),dns解析到这个vip地址即可
选型 |
说明 |
keepalived |
活着,高可用软件,负载使用,一些不涉及数据服务,起初开发出来是给lvs. |
heartbeat |
心跳 高可用软件,涉及数据库,存储数据相关可以用,heartbeat + drbd |
商业高可用软件 |
RoseHA...略... |
4.2. 🌏原理
- keepalived是基于VRRP协议实现高可用.
- VRRP虚拟路由冗余协议,最开始是给网络设备实现高可用,目前keepalive实现vrrp协议,通过vrrp实现高可用.
- 分为主,备,一般是2个节点,主备之间通过vrrp协议发送数据包沟通.
- 主给备定期发送数据包,备收到数据包表示主还活着,备无法收到数据包,表示主挂了,备接管用户请求流量.
- vrrp协议使用组播的ip 224.xx.xx.xx
4.3. 🚀急速上手指南
高可用环境准备 |
需要安装的服务 |
lb01 |
nginx+keepalived |
lb02 |
nginx+keepalived |
4.4. 📝keepalived配置文件详解
! Configuration File for keepalived
#全局定义部分
global_defs {
#每一个keepalived的名字,当前网络中唯一.
router_id lb01
}
#vrrp实例配置部分 用于配置VIP 设置主备 virtual_ipaddress
#vrrp设置名字.
#vrrp实例名字 在同1对主备之间要一致. 在当前keepalived软件中唯一.
vrrp_instance vip_3 {
#主/备 MASTER主 BACKUP备 大写
state MASTER
#指定网卡网卡
interface ens33
#同1对主备之间这个id要一致.
virtual_router_id 51
#优先级 数字越大优先级越高 设置建议: 主>备 100 50 相差50
priority 100
#心跳间隔 多久发送一次vrrp数据包
advert_int 1
#授权与认证,保持默认即可. 对数据包加密.
authentication {
#简单认证
auth_type PASS
#1111
auth_pass 1111
}
#设置vip※※※※
virtual_ipaddress {
#label 设置了别名
10.0.0.3 dev ens33 label ens33:0
}
}
4.5. 🎯安装配置keepalived(主)
yum -y install keepalived
cp /etc/keepalived/keepalived.conf{,.bak}
global_defs {
router_id lb01
}
vrrp_instance vip_3 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev ens33 label ens33:0
}
}
4.6. 🎯安装配置keepalived(备)
yum -y install keepalived
cp /etc/keepalived/keepalived.conf{,.bak}
global_defs {
router_id lb02
}
vrrp_instance vip_3 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev ens33 label ens33:0
}
}
4.7. 启动服务
systemctl enable keepalived --now
4.8. 🔍验证
- keepalived每1秒发送心跳报文,关闭主节点keepalived,抓包看报文
5. ✅nginx+keepalived高可用
5.1. ✂️脑裂故障
- 脑裂/裂脑:
-
- 现象:主备都有vip
- 原因:
-
-
- 备认为主挂了,接管资源生成VIP,实际上主没有挂,仍有VIP
- 开启防火墙,selinux,keepalived配置,物理线路(网络介质)
-
-
- 监控:
-
-
- 监控(只要备节点有VIP就告警)
-
-
- 解决:
-
-
- 找个第三方机器,在这个机器上执行ssh root@10.0.0.6 hostname -I 检查是否存在VIP
- 监控备节点只要有VIP,远程控制主节点,只要备节点认为主挂了,就让他真的挂了(只能设备)
-
- 监控脑裂或主备切换脚本
在keepalived备节点执行监控脚本
脚本流程步骤:
1.统计ip a | grep 10.0.0.3 | wc -l
2.判断如果等于1则发出警告邮件(使用echo替代)
5.2. 📝案例: keepalived基于主机高可用软件
- 问题
-
- keepalived只会在主机挂了,网络断开后,才会进行主备切换
- 默认情况下keepalived不会监控某个服务
- 项目目标:某个服务关闭了,keepalived就进行主备切换
- 项目步骤:
-
- 书写脚本,过滤服务进程数,端口数量,检查是否允许(curl/wget)
- 然后在脚本中进行判断,如果服务没有运行,则关闭keepalived服务
- 修改keepalived配置文件,通过keepalived调用这个脚本(监控nginx)
- 创建使用脚本(函数)
- 在实例中调用
5.3. 🔍自定义监控脚本
- 注意:脚本名字不要包含要监控的服务名字
#!/bin/bash
##############################################################
# File Name:check_lb.sh
# Version:V1.0
# Author:zbl
# Organization:zhubaolin.blog.csdn.net
# Desc:
##############################################################
#1.vars
count=`ps -ef | grep nginx | wc -l`
#2.stop keepalived
if [ ${count} -eq 1 ];then
systemctl stop keepalived
fi
- 添加执行权限
chmod +x /server/scripts/check_lb.sh
5.4. 🌈keepalived调用监控脚本
#/etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_script check_lb.sh {
script /server/scripts/check_lb.sh
interval 2
weight 1
user root
}
vrrp_instance vip_3 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev ens33 label ens33:0
}
track_script {
check_lb.sh
}
}
- 重启服务
systemctl restart keepalived
5.5. 🔍验证
- 关闭nginx,验证是否自动关闭keepalived
6. ✅wordpress接入负载均衡
6.1. 🌏将博客域名host解析到VIP地址
10.0.0.3 blog.zbl.cn