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

相关推荐
二闹9 小时前
从回调地狱👹到优雅飞升 👼
java·后端·负载均衡
sg_knight2 天前
Spring Cloud LoadBalancer深度解析:官方负载均衡方案迁移指南与避坑实践
java·spring boot·spring·spring cloud·微服务·负载均衡
Edingbrugh.南空2 天前
Kafka分区机制深度解析:架构原理、负载均衡与性能优化
架构·kafka·负载均衡
星融元asterfusion5 天前
突破AI瓶颈:基于实时感知的智能选路实现智算负载均衡优化
运维·人工智能·负载均衡
liang89995 天前
负载均衡器:Ribbon和LoadBalance
运维·ribbon·负载均衡
layman05286 天前
Nginx 负载均衡、高可用及动静分离
运维·nginx·负载均衡
"匠"人7 天前
讲解负载均衡
java·运维·负载均衡
武子康7 天前
Java-43 深入浅出 Nginx - 基本配置方式 nginx.conf Events块 HTTP块 反向代理 负载均衡
java·后端·nginx·http·负载均衡·运维开发
天下一般7 天前
手写RPC框架<四> 负载均衡
网络协议·rpc·负载均衡