Day 57 Nginx负载均衡-高可用

Day 57 Nginx负载均衡-高可用

Proxy     10.0.0.5

web01     10.0.0.7          #模拟iphone页面

web02     10.0.0.8          #模拟android页面

1.1 测试负载均衡

1.1.1 web01操作如下

[root@web01 conf.d]# cat sj.conf

server {

    listen 80;

    server_name sj.oldboy.com;

 

    location / {

       root /sj;

       index index.html;

    }

}

[root@web01 conf.d]# mkdir /sj

[root@web01 conf.d]# echo "Iphone....." >/sj/index.html

[root@web01 conf.d]# systemctl restart nginx

1.1.2 web02操作如下

[root@web02 conf.d]# cat sj.conf

server {

    listen 80;

    server_name sj.oldboy.com;

 

    location / {

       root /sj;

       index index.html;

    }

}

[root@web02 conf.d]# mkdir /sj

[root@web02 conf.d]# echo "Android...." > /sj/index.html

[root@web02 conf.d]# systemctl restart nginx

1.1.3 proxy操作

[root@lb01 ~]# cd /etc/nginx/conf.d/

[root@lb01 conf.d]# cat sj_proxy.conf

upstream iphone {

    server 172.16.1.7:80;

}

 

upstream android {

    server 172.16.1.8:80;

}

 

server {

    listen 80;

    server_name sj.oldboy.com;

    location / {

       if ($http_user_agent ~* "iphone"){

           proxy_pass http://iphone;

       }

       if ($http_user_agent ~* "android"){

           proxy_pass http://android;

       }

    }

}

[root@lb01 conf.d]# systemctl restart nginx

2.1 keepalived高可用概述

    lb01:nginx负载均衡(完全一致)

    lb02:nginx负载均衡(完全一致)

keepalived仅能实现地址漂移

2.2 什么是高可用

什么是高可用双击热备, 一般指2台机器启动着相同的业务系统,当有一台机器down机了, 另外一台服务器能快速的接管, 对于访问的用户是无感知的。

2.2.1 keepalived环境准备

服务器系统 角色         外网IP             内网IP

CentOS 7.5           keepalived-master     eth0:10.0.0.5 eth1:172.16.1.5

CentOS 7.5           keepalived-slave        eth0:10.0.0.6 eth1:172.16.1.6

2.2.2 lb01lb02上分别安装keepalived

[root@lb01 ~]# yum install keepalived -y

[root@lb02 ~]# yum install keepalived -y

2.2.3 配置lb01, keepalived-master

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf

global_defs {    

    router_id lb01  

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 50

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

}

    virtual_ipaddress {

        10.0.0.3

    }

}

2.2.4 配置lb02, keepalived-backup

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf

global_defs {

    router_id lb02

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 50

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.0.0.3

    }

}

2.2.5 对比keepalivedmasterbackup配置的区别

Keepalived配置区别            Master配置          Backup节配置

route_id(唯一标识)           route_id lb01           route_id lb02

state(角色状态)              state Master            state Backup

priority(竞选优先级)        priority 150           priority 100

2.2.6 keepalived+nginx负载均衡高可用

#lb01和lb02必须完完全全一致,这样才可以实现无缝切换

    #快速配置一台负载均衡服务器

[root@lb02 ~]# scp -rp [email protected]:/etc/yum.repos.d /etc/

[root@lb02 ~]# yum install nginx -y

[root@lb02 ~]# scp -rp [email protected]:/etc/nginx /etc/

[root@lb02 ~]# systemctl start nginx

[root@lb02 ~]# systemctl enable nginx

2.3 Keepalived 高可用列脑

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。

服务器网线松动等网络故障
服务器硬件故障发生损坏现象而崩溃
主备都开启firewalld防火墙
Nginx服务死掉等

2.3.1 在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑

[root@lb02 ~]# cat check_split_brain.sh

#!/bin/sh

lb01_vip=10.0.0.3

lb01_ip=10.0.0.5

while true;do

    ping -c 2 -W 3 $lb01_ip &>/dev/null

    if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then

        echo "ha is split brain.warning."

    else

        echo "ha is ok"

    fi

sleep 5

done

1.只有在物理服务器的情况,并且公司的业务不允许DOWN机(7x24),才会使用keepalived

2.互联网公司

    1.购买SLB->选择购买的连接数-->升级

    2.自带高可用

    2.自带高可用

ucloud负载均衡 ----> 迁移   -->  正常负载均衡

2.3.2 如果Nginx宕机, 会导致用户请求失败, Keepalived并不会进行切换, 所以需要编写一个脚本检测Nginx的存活状态, 如果不存活则kill nginxkeepalived

[root@lb01 ~]# mkdir /server/scripts

[root@lb01 ~]# vim /server/scripts/check_web.sh

#!/bin/sh

#使用while死循环

while true;do

nginxpid=$(ps -C nginx --no-header|wc -l)

#1.判断Nginx是否存活,如果不存活则尝试启动Nginx

if [ $nginxpid -eq 0 ];then

    systemctl start nginx

    sleep 5

    #2.5秒后再次获取一次Nginx状态

    nginxpid=$(ps -C nginx --no-header|wc -l)

    #3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本 

    if [ $nginxpid -eq 0 ];then

        systemctl stop keepalived

        exit 1

   fi

fi

     sleep 5

done

 

[root@lb01 ~]# chmod +x /server/scripts/check_web.sh

在keepalived配置文件中调用此脚本,lb01与lb02都需操作

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf

global_defs {

         router_id LVS_01

      }

vrrp_script check_web {

   script "/server/scripts/check_web.sh"

   interval 2

   weight 50

}

 

vrrp_instance VI_1 {

    state MASTER

    interface ens33

    virtual_router_id 51

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.0.0.3/24 dev ens33

    }

    track_script {

        check_web

    }

}

 


猜你喜欢

转载自blog.51cto.com/13859649/2287302
57