一个简化的可横向扩容的高可用的四层接入网关的原理说明——ECMP

图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》会介绍,并搭建对应的部分。

图1

为了实现可横向扩缩容和高可用,在“入口路由”到“负载均衡服务器”之间使用了ECMP,中文名称叫等价多路径,是路由器领域的使用的一项技术。作用是,在IP交换网络中存在到达同一目的地址的多条不同的路径,而且每条路径消耗的资源(Cost)一样的情况下,启用了ECMP功能的路由器就会根据配置策略,将它认定的“等价的IP报文”通过不同的路径均衡地转发出去,使转发达到负载均衡的目的。

“接入网关”就是利用了ECMP的特性,将IP报文转发到不同的“负载均衡服务器”上,这样就解决了单点问题,而且是多活。

ECMP负载均衡的策略形式上可以分为两类:Per-Packet,如图2,每个IP报文做独立的负载均衡,通常它对转发线路利用率更高;Per-Flow,如图3,每种“等价的IP报文”始终走同一条路径,它解决了IP报文对转发线路亲和性的问题;

图2 Per-packet ECMP
图3 Per-flow ECMP

一般使用Per-Flow的负载均衡策略,这对“负载均衡服务器”的实现方案更友好,这部分会在后续文章《ECMP在Linux内核的实现》中会有更具体的介绍。

ECMP本是路由器的技术,那在搭建这个简化的“接入网关”我们配置好路由ECMP就好了,还需要做什么呢?

答案是,将“负载均衡服务器”模拟成路由,使用路由器里已成熟的协议实现部分高可用机制。比如说:L2的BFD协议能在毫秒级别内检测链路异常,能够快速地踢掉出现链路故障的或宕机的“负载均衡服务器”;L3/L4的内部网关/路由协议快速地扩缩容或者踢掉出现故障的“负载均衡服务器”。也避免了需要手工配置“入口路由”,有的场景下“入口路由”没有权限配置,或者有多个、多级“入口路由”,管理起来异常麻烦。

下面我们来按图1搭建环境测试一下ECMP。

这里引入一个叫做Quagga的软件,将“负载均衡服务器”模拟成路由。另外,由于搭建的环境没有硬件的“入口路由”,所以“入口路由”也使用Quagga模拟。

图4是Quagga的简易架构图,bgpd、ripd、isisd和ospfd等是运行网关/路由协议的守护进程,zebrad是管理宿主系统路由表的守护进程,它们的功能共同构成了一个软路由,vtysh是该软路由的管理终端,是操作各个守护进程的统一入口。

图4

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在两个“负载均衡服务器”抓抓报文试试吧。

图5

附:

下面是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代表骨干网,所有非骨干网都要经过骨干网通信)

```

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券