22

阿里云支持使用Keepalived搭建负载均衡软件吗?

 4 years ago
source link: https://www.tuicool.com/articles/zayQn2I
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

现在接触的项目是部署在阿里云上的,负载均衡使用七层的Nginx,部署在ECS上的某一台设备上。该七层Proxy代理了后端ECS服务器,虽然通过Nginx负载均衡技术能够对后端ECS进行健康检查,但这七层Proxy本身却是个单点,所以它本身不能算一个负载均衡设备(软件),一般负载均衡设备都有主备的概念,所以想着使用Keepalived搭配两台ECS服务器做一个 真正 的负载均衡设备)。

由于原理没有想通,再加上Keepalived文档内容很多,又不想花太多的时间去学习,咨询了一些同事,但越理解越费劲,这一块确实需要很多的网络知识,以下是自己记录的一些内容。

如何实现一个内网VIP

在原公司的时候,经常说为一个项目申请内网或外网的VIP,这个VIP叫做虚拟IP,它能够保证其对应的服务是存活的,所以对于开发人员来说,可能没有关心它细节,实际上这个虚拟IP对应了负载均衡技术,可能是自行搭建的,比如Keepalived就是为了配合LVS才开发出来的。

先大概了解下Keepalived,它是一个基于VRRP协议来实现的服务高可用方案,能够避免IP的单点故障,它结合其他的负载均衡技术(比如LVS),从而保证整个集群的高可用性。

通过VRRP协议,由多台机器构成一个虚拟路由器组,里面有一个master和多个backup,同个时刻只有master拥有虚拟IP(LVS集群或Nginx集群),master会发送vrrp包,如果其他backup机器收不到,就会选举出一个新的master,且绑定虚拟IP,也就是说这个虚拟IP是漂移的。拥有虚拟IP的master负责arp和ip包转发。

对于内网VIP来说就很简单了,这个VIP和其他负载均衡设备在同一个网络上,一旦设备绑定了这个VIP,就由它负责“负载均衡了”。

Keepalived配置文件主要有三个段一个master和多个backup,vrrp_instance,vrrp_instance。

现在假设网络组分配了三个ip,192.168.10.10(eth1,在eth0也可以),192.168.10.11(eth1),192.168.10.13(虚拟IP),看配置文件(部署Keepalived的10和11两台机器):

global_defs {
    notification_email {
    }
}
vrrp_script chkscript {
    script "check.sh" 
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    mcast_src_ip 192.168.10.11#(另外一台配置192.168.10.12)
    virtual_router_id 51
    priority 101
    virtual_ipaddress {
        192.168.10.13
    }
    track_script {
       chkscript 
    }
}

interface就是将来要绑定vip的网卡接口,mcast_src_ip表示在虚拟路由器组中该机器发送的源IP,virtual_ipaddress就是在interface接口上绑定vip,从而完成VIP宣告,track_script就是使用脚本检测服务是否存活(负载均衡软件,比如用Nginx搭建的话,就检测Nginx是否存活)。

如何实现一个外网VIP

如果虚拟IP是一个内网的IP,如果该负载均衡要对外服务,可以在公网IP上做一个NAT映射,不过实际上Keepalived也可以直接配置一个外网的VIP,只是该外网VIP和负载均衡设备和这个VIP要在一个交换机上,且VIP在漂移后要绑定默认网关。

现在假设网络组分配了三个ip,192.168.10.10(eth0,eth1配置为空),192.168.10.11(eth0,eth1配置为空),202.108.3.133(虚拟IP)。

global_defs {
    notification_email {
    }
}
vrrp_script chkscript {
    script "check.sh" 
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101

    virtual_ipaddress {  
        202.108.3.133/26 dev eth1  
    }
    virtual_routes {
        default via 202.108.3.1 #默认网关

    track_script {
       chkscript 
    }
}

如果virtual_ipaddress没有配置,则interface对应的接口就用来发送vrrp包,一旦漂移成功,在对应的机器上的eth1外网接口上绑定虚拟公网VIP,virtual_routes配置默认路由。

不过很少有这么做的,因为交换机对应的网络如果很大,则会发送大量的广播包。

阿里云上支持Keepalived吗?

以前阿里云支持HAVIP,用于配合Keepalived,不过现在已经不支持了,所以文档中也看不到了,不过可以通过腾讯云的介绍了解下细节,在VPC网络下才有HAVIP,它的概念:

高可用虚拟 IP(HAVIP)是一个浮动的内网 IP,支持机器通过 ARP 宣告进行绑定,更新 IP 和 MAC 地址的映射关系。在高可用部署(如 keepalived)场景下,该 IP 可从 主服务器切换至备服务器,从而完成业务容灾。

为什么我们不随便找一个内网IP做VIP呢?腾讯云介绍到:

公有云厂商的普通内网 IP,出于安全考虑(如 ARP 欺骗等),不支持主机通过 ARP 宣告 IP 。当用户直接在 keepalived.conf 文件中指定一个普通内网 IP 为 virtual_address,系统无法完成迁移。

所以它们才出了HAVIP,相当于先要到腾讯云或阿里云申报,具体技术细节就未知了,现在假设阿里云支持 HAVIP,如何搭建呢?

比如VPC(192.168.1.0/24),ECS(192.168.1.1,192.168.1.2,一般绑定在主内网网卡上,在ECS上一定会有的),HAVIP(192.168.1.3),公网EIP(202.108.3.133)用于映射到HAVIP,EIP是阿里云的弹性IP,可以绑定到SLB,ECS,NAT网关,而HAVIP有点像弹性网卡。

搭建完成后,用户访问公网EIP,它会映射到两台ECS上的某一台,对应的内网IP地址就是HAVIP。

global_defs {
    notification_email {
    }
}
vrrp_script chkscript {
    script "check.sh" 
}
vrrp_instance VI_1 {
    state MASTER
    interface eth1 #有点类似于弹性网卡,用于绑定HAVIP
    unicast_src_ip 192.168.1.1
    unicast_peer {
        192.168.1.2  
        # 192.168.1.3 如果有多台机器
    }
    virtual_router_id 51
    priority 101
    virtual_ipaddress {
        192.168.1.3
    }
    track_script {
       chkscript 
    }
}

阿里云HAVIP只支持单播,所以要使用unicast_src_ip参数,且要使用unicast_peer配置对端的设备IP。

结论

虽然阿里云不支持HAVIP,无法配合Keepalived搭建高可用解决方案,但从中也学到了一些技术,但由于自己网络知识还一般,所以很多东西不能明白原理,只能尽力而为去理解,且没有真正去时间,同时对于阿里云的VPC网络,包括弹性网卡,弹性IP也有了一定的理解。

最后还是建议购买SLB,如果你理解了阿里云地域和可用区,且要搭建一个同城多机房的高可用解决方案,最好还是别自行搭建了,这一块后面还会分享。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK