写点什么

SD-WAN 和专线混合组网中的高可用设计(二)

  • 2019-12-20
  • 本文字数:3556 字

    阅读完需:约 12 分钟

SD-WAN 和专线混合组网中的高可用设计(二)

方法 1:AWS CLI 获取 DX 状态

具体的操作,是在 AWS 区域内监控 Direct Connect 上 的设备的 BGP 状态,正常情况下是 up 状态,如果状态异常,则启动路由表的切换,将子网的流量引导到 vCPE 上。这样整个子网就能通过 vCPE,通过 Internet 网关访问到其他站点或者本地数据中心。当 Direct Connect 的线路状态恢复正常后,线路又能自动切换回来,充分利用专线的稳定性优势,并且整个切换过程全程不需要人工介入


此架构图依然是基于云网通提供的 SDWAN 网络进行的测试,并且以下脚本主要在 AWS 北京区域进行测试,其他区域操作也类似。

创建 IAM 策略和角色

IAM 是负责 AWS 上的权限和用户管理的,我们需要先创建一个 IAM 策略,以便让 EC2 实例有后续执行脚本的一些权限。


  1. 进入 AWS 管理控制台,搜索 IAM 服务,点击策略选项,并点击创建策略按钮。

  2. 点击 JSON 按钮,贴入如下的 JSON 代码,并且点击查看策略


Bash


{    "Version": "2012-10-17",    "Statement": [        {            "Sid": "VisualEditor0",            "Effect": "Allow",            "Action": [                "ec2:ReplaceRouteTableAssociation",                "ec2:DescribeInstances",                "ec2:DescribeTags",                "ec2:DeleteRoute",                "ec2:CreateRouteTable",                "ec2:DisassociateRouteTable",                "ec2:ReplaceRoute",                "ec2:DeleteRouteTable",                "ec2:AssociateRouteTable",                "directconnect:DescribeVirtualInterfaces",                "ec2:DescribeVpcs",                "ec2:CreateRoute",                "ec2:DescribeRouteTables"            ],            "Resource": "*"        }    ]}
复制代码


  1. 输入一个策略名字,然后点击创建策略

  2. 回到 IAM 控制台,点击角色,点击创建角色按钮。

  3. 选择将使用此角色的服务处,选择 EC2,然后点击下一步

  4. 搜索刚刚创建的策略名,打上勾,选择下一步。

  5. 为该角色填写一个名称,然后点击创建角色

到 EC2 中关联该角色

您可以创建一个小型的实例,关联该角色,来做监控,也可以将 vCPE 关联该角色来做监控(但一般厂家不会开放 vCPE 的 Root 权限给用户)。如下图所示,选择实例后,点击操作 -> 实例设置 -> 附加/替换 IAM 角色,并且选取之前在 IAM 中创建的角色即可。


两个路由表

我们需要在主线路和备用线路两种状态创建不同的路由表,这样我们在做路由切换的时候不需要在同一张路由表上频繁更改路由,我们只需要将子网切换一下路由表的关联关系即可。


如下图所示,分别创建了两个路由表 sdwan-rt-client-through-dx 和 sdwan-rt-client-through-vcpe,分别代表在主线路可用情况下走专线,在备线路启动的情况下走 SDWAN 网络。


走 SDWAN 的路由表



走 Direct Connect 专线的路由表


修改 EC2 实例的标签

我们需要在 EC2 实例上面添加如下的标签,脚本会读取这些标签的信息来做监控和故障转移。我们随时可以更改这些标签上的数值,类似环境变量,而无需去更改代码本身。


其中 DXVIF_ID 是 Direct Connect Private Vif 的 ID 信息,也是我们需要监控的线路。


RTIDDX 是在上一步创建的路由表 sdwan-rt-client-through-dx 所拥有的 ID 值。


RTIDSDWAN 是在上一步创建的路由表 sdwan-rt-client-through-vcpe 所拥有的 ID 值。


SUBNET_ID 是我们需要切换的业务的子网。


监控脚本代码

以下代码主要是基于 AWS CLI 来获取 AWS 的资源信息和状态信息,并且通过 –filters–query 参数进行内容过滤和筛选。


将如下代码保存到 EC2 中,命名为 sdwan-ha.sh


Bash


