nginx负载均衡高可用


nginx负载均衡高可用

1.高可用

	一般是指2台服务器启动着相同的业务系统,如果有一台服务器死机了,另外一台服务器能快速的接管,对于用户是无感知的。

2.高可用的软件

硬件
	F5
软件
	keepalived
	heartbeat
MySQL指定的高可用软件
	MGR
	MHA
Redis指定的高可用软件
	Redis-Cluster
	Sentinel

3.Keepalived概述

	keepalived是一个高可用软件,可以和任何应用配合使用
	Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

4.keepalived实现原理

	keepalived软件是基于VRRP协议实现,VRRP(虚拟路由冗余协议)主要用于解决单点故障

5.keepalived核心概念

1.选举:
	通过选举投票,决定谁是主节点和备节点
2.抢占式、非抢占式:
	当Master故障,Backup自动接管,那么Master恢复后夺权就是抢占式,没有夺权就是非抢占式
3.脑裂:
	当两台服务器都认为自己是master,那么就会出现这种现象

脑裂的原因

1.服务器网线松动等网络故障
2.服务器硬件故障发生损坏现象而崩溃
3.主节点和备节点都开启了防火墙

## 解决脑裂故障的脚本
#!/bin/sh
vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
    ping -c 2 $lb01_ip &>/dev/null
    if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
    else
        echo "ha is ok"
    fi
sleep 5
done

6.keepalived安装配置

环境准备

主机名 WanIP LanIP 角色 应用
lb01 10.0.0.5 172.16.1.5 Master keepalived主节点 keepalived
lb02 10.0.0.6 172.16.1.6 Backup keepalived备节点 keepalived

部署keepalived(lb01 lb02)

1.安装keepalived
yum install -y keepalived
2.修改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        #虚拟路由id
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {         
        10.0.0.3                #虚拟的VIP地址
    }
}


[root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
global_defs {                   #全局配置
    router_id lb02              #标识身份->名称
}
vrrp_instance VI_1 {
    state BACKUP                #标识角色状态
    interface eth0              #网卡绑定接口
    virtual_router_id 50        #虚拟路由id
    priority 100                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {         
        10.0.0.3                #虚拟的VIP地址
    }
}
keepalived配置区别 Master节点配置 Backup节点配置
router_id lb01 lb02
state MASTER BACKUP
priority 150 100
3.启动master和backup上的keepalived
systemctl start keepalived.service
4.查看master虚拟ip地址

5.停掉master上的keepalived查看虚拟ip是否到backup服务器上
[root@lb01 ~]# systemctl stop keepalived.service

非抢占式配置

1、两个节点的state都必须配置为BACKUP
2、两个节点都必须加上配置 nopreempt
3、其中一个节点的优先级必须要高于另外一个节点的优先级。


# keepalived配置
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf 

global_defs {                   #全局配置
    router_id lb01             #标识身份->名称
}

vrrp_instance VI_1 {
    state BACKUP                #标识角色状态
    interface eth0              #网卡绑定接口
    nopreempt
    virtual_router_id 50        #虚拟路由id
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {
        10.0.0.3                #虚拟的VIP地址
    }
}
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf 

global_defs {                   #全局配置
    router_id lb02             #标识身份->名称
}

vrrp_instance VI_1 {
    state BACKUP                #标识角色状态
    interface eth0              #网卡绑定接口
    nopreempt
    virtual_router_id 50        #虚拟路由id
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {
        10.0.0.3                #虚拟的VIP地址
    }
}

keepalived结合nginx做高可用

主机名 WanIP LanIP 角色 应用
lb01 10.0.0.5 172.16.1.5 Master keepalived主节点、nginx负载均衡 keepalived、nginx
lb02 10.0.0.6 172.16.1.6 Backup keepalived备节点、nginx负载均衡 keepalived、nginx
web01 10.0.0.7 172.16.1.7 web网站 nginx、php
web02 10.0.0.8 172.16.1.8 web网站 nginx、php

关联nginx

1.编写脚本
nginx_count=$(ps -ef|grep [n]ginx|wc -l)
#1.判断Nginx是否存活,如果不存活则尝试启动Nginx 
if [ $nginx_count -eq 0 ];then 
	systemctl start nginx 
	sleep 3 
	#2.等待3秒后再次获取一次Nginx状态 
	nginx_count=$(ps -ef|grep [n]ginx|wc -l) 
	#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本 
	if [ $nginx_count -eq 0 ];then 
		systemctl stop keepalived 	
	fi 
fi

简化脚本
[root@lb01 ~]# vim check_web.sh
# /bin/sh
nginx_count=$(ps -ef |grep [n]ginx}|wc -l)

if [ $nginx_count -eq 0 ];then
        systemctl stop keepalived
fi
2.配置两台负载均衡
[root@lb01 ~]# vim /etc/nginx/conf.d/wordpress.jl.com.conf 
upstream blog.jl.com{
        server 172.16.1.7;
        server 172.16.1.8;
}
server {
        listen 80;
        server_name wordpress.jl.com;

        location / {
                proxy_pass http://blog.jl.com;
                include proxy_params;
        }
}

[root@lb02 ~]# vim /etc/nginx/conf.d/wordpress.jl.com.conf 

upstream blog.jl.com{
        server 172.16.1.7;
        server 172.16.1.8;
}
server {
        listen 80;
        server_name wordpress.jl.com;

        location / {
                proxy_pass http://blog.jl.com;
                include proxy_params;
        }
}

keepalived关联nginx

1.修改keepalived配置文件
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf 
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}
vrrp_script check_web {
        script "/root/check_web.sh"
        interval 5
}
vrrp_instance VI_1 {
    state BACKUP                #标识角色状态
    interface eth0              #网卡绑定接口
    virtual_router_id 50        #虚拟路由id
    priority 150                #优先级
    advert_int 1                #监测间隔时间
    authentication {            #认证
        auth_type PASS          #认证方式
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {
        10.0.0.3                #虚拟的VIP地址
    }
    track_script {
                check_web
        }
}
2.给脚本添加执行权限
chmod +x check_web
3.将域名解析到vip上
10.0.0.3 wordpress.jl.com
4.浏览器访问网站

5.停掉lb01的nginx服务
systemctl stop nginx
6.继续访问网站

相关