高可用负载均衡搭建

高可用负载均衡搭建

主机名 服务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)服务存活页面是否正常

相关推荐
_西瓜_3 分钟前
Google Antigravity 登录失败?中国地区完整解决方案与排查指南
网络
小锋学长生活大爆炸7 分钟前
【教程】CentOS在不知道root密码的情况下进入shell和重置密码
linux·运维·centos
weixin_466813 分钟前
Docker常用命令与操作
运维·docker·容器
wanhengidc17 分钟前
云手机 多样化的云服务产品
运维·服务器·科技·游戏·智能手机
通义灵码31 分钟前
Qoder Linux 版公测上线
linux·运维·服务器
什么时候才能变强31 分钟前
使用 k6 对 WebSocket 测试
网络·websocket·网络协议·k6
福尔摩斯张34 分钟前
从Select到Epoll:深度解析Linux I/O多路复用演进之路(超详细)
linux·运维·服务器·c语言·网络
Channing Lewis40 分钟前
zoho crm有一个deluge操作是在记录删除后触发的,但是记录删除后就查不到了,应该怎么解决
运维·服务器
0思必得01 小时前
[Web自动化] 开发者工具性能(Performance)面板
运维·前端·自动化·web自动化·开发者工具
robur1 小时前
H3C V7路由器升级软件时提示无足够存储空间
网络·路由器·升级·h3c