Nginx高可用-keepalived

Nginx高可用-keepalived

Keepalived高可用基本概述

什么是高可用

一般是指多台机器启动着完全相同的业务系统。当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的

高可用通常使用什么软件?

  • 硬件
    • F5
  • 软件
    • keepalived
  • MySQL
    • MGR
    • MHA
  • Redis
    • Redis-Cluster
    • Sentinel

keepalived如何实现高可用的**

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

VRRP是如何诞生的,其原理是什么

比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?

![image-20220623154001084]file

通常做法是给路由器增加一台备节点,问题是主网关master故障了用户是需要手动指向backup,这样就不算做到高可用

同时面临以下两个问题

  • 问题一:假设用户手动指向了backup路由器,那么master路由器修好了怎么办?
  • 问题二:Master网关故障,我们将backup网关配置为master网关的ip是否可以

其实是不行的,因为PC第一次通过ARP广播寻找到Master网关的MAC地址与IP地址后,会将信息写到ARP的缓存表中,那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的,pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应的Mac地址与IP地址)

file

如何才能做到出现故障自动转移,此时VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式在Master和Backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息

keepalived核心概念

  1. 通过选举投票,决定谁是主节点谁是备节点(选举)
  2. 如果Master故障,Backup自动接管,那么Master恢复后会夺权吗(抢占试、非抢占式)
  3. 两台服务器都认为自己是master,那么会出现一个故障(脑裂)

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

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

查找keepalived配置文件并修改master配置文件

[root@lb01 ~]# rpm -ql keepalived
/etc/keepalived/keepalived.conf

# 3.修改Master配置文件
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地址
    }
}

配置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
    }
}
Keepalived配置区别 Master节点配置 Backup节点配置
router_id lb01 lb02
state MASTER BACKUP
priority 150 100

启动Master和Backup节点的keepalived

#Master节点
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# systemctl enable keepalived
 
#Backup节点
[root@lb02 ~]# systemctl start keepalived
[root@lb02 ~]# systemctl enable keepalived

keepalived高可用抢占式与非抢占式

两个节点都启动

#由于节点1的优先级高于节点2,所以VIP在节点1上面
[root@lb01 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0

关闭节点1的keepalived

[root@lb01 ~]# systemctl stop keepalived
 
#节点2联系不上节点1,主动接管VIP
[root@lb02 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0

此时重新启动Master上的keepalived,会发现VIP被强行抢占

[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global eth0

配置非抢占式

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

两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。

Master配置
    vrrp_instance VI_1 {
        state BACKUP
        priority 150
        nopreempt
    }
 
Backup配置
    vrrp_instance VI_1 {
        state BACKUP
        priority 100
        nopreempt
    }

注意:只要停止掉Keepalived,VIP会漂移到另外一个节点,并不是nginx挂掉keepalived会漂移到另外一个节点,而是Keepalived检测到nginx进程挂掉,自动结束自己的进程

keepalived高可用故障脑裂

脑裂的原因

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

解决方案

如果发生闹裂,则随机kill掉一台即可

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

[root@lb02 ~]# cat check_split_brain.sh
#!/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

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 Master keepalived主节点、nginx负载均衡 keepalived、nginx
web01 10.0.0.7 172.16.1.7 web网站 nginx、php
web2 10.0.0.8 172.16.1.8 web网站 nginx、php

关联nginx

[root@lb01 ~]# vim check_web_lw.sh
#!/bin/sh
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

配置两台负载均衡

## lb01
upstream blog_lw_com {
        server 172.16.1.7;
        server 172.16.1.8;
}
server {
        listen 80;
        server_name blog.lw.com;
        rewrite (.*) https://blog.lw.com;
}
server{
        listen 443 ssl;
        server_name blog.lw.com;
        ssl_certificate ssl/20220623_blog.lw.com.pem;
        ssl_certificate_key ssl/20220623_blog.lw.com.key;
        
        location / {
                proxy_pass http://blog_lw_com;
                proxy_set_header Host $host;
		}
}

## lb02
upstream blog_lw_com {
        server 172.16.1.7;
        server 172.16.1.8;
}
server {
        listen 80;
        server_name blog.lw.com;
        rewrite (.*) https://blog.lw.com;
}
server{
        listen 443 ssl;
        server_name blog.lw.com;
        ssl_certificate ssl/20220623_blog.lw.com.pem;
        ssl_certificate_key ssl/20220623_blog.lw.com.key;
        
        location / {
                proxy_pass http://blog_lw_com;
                proxy_set_header Host $host;
		}
}

[root@lb02 ~]# mkdir /etc/nginx/ssl

[root@lb01 ~]# scp /etc/nginx/ssl/* 172.16.1.6:/etc/nginx/ssl

keepalived关联nginx

# 3.修改keepalived配置文件
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称
}
 
vrrp_script check_web_lw {
	script "/root/check_web.sh" #脚本路径
	interval 5 #每五秒检测一次
}

 
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地址
    }
    
	track_script {
	  check_web_lw
	}
}
#给脚本加执行权限
[root@lb01 ~]# chmod +x /root/check_web.sh

# 域名解析在vip上
10.0.0.3 blog.lw.com
posted @ 2022-06-23 16:36  Gie  阅读(193)  评论(0编辑  收藏  举报