Keepalived 高可用,nginx + keepalived , lvs + keepalived、 数据库+keepalived

keepalived

官网

Keepalived 可以用来防止服务器单点故障的发生

csharp 复制代码
# 原理
是基于VRRP协议实现的,当backup收不到vrrp包时,就认为master宕机了,这时就需要根据VRRP的优先级来选举一个backup 当master,就实现服务的HA(高可用)啦

# VRRP  Vitrual Router Redundancy Protocol ,虚拟路由冗余协议
这个协议,可以认为实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的VIP(该路由器所在局域网内其它机器的默认路由为该VIP),master 会发组播,当backup收不到vrrp包时就认为master 宕机了,这时就需要根据VRRP的优先级来选举一个backup 当master,就实现路由器HA(高可用)啦
#########
多台服务器组成一个虚拟路由器组 ,共享一个虚拟 IP 。通过优先级 选举 Master 节点,其他节点为 Backup。Master 节点定期发送 VRRP 通告,若 Backup 未收到通告,则触发选举新 Master。
##########
keepalived 主要包含三个模块 core 、 check、vrrp
# 1 core 是keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析
# 2 check 负责健康检查
# 3 vrrp模块来实现VRRP协议的

## check 健康检查:
1:支持 TCP、HTTP、HTTPS、SSL、脚本等多种检查方式。
2:若 Master 节点的服务异常,Keepalived **自动降低优先级**,触发 VIP 漂移到 Backup。

案例

scp 远程拷贝

csharp 复制代码
#  192.168.88.22 真实服务IP
#  192.168.88.33 真实服务IP
#  192.168.88.99 负载均衡服务IP
#  192.168.88.100 负载均衡服务IP
echo "RS-192.168.88.22 service" > /var/www/html/index.nginx-debian.html
echo "RS-192.168.88.33 service" > /var/www/html/index.nginx-debian.htm

》》》》 22、33 真实服务器

1、通过安装Nginx(当作web服务的),当然也可以安装tomcat

2、修改nginx的 默认网页内容

csharp 复制代码
# 安装nginx 作为web服务的,可以安装tomcat
apt update && apt install nginx -y && systemctl enable nginx && systemctl  restart nginx
# 修改nginx的 默认网页内容
echo "RS-192.168.88.22 service" > /var/www/html/index.nginx-debian.html
echo "RS-192.168.88.33 service" > /var/www/html/index.nginx-debian.htm

》》》》 99、100 负载均衡服务器

1、通过安装Nginx(当作负载均衡),当然也可以LVS、HAProxy

2、修改nginx的配置文件

3、安装keepalived

4、配置keepalived

》》》 99、100 负载均衡服务器 修改文件如下

csharp 复制代码
# 通过安装Nginx(当作负载均衡),当然也可以LVS、HAProxy 
apt update && apt install nginx -y && systemctl enable nginx && systemctl  restart nginx
#  99,100 (负载均衡器) 安装 Keepalived 
apt update && apt install keepalived -y && systemctl enable keepalived && systemctl start keepalived
## 修改之后 
## nginx -t  测试一下语法
## nginx -s reload   加载配置
## vim /etc/nginx/nginx.conf
worker_processes  2;

events {
    worker_connections  1024;
}

http {
   upstream httpd {
        server 192.168.88.22;
        server 192.168.88.33;
   }
   include       mime.types;
   default_type  application/octet-stream;

   sendfile        on;

   server {
       listen       80;
       #  为了模拟域名访问,  需要在访问的客户端 host 加   IP  service.zen.com
       # server_name  service.zen.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
          proxy_pass http://httpd;
        }

    }

}
csharp 复制代码
# 所有的负载均衡器(案例 99,100两台)都要 配置
# 一个是master,其它都是 backup
# priority  优先级 越大,优先级越高  
# 配置keepalived
## vim /etc/keepalived/keepalived.conf
#  这个是  主的
!Configuration File for keepalived

global_defs{
  # # 节点标识 支持字符串模式 backup 的这个名称要修改,不能一个名称  是唯一的
  router_id 99
  
}

vrrp_instance VI_1 {
  #  # 初始状态:MASTER/BACKUP
  state master   
  # # 绑定的物理网卡  要通过ip ad 查看 linux 是 ens,还是eth
  interface ens33
  #   # 虚拟路由 ID(同一组需相同(同一集群,主备是一致),范围 0-255)
  # 我的99,100 两台是一组,所以要一致
  virtual_router_id 88
  # # 优先级(值越大越优先)
  priority 100
  # 通告间隔(秒)
  advert_int 2
  # # 认证配置
  authentication {
    # 认证类型:PASS/AH
   auth_type PASS
   # 密码(同一组需相同)
   auth_pass 1234
  }
   # 虚拟 IP(VIP)
  virtual_ipaddress{
    192.168.88.200/24
  }
}

