keepalived高可用性负载均衡是什么

keepalived高可用性负载均衡

keepalived概念

Keepalived是一个用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的设施,以实现负载平衡和高可用性。负载平衡框架依赖于众所周知且广泛使用的Linux虚拟服务器(IPVS)内核模块,提供第4层负载平衡。Keepalived 实现了一组检查器,以根据其运行状况动态、自适应地维护和管理负载平衡的服务器池。另一方面,高可用性是通过VRRP协议实现的。VRRP 是路由器故障转移的基本模块。此外,Keepalived还实现了一组与VRRP有限状态机的挂钩,提供低级和高速协议交互。为了提供最快的网络故障检测,Keepalived实现了BFD协议。VRRP 状态转换可以考虑 BFD 提示来驱动快速状态转换。Keepalived框架可以独立使用,也可以一起使用,以提供弹性基础设施。

图解

keepalived工作原理

实现高可用的基本原理是
1. 两台LB机器均部署好keepalived工具,并且启动服务;
2. 角色是master的机器获得IP资源且为用户提供访问(nginx)
3. 角色是backup的机器作为master的热备机器(master挂了,立即接替)


故障时
1. 当master出现故障时
2. backup机器自动接管master的所有工作,接管VIP以及其他资源。

修复后
1. master修复后,自动接管它本身的资源,如VIP。
2. backup自动释放接管的资源。

此时两台机器恢复启动时的角色,以及工作状态。

VRRP协议

keepalived主要是通过VRRP这个协议实现的高可用功能,实现的虚拟IP在两台机器上漂移。

VRRP的出现很好地解决了这个问题。

VRRP将多台设备组成一个虚拟设备,通过配置虚拟设备的IP地址为缺省网关,实现缺省网关的备份。

当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信。
图解vrrp

VRRP工作原理

VRRP协议中定义了三种状态机:初始状态(Initialize)、活动状态(Master)、备份状态(Backup)。

其中,只有处于Master状态的设备才可以转发那些发送到虚拟IP地址的报文。
状态 说明
Initialize 该状态为VRRP不可用状态,在此状态时设备不会对VRRP通告报文做任何处理。通常设备启动时或设备检测到故障时会进入Initialize状态。
Master 当VRRP设备处于Master状态时,它将会承担虚拟路由设备的所有转发工作,并定期向整个虚拟内发送VRRP通告报文。
Backup 当VRRP设备处于Backup状态时,它不会承担虚拟路由设备的转发工作,并定期接受Master设备的VRRP通告报文,判断Master的工作状态是否正常。

VRRP的前提条件

1. 虚拟IP不得重复
2. 虚拟IP得和相同网段的网卡绑定

重点知识

1. keppalived高可用是基于VRRP虚拟路由冗余协议实现的,因此我从VRRP给您描述起
2. VRRP也就是虚拟路由冗余协议,是为了解决静态路由的单点故障;
3. VRRP通过竞选协议将路由任务交给某一台VRRP路由器。
4. VRRP正常工作时,master会自动发送数据包,backup接收数据包,目的是为了判断对方是否存活;如果backup收不到master的数据包了,自动接管master的资源;
backup节点可以有多个,通过优先级竞选,但是keepalived服务器一般都是成对出现;
5. VRRP默认对数据包进行了加密,但是官网默认还是推荐使用明文来配置认证;

说完了VRRP,我再给您描述下keepalived工作原理。
1.keepalived就是基于VRRP协议实现的高可用,master的优先级必须高于backup,因此启动时master优先获得机器的IP资源,backup处于等待状态;若master挂掉后,backup顶替上来,继续提供服务。
2.在keepalived工作时,master角色的机器会一直发送VRRP广播数据包,告诉其他backup机器,“我还活着”,此时backup不会抢夺资源,老实呆着。
当master出现问题挂了,导致backup收不到master发来的广播数据包,因此开始接替VIP,保证业务的不中断运行,整个过程小于1秒。

环境部署

1、准备机器

lb-5 10.0.0.5  keepalived-master机器  nginx-lb-5
lb-6 10.0.0.6  keepalived-backup机器  nginx-lb-6

web-7 10.0.0.7 web服务器
web-8 10.0.0.8 web服务器

2、安装keepalived

给5、6机器安装
yum install keepalived -y

3、创建master角色slb-5机器的keepalived配置文件

参数解释
global_defs {
    router_id lb-5 # 路由器ID,每个机器不一样
}

vrrp_instance VIP_1 {       # 设置VRRP路由器组组名,属于同一组的名字一样
    state MASTER            # 角色,master、backup两种            
    interface eth0          # VIP绑定的网卡         
    virtual_router_id 50    # 虚拟路由IP,同一组的一样    
    priority 150            # 优先级,优先级越高,权重越高
    advert_int 1            # 发送组播间隔1s
    authentication {        # 认证形式
        auth_type PASS      # 密码认证,明文密码 1111
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3            # 指定虚拟VIP地址,必须没人使用
    }
}
[root@slb-5 /etc/keepalived]#cp keepalived.conf keepalived.conf.cn 
[root@slb-5 /etc/keepalived]#ls
keepalived.conf  keepalived.conf.cn
[root@slb-5 /etc/keepalived]#vim keepalived.conf
[root@slb-5 /etc/keepalived]#cat keepalived.conf
global_defs {
    router_id slb-5
}

vrrp_instance VIP_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
    }
}

4、创建backup角色slb-6机器的配置文件

[root@slb-6 /etc/keepalived]#cat keepalived.conf
global_defs {
    router_id slb-6
}

vrrp_instance VIP_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
    }
}

5、启动两台机器的keepalived服务

1、检查当前网卡情况
[root@slb-5 /etc/keepalived]#ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c0:5b:ff brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec0:5bff/64 scope link 
       valid_lft forever preferred_lft forever

[root@slb-6 /etc/keepalived]#ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:93:45:d6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe93:45d6/64 scope link 
       valid_lft forever preferred_lft forever

2、启动服务
systemctl start keepalived

3、再次检查VIP情况
root@slb-5 /etc/keepalived]#ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c0:5b:ff brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec0:5bff/64 scope link 
       valid_lft forever preferred_lft forever

[root@slb-6 /etc/keepalived]#ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:93:45:d6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe93:45d6/64 scope link 
       valid_lft forever preferred_lft forever

6、结合nginx测试

slb-5
[root@slb-5 /etc/nginx/conf.d]#cat slb.conf 
upstream web_pools {
    server 10.0.0.7:83;
    server 10.0.0.8:83;
}
server {
listen 80;
server_name _;
location / {

    proxy_pass http://web_pools;
    include proxy_params.conf;
}

}
[root@slb-5 /etc/nginx/conf.d]#systemctl restart mginx
Failed to restart mginx.service: Unit not found.
[root@slb-5 /etc/nginx/conf.d]#systemctl restart nginx

slb-6
[root@slb-6 /etc/nginx/conf.d]#yum install nginx -y
[root@slb-6 /etc/keepalived]#cd /etc/nginx/conf.d/

[root@slb-6 /etc/nginx]#cat  proxy_params.conf
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

[root@slb-6 /etc/nginx/conf.d]#vim slb.conf
[root@slb-6 /etc/nginx/conf.d]#cat slb.conf 
upstream web_pools {
    server 10.0.0.7:83;
    server 10.0.0.8:83;
}
server {
listen 80;
server_name _;
location / {

    proxy_pass http://web_pools;
    include proxy_params.conf;
}

}
[root@slb-6 /etc/nginx/conf.d]#systemctl restart nginx

web集群
[root@web-7 /etc/nginx/conf.d]#vim slb.conf
[root@web-7 /etc/nginx/conf.d]#cat slb.conf 
server {
 listen 83;
 server_name _;
    charset utf-8;
    location / {
        root /www;
        index index.html;
    }
}
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx
[root@web-7 /etc/nginx/conf.d]#vim /www/index.html 
[root@web-7 /etc/nginx/conf.d]#cat /www/index.html 
<meta charset=utf8>
我是web-7,你好呀,地球人


