图1是一个简化的可横向扩容的高可用的四层接入网关的组网图,主要由入口路由(Ingress Router)、负载均衡服务器(Load Director)和真实的服务器(Real Server)构成。使用的技术包括ECMP和LVS(ipvs ipvsadm)。
ECMP(Equal Cost Multi Path)用作L3(三层)负载均衡,用于解决“负载均衡服务器”的单点和扩缩容的问题。支持ECMP特性的路由器将IP报文转发到不同的“负载均衡服务器”上。本文就ECMP做详细的说明,并搭建图1中的“ECMP部分”。
LVS用作L4(四层)负载均衡,用于解决单台“真实服务器”扩缩容麻烦和性能瓶颈的问题。LVS将多台“真实服务器”通过虚拟IP + 端口(VIP + PORT)的形式聚合成一台虚拟的服务器。原生LVS支持三种负载均衡模式有DIRECT、NAT和TUNNEL,阿里的扩展版本支持了FULL-NAT模式。在后续文章《一个简化的可横向扩容的高可用的四层接入网关的原理说明——LVS-DIRECT》《一个简化的可横向扩容的高可用的四层接入网关的原理说明——LVS-NAT》《一个简化的可横向扩容的高可用的四层接入网关的原理说明——LVS-TUNNEL》会介绍,并搭建对应的部分。
为了实现可横向扩缩容和高可用,在“入口路由”到“负载均衡服务器”之间使用了ECMP,中文名称叫等价多路径,是路由器领域的使用的一项技术。作用是,在IP交换网络中存在到达同一目的地址的多条不同的路径,而且每条路径消耗的资源(Cost)一样的情况下,启用了ECMP功能的路由器就会根据配置策略,将它认定的“等价的IP报文”通过不同的路径均衡地转发出去,使转发达到负载均衡的目的。
“接入网关”就是利用了ECMP的特性,将IP报文转发到不同的“负载均衡服务器”上,这样就解决了单点问题,而且是多活。
ECMP负载均衡的策略形式上可以分为两类:Per-Packet,如图2,每个IP报文做独立的负载均衡,通常它对转发线路利用率更高;Per-Flow,如图3,每种“等价的IP报文”始终走同一条路径,它解决了IP报文对转发线路亲和性的问题;
一般使用Per-Flow的负载均衡策略,这对“负载均衡服务器”的实现方案更友好,这部分会在后续文章《ECMP在Linux内核的实现》中会有更具体的介绍。
ECMP本是路由器的技术,那在搭建这个简化的“接入网关”我们配置好路由ECMP就好了,还需要做什么呢?
答案是,将“负载均衡服务器”模拟成路由,使用路由器里已成熟的协议实现部分高可用机制。比如说:L2的BFD协议能在毫秒级别内检测链路异常,能够快速地踢掉出现链路故障的或宕机的“负载均衡服务器”;L3/L4的内部网关/路由协议快速地扩缩容或者踢掉出现故障的“负载均衡服务器”。也避免了需要手工配置“入口路由”,有的场景下“入口路由”没有权限配置,或者有多个、多级“入口路由”,管理起来异常麻烦。
下面我们来按图1搭建环境测试一下ECMP。
这里引入一个叫做Quagga的软件,将“负载均衡服务器”模拟成路由。另外,由于搭建的环境没有硬件的“入口路由”,所以“入口路由”也使用Quagga模拟。
图4是Quagga的简易架构图,bgpd、ripd、isisd和ospfd等是运行网关/路由协议的守护进程,zebrad是管理宿主系统路由表的守护进程,它们的功能共同构成了一个软路由,vtysh是该软路由的管理终端,是操作各个守护进程的统一入口。
Ingress Router 1关键配置:
xxx$ sh -c “echo 1 > /proc/sys/net/ipv4/ip_forward”
xxx$ ip address add 192.168.1.105/24 dev enp0s8
xxx$ ip address add 192.168.2.105/24 dev enp0s9
xxx$ ip address add 192.168.15.101/24 dev enp0s10
xxx$ ip address add 192.168.15.102/24 dev enp0s10
xxx$ ip address add 192.168.15.103/24 dev enp0s10
xxx$ vtysh
ingress-1> enable
ingress-1# configure terminal
ingress-1(config)# router ospf
ingress-1(config-router)# router-id 5.5.5.5
ingress-1(config-router)# network 192.168.1.0/24 area 0.0.0.0
ingress-1(config-router)# network 192.168.2.0/24 area 0.0.0.0
ingress-1(config-router)# network 192.168.15.0/24 area 0.0.0.0
ingress-1(config-router)# quit
ingress-1(config)# interface enp0s8
ingress-1(config-if)# ip ospf cost 200
ingress-1((config-if)# quit
ingress-1(config)# interface enp0s8
ingress-1(config-if)# ip ospf cost 200
ingress-1((config-if)# quit
ingress-1((config)# end
ingress-1# write
ingress-1# quit
xxx$
Load Directo 1关键配置:
xxx$ ip address add 192.168.1.104/24 dev enp0s8
xxx$ ip address add 192.168.100.100/24 dev enp0s10
xxx$ vtysh
ld-1> enable
ld-1# configure terminal
ld-1(config)# router ospf
ld-1(config-router)# router-id 4.4.4.4
ld-1(config-router)# network 192.168.1.0/24 area 0.0.0.0
ld-1(config-router)# network 192.168.100.0/24 area 0.0.0.0
ld-1(config-router)# quit
ld-1((config)# end
ld-1# write
ld-1# quit
xxx$
Load Directo 2关键配置:
xxx$ ip address add 192.168.2.103/24 dev enp0s8
xxx$ ip address add 192.168.100.100/24 dev enp0s10
xxx$ vtysh
ld-2> enable
ld-2# configure terminal
ld-2(config)# router ospf
ld-2(config-router)# router-id 3.3.3.3
ld-2(config-router)# network 192.168.2.0/24 area 0.0.0.0
ld-2(config-router)# network 192.168.100.0/24 area 0.0.0.0
ld-2(config-router)# quit
ld-2((config)# end
ld-2# write
ld-2# quit
xxx$
配置妥当之后,在Ingress Router 1上使用ip-route查询一下动态路由是否生效,如果出现类似图5中最后三行,那就配置成功了。使用“ping -I 192.168.15.101 192.168.100.100” “ping -I 192.168.15.102 192.168.100.100” “ping -I 192.168.15.103 192.168.100.100”,使用tcpdump在两个“负载均衡服务器”抓抓报文试试吧。
附:
下面是Quagga设置的简单说明。
# 安装quagga
```
sudo apt-get install quagga
其它Linux发行版使用对应的软件管理工具安装
```
# 启动服务
```
systemctl start zebrad.service
systemctl start ospfd.service
或者
service zebrad start
service ospfd start
```
# 配置文件
## zebra配置文件
```
配置文件位置:
/etc/quagga/zebra.conf
初次安装可拷贝文件“/usr/share/doc/quagga-core/examples/zebra.conf.sample”
配置示例:
! 在vtysh中显示的名字,随意填
hostname router1
! 在vtysh中登录密码
password router1
enable password router1
! 路由的网口
interface enp0s3
! 路由的网口,并且配置了一个ip
interface enp0s8
ip address 192.168.100.101/24
! 路由的网口
interface lo
! 启用ip转发
ip forwarding
```
## ospf配置文件
```
配置文件位置:
/etc/quagga/ospfd.conf
初次安装可拷贝文件“/usr/share/doc/quagga-core/examples/ospfd.conf.sample”
配置示例:
! 在vtysh中显示的名字,随意填
hostname router1
! 在vtysh中登录密码
password router1
enable password router1
! 路由的网口
interface enp0s3
! 路由的网口
interface enp0s8
ip ospf cost 200
! 路由的网口
interface lo
! 启用了路由的ospf功能
router ospf
! ospf路由的唯一标识
ospf router-id 1.1.1.1
! 本路由管理了骨干网192.168.100.0/24网段的ip转发
network 192.168.100.0/24 area 0.0.0.0
```
## vtysh配置文件
```
配置文件位置:
/etc/quagga/vtysh.conf
初次安装可拷贝文件“/usr/share/doc/quagga-core/examples/vtysh.conf.sample”
配置示例:
! 在vtysh中显示的名字,随意填
hostname router1
! 不启用密码
! username root no password
```
---
# 通过vtysh配置路由
## 使用vtysh路由终端
```
调用vtysh指令进入路由管理
```
## 配置模式
```
进入配置模式:
enable
configure terminal
退出配置模式:
end
配置模式下保存配置:
write
(配置覆盖/etc/quagga/ospfd.conf)
普通模式下保存配置:
do write
注意:
普通模式下还有enable和disable模式区分(后续填坑)
```
## ospf路由配置
```
进入ospf设置:
router ospf
设置路由id:
router-id 1.1.1.1
设置ospf路由管理的网络:
network 192.168.100.0/24 area 0
(这里0代表骨干网,所有非骨干网都要经过骨干网通信)
```
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。