高可用负载均衡搭建

高可用负载均衡搭建

主机名 服务IP
nginx-ka-master 172.17.1.131
nginx-ka-backup 172.17.1.132
web1-server 172.17.1.133
web2-server 172.17.1.134
VIP 172.17.1.88

1、安装nginx和keepalived服务

bash 复制代码
root@haproxy-master:~# apt install keepalived haproxy -y

2、配置keepalived服务

bash 复制代码
(1)master节点

root@haproxy-master:~# cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf
root@haproxy-master:~# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
   notification_email {
     2923035330@qq.com
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id haproxy_master                #主机唯一标识,每个keepalived的节点标识不能相同,若相同会影响切换脚本的执行
   vrrp_skip_check_addr
   #vrrp_strict                            #开启限制,会自动生效防火墙设置,导致无法访问VIP
   vrrp_grap_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.18            #默认组播IP地址,组播地址范围:224.0.0.0-239.255.255.255
}
vrrp_script check_nginx {                  #定义一个负载服务器检测脚本
  script "/usr/bin/killall -0 nginx"       #script后面跟一个shell命令或者脚本绝对路径
  # script "/etc/keepalived/nginx_check.sh" 
  interval 3                              #指定脚本的检查间隔为5秒
  weight  -50                             #权重减少50
  fall 3                                  #如果脚本连续3次检查失败,则认为服务不健康
  rise 1                                  #只要一次检查成功,就认为服务已经恢复。
}

#VRRP虚拟路由器
vrrp_instance master {                            #VRRP实例名称
    state MASTER                                  #keepalived的角色(master or backup)
    interface eth0                                #绑定当前虚拟路由器使用的物理接口,如:eth0,bond0,eth0:1等
    virtual_router_id 50                          #虚拟路由器的唯一标识,0-255 (注意:keepalived的主备应保持一致)
    nopreempt                                     #非抢占模式(注意:主keepalived设置非抢占模式后,备就可以不用了)
    priority 120                                  #虚拟路由器的优先级
    advert_int 1
    virtual_ipaddress {                          #虚拟IP
     #   172.17.1.88                             #指定VIP,不指定网卡,默认为eth0
     #   172.17.1.89 dev eth0                    #指定网卡
        172.17.1.88 dev eth0 label eth0:1
    }
    track_script {                               #调用vrrp_script定义的脚本去监控负载服务器                           
       check_nginx
    }
     notify_master "/usr/bin/systemctl restart nginx.service"
     notify_backup "/usr/bin/systemctl restart nginx.service"
#    notify_master "/etc/keepalived/notify.sh master"  #当前节点成为主节点时触发的脚本
#    notify_backup "/etc/keepalived/notify.sh backup"  #当前节点转为备节点时触发的脚本
#    notify_fault "/etc/keepalived/notify.sh fault"    #当前节点状态转为"失败"状态时通知的脚本
}

(2)backup节点
root@haproxy-backup:~# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全局配置
global_defs {
   notification_email {
     2923035330@qq.com
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id haproxy_backup #主机唯一标识,每个keepalived的节点标识不能相同,若相同会影响切换脚本的执行
   vrrp_skip_check_addr
#   vrrp_strict   #开启限制,会自动生效防火墙设置,导致无法访问VIP
   vrrp_grap_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.0.18
}
vrrp_script check-nginx{
  script "/usr/bin/killall -0 nginx"
  interval 5
  weight -50
  fall 3
  rise 1
}
#VRRP虚拟路由器
vrrp_instance backup { #VRRP实例名称
    state BACKUP
    interface eth0    #绑定当前虚拟路由器使用的物理接口,如:eth0,bond0,eth0:1等
    virtual_router_id 50  #虚拟路由器的唯一标识,0-255
#    nopreempt
    priority 80 #虚拟路由器的优先级
    advert_int 1
    virtual_ipaddress {  #虚拟IP
        172.17.1.88 dev eth0 label eth0:1
    }
    track_script {
       check_nginx
    }
    notify_master "/usr/bin/systemctl restart nginx.service"
    notify_backup "/usr/bin/systemctl restart nginx.service"
}

3、配置nginx负载服务

bash 复制代码
root@haproxy-backup:~# cat /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {
  upstream webserver{
    server 172.17.1.133:80 weight=5 fail_timeout=3s max_fails=3;      #检测后端服务是否正常
    server 172.17.1.134:80 weight=5 fail_timeout=3s max_fails=3;      
  }
  server {
  listen 80;
  server_name 172.17.1.88;
    location /{
      proxy_pass http://webserver;
    }
  }
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;
	gzip on;
	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

4、验证

复制代码
root@haproxy-master:~# systemctl stop nginx
root@haproxy-master:~# while true;do curl 172.17.1.88 ;sleep 1;done
bash 复制代码
root@haproxy-backup:~# watch -n 1 hostname -I
bash 复制代码
root@haproxy-master:~# tcpdump -i eth0 -nn host 224.0.0.18

5、总结

  • keepalived只监测VIP的负载服务器(nginx/haproxy)是否正常,如果不正常就执行切换脚本

  • 后端web服务器是由负载均衡器来判断是否正常

  • keepalived自身的健康是由本身服务的心跳来检测

  • keepalived检测负载是否正常有两种方法判断:

    (1)负载服务的端口或者进程

    (2)服务存活页面是否正常

相关推荐
Elastic 中国社区官方博客3 小时前
使用 Elastic Cloud Serverless 扩展批量索引
大数据·运维·数据库·elasticsearch·搜索引擎·云原生·serverless
十月南城3 小时前
Spring Cloud生态地图——注册、配置、网关、负载均衡与可观测的组合拳
spring·spring cloud·负载均衡
超龄超能程序猿3 小时前
Docker GPU插件(NVIDIA Container Toolkit)安装
运维·docker·容器
岁岁种桃花儿4 小时前
Nginx 站点垂直扩容(单机性能升级)全攻略
网络·nginx·dns
Xの哲學4 小时前
Linux SMP 实现机制深度剖析
linux·服务器·网络·算法·边缘计算
2501_906150564 小时前
私有部署问卷系统操作实战记录-DWSurvey
java·运维·服务器·spring·开源
岳来4 小时前
docker 从 Path 值看容器启动命令
运维·docker·容器
一颗青果5 小时前
公网构建全流程与参与主体深度解析
网络
RisunJan5 小时前
Linux命令-ifconfig命令(配置和显示网络接口的信息)
linux·运维·服务器
杭州泽沃电子科技有限公司5 小时前
面对风霜雨雪雷电:看在线监测如何为架空线路筑牢安全网
运维·人工智能·在线监测·智能监测