惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Exploit Database - CXSecurity.com
Help Net Security
Help Net Security
腾讯CDC
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
IT之家
IT之家
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 最新话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Threatpost
N
News | PayPal Newsroom
C
Cybersecurity and Infrastructure Security Agency CISA
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
SegmentFault 最新的问题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Proofpoint News Feed
A
Arctic Wolf
B
Blog RSS Feed
Forbes - Security
Forbes - Security
P
Privacy & Cybersecurity Law Blog
Attack and Defense Labs
Attack and Defense Labs
V2EX - 技术
V2EX - 技术
P
Proofpoint News Feed
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
阮一峰的网络日志
阮一峰的网络日志
aimingoo的专栏
aimingoo的专栏
T
Tenable Blog
MyScale Blog
MyScale Blog
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
W
WeLiveSecurity
D
DataBreaches.Net
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
罗磊的独立博客
The Last Watchdog
The Last Watchdog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Vulnerabilities – Threatpost
美团技术团队
Microsoft Security Blog
Microsoft Security Blog

卡瓦邦噶!

服务器高性能网络调优 | 卡瓦邦噶! 为何写作 | 卡瓦邦噶! 读《金阁寺》 | 卡瓦邦噶! 雨季又来 | 卡瓦邦噶! MTU Probe 引起的初始延迟 | 卡瓦邦噶! 3.5 秒的固定延迟问题 | 卡瓦邦噶! 学习网络的一点经验 | 卡瓦邦噶! ARP 问题诊断 | 卡瓦邦噶! 网络断断续续…… | 卡瓦邦噶! Piccolo P2P 镜像分发 | 卡瓦邦噶! 一起看电影 | 卡瓦邦噶! 《征服C指针》 | 卡瓦邦噶! 我的姥姥 | 卡瓦邦噶! Python的哲学 Python 3.5的新特性 学校不教的计算机课 垃圾回收(GC)的三种基本方式 在编程中体验纯粹的快乐 从《美丽新世界》谈自由 在快钱实习 迷人的嗓音和迷人的故事——《Sleepyhead》 Python 的十个自然语言处理工具 记一个愚蠢的bug 一年炉石传说的游戏体验 《以撒的结合:重生》网页版图鉴 分清 C++的指针、引用和数组 笑话三则 自由比皇帝更伟大——《悲惨世界》笔记 Git 10 周年访谈:Linus 讲述背后故事 用 0x3f3f3f3f 设定最大int值的优点 Joel给计算机系学生的建议 一个词法分析器的简单实现 怎样才算健康的生活方式 MacVim 配置攻略 学习培训课程的视频效果好吗? 语言的控制 可悲的大多数 CSS样式思维导图 2014年终总结 奥巴马成为首位写程序的美国总统 青岛老城区的下水道好在哪里? 做优秀 UI 的七个建议(第二部分) 选择爱情的骑士 Git简明教程 Java集合总览 读 《1984》 java问答:终极父类(六)——等待/唤醒和接口 Java 问答:终极父类(五)——toString() Hyperlapse快速视频背后的技术细节 平庸之恶 Java程序员须知的七个日志管理工具 苏州 逛书摊随想 关于考试作弊 你的工作不仅仅是编程 推荐在线学习Java的英文资源 关注女性命运——《千禧年三部曲》 用好你的幻灯片——《演说之禅》 使用ReentrantLock和Lambda表达式让同步更纯净 新手学编程,从哪里开始? 程序员都是工程师吗? 不要学习代码,要学会思考 Java 问答:终极父类(四)——hashCode() Java 问答:终极父类(三)——finalize()和 getClass() 程序员职业之路的选择 我是一名摄影家 写给何小树的城市指南 为什么一些语言会比别的快? Java的常见误区与细节 跟朋友在一起玩游戏 死神永生——读《三体》 五种类型的程序员 创业圣经——读《黑客与画家》 纪念加西亚·马尔克斯 Junit中处理异常的另一种方式:catch-exception Java8采用Martin Fowler的方法创建内部DSL Linux HotSopt虚拟机GC线程的CPU占用率 J2EE概念介绍 如何成为一名黑客 Java 问答:终极父类(二)——equals()方法 为什么我喜欢Java Java 问答:终极父类(一)——clone()方法 七个改变世界的Java项目 java中默认类型转换的小问题 传统与创新 欢迎来到互联网 莫言和马尔克斯——读《生死疲劳》 位运算的妙用 读《人为什么活着》 写博客教会我的事情 中国特色操作系统 2013年总结 《永不妥协》影评 恨不相逢未嫁时——《廊桥遗梦》影评 如何优雅地使用PPT 给明年依然年轻的我们 天才与柱子 黑客守则和黑客精神 Looking for Freedom——《被解救的姜戈》 简洁之道
数据中心网络高可用技术之从服务器到交换机:802.3 ad
laixintao · 2024-08-06 · via 卡瓦邦噶!