#!/bin/bash#This is a script to failover between DX connection and SDWAN#Make sure you have already create 2 routing tables and name the tags on the vCPE##Author: Teague Xiao#Modification Date: 2019-11-19######################################## Define the regionREGION=cn-north-1#REGION=`aws ec2 describe-instances --query 'Reservations[*].{REGION:Instances[0].Placement.AvailabilityZone}' --output text | sed 's/.$//'| head -n 1`
# Define other variables by reading the tag info DXVIF_ID=`aws ec2 describe-tags --region $REGION --filters Name=key,Values=DXVIF_ID --query 'Tags[*].{ID:Value}' --output text`RT_ID_DX=`aws ec2 describe-tags --region $REGION --filters Name=key,Values=RT_ID_DX --query 'Tags[*].{ID:Value}' --output text`RT_ID_SDWAN=`aws ec2 describe-tags --region $REGION --filters Name=key,Values=RT_ID_SDWAN --query 'Tags[*].{ID:Value}' --output text`SUBNET_ID=`aws ec2 describe-tags --region $REGION --filters Name=key,Values=SUBNET_ID --query 'Tags[*].{ID:Value}' --output text`
#Fixed VariableRT_ASSOCIATE_ID=INITHA_STATUS=DX
echo `date` "-- Starting HA Monitor"
while [ . ]; do
BGPSTATUS=`aws directconnect describe-virtual-interfaces --virtual-interface-id $DXVIF_ID --region $REGION --query 'virtualInterfaces[*].{STATUS:bgpPeers[0].bgpStatus}' --output text` if [ "$BGPSTATUS" == "up" ] && [ "$HA_STATUS" == "SDWAN" ]; then echo `date` "-- Direct Conect Back online, switching to DX" RT_ASSOCIATE_ID=`aws ec2 describe-route-tables --region cn-north-1 \ --filters "Name= association.subnet-id,Values=$SUBNET_ID" \ --query 'RouteTables[*].{RTBASSOID:Associations[0].RouteTableAssociationId}' \ --output text`
sleep 5 #Replcaing Route Table /usr/bin/aws ec2 replace-route-table-association --route-table-id $RT_ID_DX --association-id $RT_ASSOCIATE_ID --region $REGION
HA_STATUS=DX continue fi
if [ "$BGPSTATUS" == "down" ] && [ "$HA_STATUS" == "DX" ]; then echo `date` "-- Direct Conect failure, switching to SD-WAN"
#Replcaing Route Table RT_ASSOCIATE_ID=`aws ec2 describe-route-tables --region cn-north-1 \ --filters "Name= association.subnet-id,Values=$SUBNET_ID" \ --query 'RouteTables[*].{RTBASSOID:Associations[0].RouteTableAssociationId}' \ --output text`
sleep 5 /usr/bin/aws ec2 replace-route-table-association --route-table-id $RT_ID_SDWAN --association-id $RT_ASSOCIATE_ID --region $REGION
HA_STATUS=SDWAN
fi
echo `date` "-- Nothing goes wrong, keep monitoring" sleep 2
sleep 10done
复制代码


赋予脚本可执行权限


Bash


sudo chmod +x sdwan-ha.sh
复制代码


执行该脚本


Bash


./sdwan-ha.sh
复制代码


后续也可以将脚本加入到 /etc/rc.local 中开机自动执行。

高可用测试

下面,我们会来模拟一下 Direct Connect 专线出现故障的时候,如何进行线路的自动切换的。


我们打开脚本,正常情况下,脚本会自动监控专线的 BGP 状态。



接着,我们到 SDWAN 控制器上关闭专线。



控制器会切段 BGP 的路由器,并且让其下线。稍等片刻,我们可以到控制台上看到专线的状态。



同一时间,我们观察脚本的运行状态,也会发现,线路自动切换了。我们到子网中也能看到,现在子网会关联一个新的路由表,将子网的所有流量都转发到 vCPE 中去,不走专线的网络。



此时,我们回到 SDWAN 控制器,恢复 Direct Connect 专线的状态。



几分钟后,控制台的专线状态会变回 UP 的状态,并且脚本也实时自动进行切换。



优劣分析

在上面实验所涉及的环境,是将脚本部署在 EC2 上,其实最理想的情况是将脚本部署在厂家的 SDWAN vCPE 上做无缝的集成,这样对用户是透明的。另外的话,也可以尝试使用 AWS 的无服务计算 Lambda 函数来做这个监控脚本。我们可以创建一个基于 Python 的函数,每一分钟运行一次,来监控 BGP 状态,并且决定是否切换线路。