# 这个是 backup
!Configuration File for keepalived

global_defs{
  router_id 100
}

vrrp_instance VI_1 {
  state backup
  interface ens33
  virtual_router_id 88
  priority 99
  advert_int 2
  authentication {
   auth_type PASS
   auth_pass 1234
  }
  virtual_ipaddress{
    192.168.88.200/24
  }
}






脚本检测 负载均衡是否正常

csharp 复制代码
# 在  /usr/local/keepalived 中创建  check_nginx.sh  脚本,脚本内容如下
# 因为使用nginx代理的,只有nginx 正常启动,则可以curl -I http://127.0.0.1 正常访问
# $? 等于 0,则表示 nginx 正常,非0,表示 启动异常,或者不工作。
# $?  是上一指令的返回值,成功是0,不成功是1
# 要保证这个脚本文件,当前用户有执行权限
chmod a+X /usr/local/keepaliverd/check_nginx.sh
#!/bin/bash
/usr/bin/curl -I http://127.0.0.1
if [ $? -ne 0 ]; then
        systemctl restart nginx
        if [ $? -ne 0 ] ; then
                systemctl stop keepalived
        fi      
fi  


# 或者用这种脚本,更为通用性
~                                                                                                                  
#!/bin/bash
counter=$(ps -C nginx --no-heading | wc -l)
if [ "${counter}" = "0" ]; then
        systemctl restart nginx
        sleep 5
        counter=$(ps -C nginx --no-heading | wc -l)
        if [ "${counter}" = "0" ]; then
           systemctl stop keepalived
        fi

fi
csharp 复制代码
## /etc/keepalived/keepalived.conf 的配置文件 
!Configuration File for keepalived

global_defs{
  router_id 99
}
# 健康检测模块调用
vrrp_script check_nginx {
  script "/usr/local/keepalived/check_nginx.sh"
  interval 2    # 检查间隔时间(秒),默认1秒
  # # 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70
  # 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
  weight -20    # 检查失败时优先级降低的值  (-254 - 254)

}
vrrp_instance VI_1 {
  state master
  interface ens33
  virtual_router_id 88
  priority 100
  advert_int 2
  # 引用脚本
  track_script {
    check_nginx
  }
  authentication {
   auth_type PASS
   auth_pass 1234
  }
  virtual_ipaddress{
    192.168.88.200/24
  }
}

查看日志

tail -f /var/log/syslog

单实例主备模式的keepalived部署 双多实例双主模式的keepalived部署

单vip 架构: 只有master上有vip,backup上没有vip,这个时候master会比较忙,backup机器会比较闲,设备使用率比较低

上面的案例就单VIP主备模式
双vip 架构: 启动2个vrrp实例,每台机器上都启用2个vrrp实例,一个做master,一个做backup,启用2个vip,每台机器上都会有一个vip,这2个vip都对外提供服务,这样就可以避免单vip的情况下,一个很忙一个很闲。 可以提升设备的使用率,这两台机器互为主备。

》》》》 双多实例双主模式的keepalived部署

csharp 复制代码
## /etc/keepalived/keepalived.conf 的配置文件 
!Configuration File for keepalived

global_defs{
  router_id Master_99
}
# 健康检测模块调用
vrrp_script check_nginx {
  script "/usr/local/keepalived/check_nginx.sh"
  interval 2   
  weight -20   

}
vrrp_instance VI_1 {
  state MASTER
  interface ens33
  virtual_router_id 88
  priority 100
  advert_int 2
  # 引用脚本
  track_script {
    check_nginx
  }
  authentication {
   auth_type PASS
   auth_pass 1234
  }
  virtual_ipaddress{
    192.168.88.200/24
  }
}
vrrp_instance VI_2 {
  state BACKUP
  interface ens33
  virtual_router_id 100
  priority 99
  advert_int 2
  # 引用脚本
  track_script {
    check_nginx
  }
  authentication {
   auth_type PASS
   auth_pass 1234
  }
  virtual_ipaddress{
    192.168.88.155/24
  }
}
csharp 复制代码
## /etc/keepalived/keepalived.conf 的配置文件 
!Configuration File for keepalived