我们距离双线双活的完美方案越来越近了。在上文的链路聚合方案中,服务器和交换机之间的多条线路可以虚拟成一条,唯一的不足是故障检测比较复杂,MII Monitoring 和 ARP Monitoring 都不够完美。有什么办法,可以在出现问题的时候,让无论是交换机还是服务器都能快速发现问题并进行切换呢?

目前的健康检查手段,MII Monitoring 太短,不足以检查到线路的问题;ARP Monitoring 太长,连对端服务器的问题也会触发。最好的检测距离就是服务器到交换机之间,这样不多也不少。

按照这个思路,可以让交换机和服务器之间实现类似 keepalive 的机制,当任意一方的任意一条线路发现对面不再存活,就不使用这条线继续发送数据,就可以做到更加准确的健康检查机制。

LACP (Link Aggregation Control Protocol) 就是这样一种协议。

IEEE 802.3ad 定义了链路聚合,但是链路聚合可以认为是一种实现而不是协议,它的兼容性很高,不同的厂商可以自己实现链路聚合功能。在上一篇文章中,我们没有使用 LACP 协议,也看到了链路聚合正常工作。802.3ad 一个是定义了链路聚合,另一个就是定义了 LACP 协议。LACP 协议做了两件事情:

  1. 健康检查,可以自动发现问题执行切换;
  2. 可以自己协商链路聚合,减少手动配置的内容;

健康检查是通过 LACP 协议参与的两端(交换机和服务器),互相发送 LACPDU,这是一个二层的数据帧,只会存在于网线的两端,不会被转发。如果能收到对方发送的 LACPDU,说明线路健康,如果连续3个 LACPDU 都没收到,就不从这条线路发送数据了。LACP 发送 LACPDU 的 rate 有两种,一种是 fast, 每 1s 发送一个,这样在线路挂的时候,需要 3 个包的时间,就是 3s 恢复。另一种是 slow,每 30s 发送一个,出现问题的时候需要 90s 时间恢复。

第二个功能更加实用。读者可能觉得,配置多一点没有什么问题呀,只要我们使用自动化来代替手动配置就可以。但是事实上,这个功能远不止节省了配置。

LACP 协议有两种模式,mode active 和 mode passive:

  • active 模式下,设备会通过线路发送 LACPDU(LACP 协议的包),不管对方有没有开启 LACP 协议;
  • passive 模式下,设备不会发送 LACPDU,除非收到了对方发过来的 LACPDU;

Active 不代表建立了链路聚合,要完成链路聚合,双方至少有一方得是 active 模式才行,如果两端都收到了对方的 LACPDU 就可以协商建立起来链路聚合。

建立链路聚合的过程,来源

这种自动协商的链路聚合第一个优点就是配置很少,要多加一根线的时候,插上线,LACP 协议就可以开始自动协商。

第二个优点就是可以阻止错误,这点非常重要。机房部署的时候,经常遇到线路接错的情况(不要惊讶,这太常见了)。

考虑下面这种情况,交换机 1 和 2 做了链路聚合,服务器网口 A 和 B 做了链路聚合,配置正确,但是机房人员在接线的时候接错了,服务器 B 口应该连接交换机端口 2,却连接了端口 5.

接错线的例子

如果是静态配置的链路聚合,交换机和服务器都不会知道线路接错的情况,服务器会通过 A 和 B 发送数据,交换机这边就会出现 MAC flapping 问题。交换机也可能通过 2 端口把应该发给这台服务器的数据发送到错误的地方去。

这是一个灾难性的问题,因为程序会表现异常而不是直接报网络错误,很难排查。可以类似我们在写程序的时候,我们喜欢程序直接出错挂掉,而不是没有错误但是逻辑有 BUG。又如,我们宁可数据库出问题,也不想数据库没问题但是数据全错了。

而如果使用 LACP 协议的话,交换机从 1 号端口和 5 号端口发送过来的 LACPDU 会有不一样的 system id,在服务器侧,就会发现对方的两个端口不属于同一个 Link Aggration Group (LAG), 于是协商失败,就无法完成链路聚合,在服务器侧就会只选择使用一条线进行发送。同理,交换机也不会认为自己的 1 号和 5 号能完成链路聚合,这时候会选择断开一条线。LACP 协商会让两端断开同一条线,所以最终这种情况是依然可以通信,但是只有一条线能工作。问题非常明确,我们直接去排查为什么带宽不正确,进而排查 LACP 链路聚合状态即可。

802.3ad 模式实验 (mode 4)

我们使用的拓扑结构如下,还是和之前的一样:

使用默认的配置很简单,还是和之前的配置一样,只不过 mode 使用 802.3ad 这个名字。

因为 LACP 协议是在 802.3ad 中定义的,所以 Linux 中的配置直接用了 802.3ad 作为 mode,意思就是完全使用 802.3ad 中定义的链路聚合,也意味着开启了 LACP 协议。

