day43-负载均衡与keepalived高可用

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱包林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值