day12 keepalived高可用
阅读原文时间:2023年07月08日阅读:1

day12 keepalived高可用

1、什么是高可用

部署在整个集群中的一个高可用软件,作用是创建一个VIP(虚拟IP),在整个集群中有且只有一个机器上生成VIP,当这台机器出现问题时,Keepalive将自动将VIP切换至其他的某一台服务器上

2、常用工具

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

3、Keepalived核心概念

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

1、实现VIP,解决web服务器的单点故障

1、实现VIP,解决web服务器的单点故障
    1)部署Keepalived
        在所有的需要流量的机器上部署keepalived。
        [root@web01 ~]# yum install keepalived -y 

    2)添加vip设置
        [root@lb01 ~]# vim /etc/keepalived/keepalived.conf
        [root@lb01 ~]# systemctl restart keepalived
-----------------------------------------------------------------------------------------------------
#全局配置
global_defs {
#全局配置
global_defs {
    #身份识别(全局唯一,布在哪台机器就是哪台机器名字)
    router_id lb01
}

# 配置VRRP协议
vrrp_instance VI_1 {
    # 状态,MASTER和BACKUP(这里仅仅是一个标记,真正确认VIP的是权重)
    state MASTER
    # 绑定网卡,一定要和下方所指的eth0在同一个网段
    interface eth0
    # 虚拟路由标示,可以理解为分组,必须在同一组别(一个集群),keepalved才能互相探测
    virtual_router_id 50
    # 优先级(数字越大,权重越大)
    priority 100
    # 监测心跳间隔时间,每1s探测一次,keepalivd宕机马上就可以切换
    advert_int 1
    # 配置认证
    authentication {
        # 认证类型,密码认证
        auth_type PASS
        # 认证的密码
        auth_pass 111111111
    }
    # 设置VIP,eth0的网段
    virtual_ipaddress {
        # 虚拟的VIP地址,网段内选个ip
        192.168.15.3
    }
}
-----------------------------------------------------------------------------------------------------

2、抢占式和非抢占式

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

两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。
配置:[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
   state BACKUP
    # 开启非抢占式
    nopreempt

    (1).抢占式:当一台负载均衡的keepalived服务掉线时,vip会自定切换至另一台负载均衡,当中存在时间差延迟,系统可能会报错而当那台负载均衡恢复keepalived时,会自动切换回去,又会有延迟,也有可能会报错。

    (2).非抢占式:当一台负载均衡的keepalived服务掉线时,vip会自定切换至另一台负载均衡,而当那台负载均衡恢复keepalived时,不自动切换回来。

    (3).总结: 当一台负载均衡的keepalived掉线时,进行自动切换。而当一台负载均衡恢复keepalived时,自动跳转的就是抢占式,不自动跳转的就是非抢占式,一般来说非抢占式不容易报错,建议开启非抢占式

3、高可用时如果出现脑裂问题时怎么解决

1、什么是脑裂问题?
    由于其他代理网站服务的启动失败,导致不能访问web。可是由于keepalived又正常运行着,但是却不能跳转vip至其他备用负载均衡服务器,导致访问一直失败。

2、如何解决脑裂问题?
    可以通过一个脚本进行判断

    1)、编写脚本
        [root@lb01 keepalived]# vim check.sh
        [root@lb01 keepalived]# chmod +x check.sh

#!/bin/bash
# 通过判断进程服务里面有没有nginx进程,来知晓nginx是否正常启动
ps -aux | grep [n]ginx

if [ $? -ne 0 ];then
    systemctl restart nginx
    sleep 3;
    ps -aux | grep [n]ginx

    if [ $? -ne 0];then
        systemctl stop keepalived
    fi
fi

    2)、把脚本放在keepalived配置里面(放入全局块)
        [root@lb01 keepalived]# vim /etc/keepalived/keepalived.conf
-----------------------------------------------------------------------------------------------------
vrrp_script check_nginx {
    # 指定脚本路径
    script "/etc/keepalived/check.sh"
    # 每5秒钟执行一次
    interval 5
}

# 调用计划文本(配置在vrrp_instance 模块里)
track_script {
    check_nginx
}

三、动静分离

动静分离介绍

1、什么是动静分离
    (1)动态资源(jsp、ftl、thymeleaf)与静态资源(js、css、img)分开部署。
    (2)动静分离,通过中间件将动态请求和静态请求进行分离;