[root@web-8 /etc/nginx/conf.d]#vim slb.conf
[root@web-8 /etc/nginx/conf.d]#cat slb.conf 
server {
 listen 83;
 server_name _;
    charset utf-8;
    location / {
        root /www;
        index index.html;
    }
}
[root@web-8 /etc/nginx/conf.d]#systemctl restart nginx
[root@web-8 /etc/nginx/conf.d]#vim /www/index.html 
[root@web-8 /etc/nginx/conf.d]#cat /www/index.html 
<meta charset=utf8>
我是web-8,吃了吗

7、客户端访问

访问设置的vip 10.0.0.3

8、模拟master故障,就是设置的5机器keepalived服务挂掉

[root@slb-5 /etc/nginx/conf.d]#systemctl stop keepalived
[root@slb-5 /etc/nginx/conf.d]#ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c0:5b:ff brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec0:5bff/64 scope link 
       valid_lft forever preferred_lft forever


[root@slb-6 /etc/nginx/conf.d]#ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:93:45:d6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe93:45d6/64 scope link 
       valid_lft forever preferred_lft forever

实现了VIP漂移
[root@slb-6 /etc/nginx/conf.d]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:93:45:d6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe93:45d6/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:93:45:e0 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.6/24 brd 172.16.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe93:45e0/64 scope link 
       valid_lft forever preferred_lft forever

9、恢复slb-5机器master的keepalived服务

[root@slb-5 /etc/nginx/conf.d]#systemctl start keepalived
[root@slb-5 /etc/nginx/conf.d]#ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c0:5b:ff brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec0:5bff/64 scope link 
       valid_lft forever preferred_lft forever


[root@slb-6 /etc/nginx/conf.d]#ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:93:45:d6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe93:45d6/64 scope link 
       valid_lft forever preferred_lft forever

在此跳转到5机器master上
[root@slb-5 /etc/nginx/conf.d]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c0:5b:ff brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.3/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec0:5bff/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c0:5b:09 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec0:5b09/64 scope link 
       valid_lft forever preferred_lft forever

Keepalived脑裂问题

简单说就是如果master还在正常工作,但是backup没有正确接收到master的心跳数据包,就会以为master挂掉了,抢夺VIP资源。

这个世道就会导致两个服务器都有了VIP,导致冲突故障,这就是脑裂问题。

1.导致脑裂的原因

要实现心跳检测,需要让至少两台服务器实现互相通信,数据包收发,主要通过如下方式实现

(生产环境下做法)直接网线让两台服务器直连
也可以通过局域网通信,确保两台机器可以连接。
高可用软件基于这个心跳线来判断对端机器是否存活,决定是否要实现故障迁移,VIP迁移,保证业务的连续性。

一般来说,导致脑裂的原因有这些,也是排错思路

心跳线老化,线路破损,导致无法通信
网卡驱动损坏,master、backup IP地址冲突。
防火墙配置错误,导致心跳消息收不到
配置文写错了,两台机器的虚拟路由ID不一致。

2.解决脑裂

使用双心跳线路,防止单线路损坏,只要确保master的心跳数据包能发给backup。
通过脚本程序检测脑裂情况
判断是否两边都有VIP,如果心跳重复,强制关闭一个心跳节点(直接发送关机命令,强制断掉主节点的电源)
做好脑裂监控,如果发现脑裂,人为第一时间干预处理。
如果开启了防火墙,注意要允许心跳IP的访问。

keepalived组播原理

单播流量走向图

广播数据流

组播数据流

keepalived组播地址

组播: 主机之间一对多的通讯模式,将数据源发送到一组内的多个接受者;组播将报文发到特定的组播地址,它不属于一个单个的主机,而是一组主机;

一个组播地址属于一个群组,在这个组里的接受者都可以收到报文;
keepalived默认使用VRRP虚拟路由器冗余协议,在默认组播224.0.0.18这个IP地址以实现在master和backup机器之间进行通信,实现健康检查。

posted @ 2022-07-26 20:12  张开嘴  阅读(444)  评论(0编辑  收藏  举报