global_defs{
  router_id Master_99
}
# 健康检测模块调用
vrrp_script check_nginx {
  script "/usr/local/keepalived/check_nginx.sh"
  interval 2   
  weight -20   

}
vrrp_instance VI_1 {
  state BACKUP
  interface ens33
  virtual_router_id 88
  priority 99
  advert_int 2
  # 引用脚本
  track_script {
    check_nginx
  }
  authentication {
   auth_type PASS
   auth_pass 1234
  }
  virtual_ipaddress{
    192.168.88.200/24
  }
}
vrrp_instance VI_2 {
  state MASTER
  interface ens33
  virtual_router_id 100
  priority 100
  advert_int 2
  # 引用脚本
  track_script {
    check_nginx
  }
  authentication {
   auth_type PASS
   auth_pass 1234
  }
  virtual_ipaddress{
    192.168.88.155/24
  }
}

LVS+ keepalived

LVS负载均衡 资料

csharp 复制代码
案例使用  LVS_DR 直接路由模式   
#  192.168.88.22 真实服务IP
#  192.168.88.33 真实服务IP
#  192.168.88.99 负载均衡服务IP
#  192.168.88.100 负载均衡服务IP


## 99,100 lvs 负载均衡器中 配置
#ip a d dev ens33 192.168.88.200/32  删除VIP
ip a a dev ens33 192.168.88.200/32
ipvsadm -A -t 192.168.88.200:80 -s rr
ipvsadm -a -t 192.168.88.200:80 -r 192.168.88.22:80 -g
ipvsadm -a -t 192.168.88.200:80 -r 192.168.33.33:80 -g
ipvsadm -S > /etc/sysconfig/ipvsadm
systemctl start ipvsadm

##  22,33  RS 真实服务器中配置
ip a a dev  lo  192.168.88.200/32

# ARP静默   临时
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# ARP静默  永久 
cat >> /etc/sysctl.conf <<EOF
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
EOF
sysctl -p
csharp 复制代码
#  99,100 LVS负载均衡都要安装keepalived 同时配置 keepalivd  
# 路径  /etc/keepalived/keepalived.conf
!Configuration File for keepalived

global_defs{
  router_id lvs_master
}

vrrp_instance VI_1 {
  state MASTER
  interface ens33
  # 不抢占资源
  nopreempt 
  virtual_router_id 88
  priority 100
  advert_int 2
  authentication {
   auth_type PASS
   auth_pass 1234
  }
  virtual_ipaddress{
    192.168.88.200/24
  }
  virtual_server 192.168.88.200 80 {
     delay_loop 3
     lb_algo rr  # LVS 调度算法
     lb_kind DR  # LVS 集群模式  (直接路由模式)
     nat_mask 255.255.255.0  
     protocol TCP   # 健康检查使用的协议
     real_server 192.168.88.22 80 {
        weight 1
        inhibit_on_failure  # 当该节点失败时,把权重设置为0,而不是从IPVS中删除。
        TCP_CHECK {   #  健康检查
          connect_port 80     # 检查的端口号
          connect_timeout 3   #  连接超时的时间
        }
     }
     real_server 192.168.88.33 80 {
        weight 1
        inhibit_on_failure
        TCP_CHECK {
          connect_port 80
          connect_timeout 3
        }
     }

  }



注意

  1. LVS的 VIP 是/32 而Keepalived的 VIP 是 /24

数据库+keepalived

相关推荐
小羊没烦恼!1 天前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
知已难寻3 天前
00 · OpenStack 总纲——从云计算到 OpenStack 全景
运维·服务器·云原生·云计算·负载均衡·openstack·perl
七夜zippoe3 天前
Agent 网关设计:统一入口、智能路由与负载均衡
运维·ai·log4j·负载均衡·agent·网关设计
Vitaliy Kostrov(柯维远)4 天前
Multi-CDN 决策闭环:QoE、成本、安全与内容正确性如何进入同一个策略引擎?
安全·网络安全·云计算·音视频·负载均衡·cdn
知已难寻5 天前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
Ivanqhz5 天前
MoE 原理、TC/EC 路由、LSH-MoE 与负载均衡浅析
运维·网络·人工智能·深度学习·算法·机器学习·负载均衡
网络小江9 天前
组网第27课:ARP 的能与不能——免费 ARP、代理 ARP 与 ARP 欺骗
服务器·网络·网络安全·负载均衡·免费arp
EDPJ11 天前
MoE 与推测解码(Speculative Decoding)加速:为什么慢、什么时候慢、怎么让它不慢?
llm·负载均衡·大语言模型·moe·推测解码(sd)
JiMoKuangXiangQu12 天前
Linux CFS 负载均衡:从 CPU 拓扑到任务迁移
linux·负载均衡
我不会起名字32214 天前
负载均衡选错:轮询在长连接下的偏斜问题
微服务·负载均衡·grpc·长连接