另外,我们也可以在脚本中添加 SNS 组件,如果出现线路切换就发送邮件或者短信告知管理员,这样管理员能第一时间知道线路的健康状态。


本次线路的切换过程中,从线路物理状态更新到 BGP 状态更新需要几分钟(一般是 3-5 分钟左右),如果想修改这个时间,可以通过修改 BGP 设备 CE 端的 BFD (Bidirectional Forwarding Detection) 参数来修改。默认情况下,BGP 每 30 秒会发送一个 Keepalive 包,如果有连续 3 个 Keepalive 包没有送达的话,BGP 状态才会更改。我们可以将默认的 30 秒改为 300 毫秒,来进行路由更快地切换。但是如果值设置太小,很容易在线路抖动的情况下频繁进行路由切换。具体如何设置 BFD,可以查看这个链接


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/highly-available-design-snares-in-sd-wan-and-private-line-hybrid-networks/


2019-12-20 14:22745

评论

发布
暂无评论
发现更多内容

个推TechDay直播预告 | 6月22日,开启大数据降本提效的破局之道!

个推

大数据 分布式计算 分布式存储 标签

大数据系统包含哪些组件?需要过等保吗?

行云管家

大数据 数据 过等保

uni-app进阶之Weex/nvue【day6】

恒山其若陋兮

6月月更

如何使用物联网低代码平台进行数据分析?

AIRIOT

物联网 低代码开发

多年亿级流量下的高并发经验总结,我毫无保留的写在了这本书中

冰河

并发编程 多线程 高并发 异步编程 6月月更

web前端培训如何提高React界面性能

@零度

前端开发 React

特定MPC问题包含哪些常见技术,有什么作用,什么场景需要用到?

Jessica@数牍

隐私计算 安全多方计算 特定mpc问题

为什么不建议你用 MongoDB 这类产品替代时序数据库?

TDengine

数据库 tdengine 时序数据库

基于深度学习的水冷工作站加速遥感测绘应用研发

GPU算力

阿里云CIPU下笔惊雷,方寸间书写中国算力故事

脑极体

帮助中心应该怎样设计?

小炮

探索质量外延 - 质量安全故事

QualityFocus

质量管理 软件质量与安全

易观分析《计算机视觉市场研究,2022》研究报告正式启动

易观分析

人工智能

转转统一权限系统的设计与实现(前端实现篇)

转转技术团队

前端开发 umijs 权限设计

2023年广州美博会-2023年春季广州美博会

Geek_0b38bb

美博会 2023年广州美博会 春季广州美博会 3月份广州美博会

ABAP-调用WebService服务

桥下本有油菜花

abap

JDK8 HashMap如何实现?

源字节1号

软件开发

Neat Syntax Design of an ETL Language (Part 1)

Bright

数据开发 ETL 大数据开发 EasySQL

人才一站式服务平台开发,高层次人才管理系统

a13823115807

技能速成!教你10分钟内在电脑上配置运行Hive Metastore和Presto

Alluxio

presto 技能 Alluxio hive metastore 初学者

Javascript API自动代码生成需求征集

百家饭隐私计算平台创业者

JavaScript OpenAPI axios

Vue-12-条件渲染(可重复元素)

Python研究所

6月月更

java程序员培训 | 10年后程序员的薪资会怎么样

@零度

JAVA开发

InfoQ 极客传媒 15 周年庆征文|跨平台应用开发进阶(二十二) :uni-app Android APP上线准备工作汇总

No Silver Bullet

前端 签名 安全检测 6月月更 InfoQ极客传媒15周年庆

Mysql数据库查询好慢,除了索引,还能因为什么?

C++后台开发

MySQL 数据库 中间件 后端开发 C++后台开发

华为云携手鸿蒙,培养创新型开发者

华为云开发者联盟

云计算 鸿蒙 华为云

个推CTO趣谈元宇宙:从概念、成因到核心技术

个推

数据智能 元宇宙

时序数据是如何被压缩的?具体有哪些可选择的压缩算法?

TDengine

数据库 tdengine 时序数据库

云堡垒机单机部署的优缺点讲解-行云管家

行云管家

网络安全 堡垒机 云堡垒机 堡垒机部署

科创人·酷渲科技创始人华少:用双赢思维做产品、连生态,实现规模化发展

科创人

java就业培训 | 面试官如何判断应聘者能力的,这一篇就够了

@零度

JAVA开发

SD-WAN 和专线混合组网中的高可用设计(二)_文化 & 方法_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章