Linux架构之高可用keepalived

1. 什么是高可用

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

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

通常做法是给路由器增加一台备节点,但是问题是,如果我们的主网关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地址)

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

2. 常用的工具

1. 硬件通常使用 F5
2. 软件通常使用 keepalived

3. VRRP协议

广播
VRRP协议会在一个局域网中进行广播,

4. 部署keepalived

yum 安装

lb01
yum install keepalived -y
lb02
yum install keepalived -y

vim /etc/keepalived/keepalived.conf

5. keepalived配置


!Configuration File for keepalived

# 全局配置
global_defs {
    # 当前keepalived的唯一标识
    router_id lb01
    # 同一个组里面是唯一的
}

# 监测脚本
vrrp_script check_nginx {
    # 指定脚本路径
    script "/etc/keepalived/checkNG.sh"
    # 执行间隔
    interval 5
}


# 配置VRRP协议
"最最重要的内容"
vrrp_instance VI_1 {
    # 状态,master和backup
    state MASTER
    # 绑定网卡
    interface eth0
    # 虚拟路由标示,可以理解为分组(分组id)
    virtual_router_id 50
    # 优先级
    priority 100
    # 监测心跳间隔时间(每秒广播一次)
    advert_int 1
    # 配置认证
    authentication {
        # 认证类型
        auth_type PASS
        # 认证的密码
        auth_pass 1111
        }
    # 设置VIP
    virtual_ipaddress {
        # 虚拟的VIP地址
        # 10.0.0.3
        192.168.15.3 # ????
        
    }
    # 调用检查
    track_script {
        check_nginx
    }
    
}



"lb02"
!Configuration File for keepalived

# 全局配置
global_defs {
    # 当前keepalived的唯一标识
    router_id lb02
    # 同一个组里面是唯一的
}

# 配置VRRP协议
"最最重要的内容"
vrrp_instance VI_1 {
    # 状态,master和backup
    state BACKUP
    # 绑定网卡
    interface eth0
    # 虚拟路由标示,可以理解为分组(分组id)
    virtual_router_id 50
    # 优先级
    priority 90
    # 监测心跳间隔时间(每秒广播一次)
    advert_int 1
    # 配置认证
    authentication {
        # 认证类型
        auth_type PASS
        # 认证的密码
        auth pass 1111
        }
    # 设置VIP
    virtual_ipaddress {
        # 虚拟的VIP地址
        # 10.0.0.3
        192.168.15.3 # ????
        
    }
    
}


systemctl enable --now keepalived


# 在lb02安装nginx,编译安装

6. 怎么解决keepalived的脑裂问题

1. 如果nginx宕机了怎么办?

# 脑裂问题
两台高可用服务器在指定的时间内,无法互相检测到对方的心跳,而各自启动故障转移功能

# 如何解决
想办法告诉keepalived,nginx的情况。

# VRRP_script
"""
知识储备:
$?  : 上一条命令执行的结果
通过$?判断nginx是否启动

"""

2. 局域网之内,keepalived无法相互广播怎么办?
判断VIP是否可以ping的通

vim checkNG.sh

#!/bin/bash


ps -ef | grep -q [n]ginx

if [ $? -ne 0 ];then    # -ne 不等于 -eq 等于
	# 代表nginx未正常启动
    systemctl start nginx &>/dev/null
    sleep 2
    ps -ef | grep -q [n]ginx
    if [ $? -ne 0];then
    	systemctl stop keepalived
    fi

fi

# 局域网之内,keepalived无法相互广播怎么办?
# VIP=192.168.15.3

# ping -c 1 $VIP &>/dev/null

# if [ $? -eq 0];then
	# 代表VIP还可以访问
    
# fi

&  : 正确的标准输出和错误的标准输出

7. keepalived非抢占式

实现非抢占式
1. 状态全部都有设置成backup
2. 增加 nopreempt


"lb02"
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
    router_id lb02
}

# 检测脚本
vrrp_script check_ngxin {
    # 指定脚本路径
    script "/etc/keepalived/checkNG.sh"
    # 执行间隔
    interval 5
}

vrrp_instance VI_1 {
    
    stat BACKUP
    # 开启非抢占式
    nopreempt
    # 绑定网卡
    interface eth0
    # 虚拟路由标示,可以理解为分组
    virtual_router_id 50
    # 优先级
    priority 90
    # 监测心跳间隔时间
    advert_int 1
    # 配置认证
    authentication {
        # 认证类型
        auth_type PASS
        # 认证的密码
        auth_pass 1111
    }
    # 设置VIP
    virtual_ipaddress {
        # 虚拟的VIP地址
        192.168.15.3
    }
    # 调用检查
    track_script {
        check_nginx
    }
    
}

8. 四层负载均衡

假设有三台MySQL数据库,请问怎样负载均衡?
在非HTTP协议的情况下,采用的四层负载均衡的方式负载服务。


vim /etc/nginx/stream/mysql.conf
server {
    listen 3306;
    proxy_pass 172.16.1.61:3306;
}


"注意:"四层负载均衡不支持域名

netstat -nutlp
# 查看端口信息


"案例:"使用四层负载均衡实现ssh的代理,端口为1122,
cat ssh.conf
server {
    
    listen 1122;
    proxy_pass 172.16.1.5:22;
}

9. 部署一个项目

gitee

djangoblog

posted @ 2022-01-10 15:16  Joshua_jiaxue  阅读(71)  评论(0编辑  收藏  举报