Shell

1

2

3

4

5

6

7

ip link add bond0 type bond mode 802.3ad

ip link set eth0 down

ip link set eth1 down

ip link set eth0 master bond0

ip link set eth1 master bond0

ip link set bond0 up

ip add add 192.168.1.10/24 dev bond0

查看 ip link,和之前的静态链路聚合是一样的。

1

2

3

4

5

6

7

8

9

root@ubuntu-5:/$ip link

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000

    link/ether 52:51:0e:de:05:04 brd ff:ff:ff:ff:ff:ff

99: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UNKNOWN mode DEFAULT group default qlen 1000

    link/ether 52:51:0e:de:05:04 brd ff:ff:ff:ff:ff:ff

100: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UNKNOWN mode DEFAULT group default qlen 1000

    link/ether 52:51:0e:de:05:04 brd ff:ff:ff:ff:ff:ff

查看 bonding 信息:

bonding info

Shell

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

root@ubuntu-5:/$cat /proc/net/bonding/bond0

Ethernet Channel Bonding Driver: v5.15.0-94-generic

Bonding Mode: IEEE 802.3ad Dynamic link aggregation

Transmit Hash Policy: layer2 (0)

MII Status: up

MII Polling Interval (ms): 100

Up Delay (ms): 0

Down Delay (ms): 0

Peer Notification Delay (ms): 0

802.3ad info

LACP active: on

LACP rate: slow

Min links: 0

Aggregator selection policy (ad_select): stable

System priority: 65535

System MAC address: 52:51:0e:de:05:04

Active Aggregator Info:

        Aggregator ID: 1

        Number of ports: 2

        Actor Key: 5

        Partner Key: 22

        Partner Mac Address: aa:bb:cc:80:01:00

...

可以看到默认的模式是 active. 即 Linux 总是尝试与对面进行 LACP 协商。这样的话,我们在交换机侧配置成 active 或者 passive 都是可以的。

交换机配置很简单,我们直接对这两个端口配置成一个 channel-group,模式是 active 或者 passive。

1

2

interface range e0/0-1

channel-group 22 mode active

现在线路已经完成链路聚合了,我们抓包可以看到,两端都在定期发送 LACPDU,结构长这样子:

LACP 抓包

除了 LACP,还有一个协议支持自动协商链路聚合:PAgP(Port Aggregation Protocol)。这个是思科的专有协议。思科设计很多优秀的协议,很多开放网络协议就是参考了思科的协议而设计的。PAgP 在 1990s 就出现了,LACP 在 2000 才标准化。但是,像链路聚合这种事情,很多场景是运行在多个厂商的设备之间,私有协议很难普及。如今大部分几乎见不到 PAgP 了,思科设备之间运行的一般也是 LACP。

802.3ad 模式近乎完美,数据中心使用的 bonding 模式基本上都是 802.3ad 模式了。我们花了这么篇幅介绍了没有在使用的方案,好像是研究了一些没有用的东西,其实不是。后面我们在介绍 VRRP,HSRP 等更高级的内容的时候,读者会发现,原理还是 ARP,MAC 地址表这些东西,所以这个系列的内容是由简入难,对后面的内容理解是有帮助的。另外,像 MikroTik 这种基于 Linux 的路由器,其内置的链路聚合就是 Linux 的 bonding,所以配置这个路由器就是配置我们熟悉的 bonding,有时候可以灵活运用这些 bonding 模式。

到本文我们有能够自动协商的链路聚合,但是距离「完美」还差一步。我们发现,现在在服务器这儿是高可用了,但无论是链路聚合,还是 LACP 自动协商的链路聚合,都有一个限制——就是两条线必须连接到相同的交换机,这样一来交换机就成了一个单点。在没有链路聚合之前,我们的 bonding 方案 (active-backup, balance-tlb, balance-tlb) 还支持插到多个交换机上呢!需要交换机使用链路聚合的 bonding 模式 (balance-xor, balance-rr, 802.3ad) 只能接到一台交换机上。下篇文章我们来讨论如何解决交换机的单点问题。

Until next time!

参考资料:

数据中心网络高可用技术系列

  1. 数据中心网络高可用技术:序
  2. 数据中心网络高可用技术之从服务器到交换机:active-backup
  3. 数据中心网络高可用技术之从服务器到交换机:balance-tlb 和 balance-alb
  4. 数据中心网络高可用技术之从服务器到交换机:链路聚合 (balance-xor, balance-rr, broadcast)
  5. 数据中心网络高可用技术之从服务器到交换机:802.3 ad
  6. 数据中心网络高可用技术之从交换机到交换机:MLAG, 堆叠技术
  7. 数据中心网络高可用技术之从服务器到网关:VRRP
  8. 数据中心网络高可用技术:ECMP