前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个简化的可横向扩容的高可用的四层接入网关的原理说明——ECMP

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

原创
作者头像
lakezhong
修改2019-06-25 18:32:59
4.2K1
修改2019-06-25 18:32:59
举报
文章被收录于专栏:lakezhong的专栏lakezhong的专栏

图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
图1

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

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

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

图2 Per-packet ECMP
图2 Per-packet ECMP
图3 Per-flow 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
图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
图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代表骨干网,所有非骨干网都要经过骨干网通信)

```

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com