2、为什么做动静分离
    (1)如果我们静态资源与动态资源存放在同一台服务器上面,当静态资源不断增多的时候,我们的服务器访问是扛不住,因为静态资源消耗过多的带宽,导致静态资源无法访问或者访问非常的慢。
    (2)通过中间件将动态请求和静态请求分离,可以减少不必要的请求消耗,同时能减少请求的延时。

1、location的五种策略

=    完全匹配

*    匹配以什么字符开头

~    正则匹配(区分大小写)

~*  正则匹配(不区分大小写)

/    匹配所有内容

优先级:
    =  >  * > ~ = ~* > /

案例:访问中国象棋的某一张图片,用动静分离
[root@web01 conf.d]# vim jiao.conf

server {
    server_name jiao.test.com
    listen 80;

    # 代理是html文件
    location /{
        root /usr/share/nginx/jiaoben1765;
        index index.html;

    }
    # 给图片一个单独目录
    location ~* \.(png|gif|jpg|jpeg|mp3|mp4)$ {
        root /usr/share/nginx/jiaoben1765;
    }
}

2、四种重定向策略

1、nginx的重定向策略
    nginx配置rewrite:
        Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程
        多用于:地址转换、协议转换
        rewrite : 重写URL地址

        格式:
            rewrite [匹配内容] [从定向到的内容] [重定向规则];

2、四种重定向策略
    组1:
        last        本条规则匹配完成后,停止匹配,不再匹配后面的规则
        break        本条规则匹配完成后,停止匹配,不再匹配后面的规则

        区别:
            last  是在Nginx内部(也就是配置里面)按照重定向的规则重新访问一遍
            break 是在Nginx内部按照重定向的规则去对应的目录,也就是server下root所指定的站点根目录下去访问,所以break找的是目录里面的内容,而不是在配置里面找重定向的内容。

    组2:
        redirect    返回302临时重定向,地址栏会显示跳转后的地址
        permanent    返回301永久重定向,地址栏会显示跳转后的地址

    区别:
        临时重定向浏览器不记录缓存
        永久重定向浏览器是会记录缓存,再一次访问将不走Nginx服务端,直接在浏览器端跳转。

案例1:要求访问192.168.15.8,临时重定向到百度

1、编辑配置文件
    [root@web01 conf.d]# vim jiao.conf
    server {
        server_name jiao.test.com
        listen 80;

        location /{
            rewrite (.*) https://www.baidu.com redirect;
        }
    }

2、测试
    浏览器测试:192.168.15.7
    Request URL: http://192.168.15.7/   # 首先访问的是ip7
    Request Method: GET
    Status Code: 302 Moved Temporarily  # 临时重定向到百度
    Remote Address: 192.168.15.7:80

案例2:要求访问192.168.15.8,永久重定向到百度

1、编辑配置文件
    [root@web01 conf.d]# vim jiao.conf
    server {
        server_name jiao.test.com
        listen 80;

        location /{
            rewrite (.*) https://www.baidu.com permanent;
        }
    }

2、测试
    浏览器测试:192.168.15.7
    Request URL: http://192.168.15.7/   # 首先访问的是ip7
    Request Method: GET
    Status Code: 302 Moved Temporarily  # 临时重定向到百度
    Remote Address: 192.168.15.7:80

案例3:要求访问192.168.15.8/last,重定向到192.168.15.8/test

1、编辑配置文件
    [root@web01 conf.d]# vim jiao.conf 

server {
    server_name jiao.test.com
    listen 80;

    charset utf-8;

    location = /last {
        rewrite (.*) /test last;
    }

    location = /break {
        rewrite (.*) /test break;
    }

    location = /test {
        default_type text/html;
        return 200 "test";
    }

    location /{
        default_type text/html;
        return 200 "默认";
    }

}

2、测试
    浏览器测试:192.168.15.7/last    /break

案例4:要求访问192.168.15.8/break,重定向到192.168.15.8下面的test目录。

1、编辑配置文件
    [root@web01 conf.d]# vim jiao.conf 

server {
    server_name jiao.test.com
    listen 80;

    charset utf-8;

    location = /last {
        rewrite (.*) /test last;
    }

    location = /break {
        rewrite (.*) /test break;
    }
     #==========》运行至/break模块,然后根据rewrite里面的break规则重定向页面至/test,                                  注意此时不是在nginx内部查找/test了!!,而是从server下root所指定的目                                录下面去找test目录,若test文件夹里有内容,则显示,无内容则报 404                                      NotFound

    location = /test {
        default_type text/html;
        return 200 "test";
    }

    location /{
        default_type text/html;
        return 200 "默认";
    }

}

2、测试
    浏览器测试:192.168.15.7/last    /break