从vrrp、bfd、keepalived到openflow多控制器--理论篇

vrrp

在一个网络中,通常会使用vrrp技术来实现网关的高可用。
vrrp,即Virtual Router Redundancy Protocol,虚拟路由冗余协议。

应用场景

典型的如下面这个例子:
vrrp

当Router故障后,将会导致HostA-C都无法连接外部的Internet。

而引入VRRP技术后则可以解决Router单点故障问题,引入VRRP技术后的拓扑如下:
vrrp-router

当某一路由器再次出现故障时,其对应的Backup路由器将承担起原网关的功能。
主机和网关进行通信时使用虚拟路由器的vip(虚拟ip)和vmac(虚拟mac)进行通信。

在VRRP中需要关注的点有:

  1. VRRP使用虚拟ip和虚拟mac实现
  2. VRRP报文只有一种报文且使用组播发送,为advertisement报文
  3. VRRP节点间使用定时机制选举出Master节点
  4. VRRP中有两个定时器,分别为:
    1. ADVER_INTERVAL定时器,由Master节点定时发送,默认周期为1秒
    2. MASTER_DOWN定时器,运行在Backup节点负责监听Master节点是否超时,其周期为计算公式为:
      • MASTER_DOWN = (3*ADVER_INTERVAL)+Skew_time(偏移时间),
      • Skew_time=(256-Priority)/256
  5. 节点成为Master节点后会主动发送免费ARP广播通告到它所连的设备和主机,以更新设备和主机的ARP表

bfd

通过上面的介绍我们了解到:在vrrp中故障监测周期为秒级,如要达到更快速的监测周期可以使用bfd机制一起实现。

BFD(Bidirectional Forwarding Detection,双向转发检测),可实现毫秒级监测,数据包使用UDP实现。

BFD包协议如下:
bfd-packet

BFD的会话建立机制分为静态建立与动态建立。
bfd-static
bfd-dynamic

bfd检测模式
BFD检测模式分为两种:

  1. 异步模式
  2. 查询模式
    bfd-asyn

bfd-query

一般使用异步模式,如需要监测的设备较多担心且不怎么要求时效性,就也可以考虑使用查询模式。

bfd单臂回声
bfd单臂回声也就是bfd中的echo功能。主要应用场景为:两个直连的设备中,仅一台支持bfd功能。
bfd-echo

这种情况下要实现两台设备间的故障监测,由支持BFD的设备发起回声请求,不支持BFD的设备收到该报文后直接进行回包。

bfd的应用场景有很多,在ospf节点、静态路由、VRRP等场景中得到了广泛的应用。

BFD包占用字节量较小,一般为几十个字节,通信时使用udp包进行传输。RFC规定,单跳检测时,目的端口为3784。多跳检测时,目的端口为4784。

keepalived

通过前文的了解,我们知道了vrrp可以实现节点的冗余备份,再配合bfd可实现毫秒级的故障检测。
总结来说vrrp+bfd是一个实用性很强的技术方案,其使用虚拟ip和虚拟mac这种思想来实现高可用(HA)是十分有用的。

凭借vrrp+bfd强大的特点,许多大牛也将其运用到软件上,其中最具代表的非keepalived莫属。
keepalived

如keepalived官网所述那样,keepalived是一款实现了vrrp和bfd的路由软件,在负载均衡(loadbalancing )和高可用(high-availability)场景得到了广泛的应用,而且还开源,github上的星星和活跃度也挺不错的。

应用场景

keepalived实现HA的核心之一仍是VRRP,实现了虚拟ip在主备节点中的漂移。以keepalived实现软件高可用的场景非常多,比较经典的有keepalived+nginx、keepalived+mysql、keepalived+redis。

keepalived+mysql
在mysql的高可用场景中,mysql客户端直接使用keepalived的VIP地址连接mysqlServer。mysql节点间使用mysql自带的副本机制实现数据的同步,当某个节点出现故障后,mysql客户端便可实现mysql的连接自动转移。
keepalived-mysql

这里需要注意的是:在mysql的连接中,client与server使用的是tcp长连接,一个连接由4元组(4-tuple)构成,即源IP地址、目的IP地址、源端口、目的端口。client端与server端断连后tcp连接也需要进行重连,使用keepalived实现mysql长连上则需要确保配置了mysql的自动重连,即url参数中的:

autoReconnect=true

或者使用mysql的数据库连接池间接与数据库进行连接。

keepalived+nginx
keepalived的另一个应用非常多的场景非keepalived+nginx莫属。

keepalived-nginx

如上图所示,在两个nginx间配置keepalived,用户流量最终通过vip访问到nginx(一般会配置一个LVS,流量让LVS转发到vip),vip在两个nginx间漂移且始终位于nginx的master节点。详细配置方式这里不做展开,此方案也非常成熟网上的资料也很多。

openflow交换机

通过上文我们了解到了在路由设备和软件设备间可以使用vrrp、bfd、keepalived实现HA。接下来再来了解下openflow交换机和控制器实现HA的一些知识。

openflow交换机——即实现了openflow协议的交换机,如实现了openflow协议的ovs交换机。

openflow1.5.1协议文档:http://sdn.ifmo.ru/Members/shkrebets/sdn_4115/sdn-library/openflow-switch-v1.5.1.pdf/view

会话建立过程

直接看一下openflow交换机与控制器建立连接的过程。

我们知道,openflow交换机与控制器的通信好比是一个client/server通信,这个过程免不了会话(session)的建立。

这个过程在openflow协议中可找到对应的描述,描述片段如下:

When an OpenFlow connection is first established, each side of the connection must immediately send
an OFPT_HELLO message with the version field set to the highest OpenFlow switch protocol version
supported by the sender

After the switch and the controller have exchanged OFPT_HELLO messages and successfully negotiated
a common version number, the connection setup is done and standard OpenFlow messages can be
exchanged over the connection. One of the first things that the controller should do is to send a
OFPT_FEATURES_REQUEST message to get the Datapath ID of the switch

上述内容转换为下图:
openflow-session

主要为在tcp(6653或6633端口)建连后相互发送OFPT_HELLO包,之后再由控制器向交换机发送OFPT_FEATURES_REQUEST包以获得交换机ID等信息。

Multiple Controllers

在协议文档中的OpenFlow Channel and Control Channel部分可以找到如下描述:

The OpenFlow channel is the interface that connects each OpenFlow Logical Switch to an OpenFlow
controller. Through this interface, the controller configures and manages the switch, receives events
from the switch, and sends packets out the switch. The Control Channel of the switch may support
a single OpenFlow channel with a single controller, or multiple OpenFlow channels enabling multiple
controllers to share management of the switch.

openflow channel是openflow交换机与控制器的通信接口,交换机的控制通道(control channel)支持只和一个交换机的一个通道连接,也支持多个通道实现交换机的多控制器多交换机连接。

协议文档中描述的Multiple Controllers即为openflow交换机连接多个控制器的场景。使用这种方式可以实现交换机和控制器间的高可用,如某台控制器down掉后其他存活的控制器仍然可以操作openflow交换机。

为了避免脑裂问题,一台交换机与控制器的关系有一个角色的概念,即ROLE。
根据openflow协议的描述,交换机与控制器的角色有以下几种类型:

  • Equal,对等关系,意味着控制器可以完全访问交换机,并和其他拥有Equal角色的控制器为平等关系;可接收来自交换机的所有异步消息,如pktIn、flow-removed消息;
  • Master,主节点关系,在访问控制权限部分和Equal一样都具有完全访问权限,不同在于:一个交换机仅有一个Master角色
  • Slave,副节点关系,仅具有对交换机的可读权限,不能向交换机下发消息,如flowMod、packetOut。此种模式下的控制器仅接收交换机的Port-status消息,其他诸如pkt-in、flow-removed之类的异步消息都不会被接收到。

此部分更为详尽的说明也可查看openflow协议的官方文档。部分内容截图片段如下:
openflow-role

Auxiliary Connections

在openflow协议的1.3版本以后新增了Auxiliary Connections的功能。

协议描述信息如下:

In previous versions of the specification, the channel between the switch and the controller is exclusively
made of a single TCP connection, which did not allow the exploitation of the parallelism available in most
switch implementations. OpenFlow 1.3 enables a switch to create auxiliary connections to supplement
the main connection between the switch and the controller (EXT-114). Auxiliary connections are mostly
useful to carry packet-in and packet-out messages.

  • Enable switch to create auxiliary connections to the controller.
  • Enable switch to create auxiliary connections to the controller.
  • Mandate that auxiliary connection can not exist when main connection is not alive.
  • Add auxiliary-id to the protocol to disambiguate the type of connection.
  • Enable auxiliary connection over UDP and DTLS.

openflow交换机除了和控制器保持单连接外,还可与多个控制器连接实现辅助控制。使用多控制器控制同一个交换机在一定条件下可以提高处理性能,也让多控制器的并性执行得到最大限度的发挥。

关于openflow交换机连接辅助控制器的示例可参考此链接:
https://github.com/mininet/mininet/blob/master/examples/controllers.py

参考:
http://sdn.ifmo.ru/Members/shkrebets/sdn_4115/sdn-library/openflow-switch-v1.5.1.pdf/view

https://github.com/opennetworkinglab/onos/blob/master/tools/dev/mininet/examples/multicluster.py

https://mp.weixin.qq.com/s/c6deR_QKIZmZbXj17q2sMA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/784811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶杂谈

在2024年的今天,自动驾驶技术已经迈向了一个崭新的阶段,日趋成熟与先进。昨日,我有幸亲眼目睹了自动驾驶车辆在道路上自如行驶的场景。然而,在市区拥堵的路段中,自动驾驶车辆显得有些力不从心,它们时而疾驰…

Spring Boot集成JPA快速入门demo

1.JPA介绍 JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink&am…

C#调用FreeSpire.Office读取word数据的基本用法

FreeSpire.Office是Spire.Office的免费版本,后者支持全面、复杂的office文件操作功能,包括文件格式转换、文档操作、文档打印等,详细介绍见下图及参考文献1。本文学习FreeSpire.Office的基本用法并用其获取word文档的基本信息。   新建Win…

VTK中polydata的属性数据结构表示和用法

vtk中通过vtkDataArray进行数据的存储,通过vtkDataObject进行可视化数据的表达,在vtkDataObject内部有一个vtkFieldData的实例,负责对数据的表达: ​​​​​​​ vtkFieldData存储数据的属性数据,该数据是对拓…

《福建教育》期刊简介及投稿要求

《福建教育》期刊简介及投稿要求 《福建教育》国内外公开发行的学术期刊,目前出版文献量达19187篇;总下载次数: 1361672次;总被引次数: 8709次 《福建教育》是福建省教育厅主管的唯一一份主流教育专业期刊&#xff0…

【嵌入式智能产品开发实战】(十二)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的安装运行】

目录 程序的安装 程序安装的本质 在Linux下制作软件安装包 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正&#xf…

MybatisPlus速成

MybatisPlus快速入门 快速入门入门案例常见注解常见配置 核心功能条件构造器自定义SQLService接口 扩展功能代码生成静态工具逻辑删除枚举处理器JSON处理器 插件功能分页插件通用分页实体 参考文档 mybatis-plus参考文档 全部资料链接 讲义 快速入门 入门案例 <dependency…

骑行不将就,坐垫要讲究!跟维乐来一场骑美合一的美学旅行~

想象一下&#xff0c;你胯下的坐垫不再是冷冰冰的硬疙瘩&#xff0c;而是化身为“骑行界的舒适艺术家”。美学坐垫宛如马鞍上的微型沙发&#xff0c;采用美学与人体工学的跨界联姻&#xff0c;不仅赏心悦目&#xff0c;更能温柔拥抱你的臀部。它那精妙的曲线设计&#xff0c;仿…

AI大模型在金融行业的应用场景和落地路径

作者&#xff1a;林建明 来源&#xff1a;IT阅读排行榜 本文摘编自《AIGC重塑金融&#xff1a;AI大模型驱动的金融变革与实践》&#xff0c;机械工业出版社出版这是最好的时代&#xff0c;也是最坏的时代。尽管大模型技术在金融领域具有巨大的应用潜力&#xff0c;但其应用也面…

基于两个单片机串行通信的电子密码锁设计

1.功能 电子号码锁在实际应用中应该有两部分&#xff0c;一部分在外部&#xff0c;有键盘部分和密码显示&#xff1b;另一部分内部&#xff0c;设置密码、显示密码。使用单片机自身带有的串口可以很方便的实现单片机之间的通信&#xff0c;使输入的密码值传送到主机检验是否是…

ctf题目

目录 1.文件包含的一道题目&#xff0c;没什么难度&#xff0c; 2.一道sql注入的题目&#xff0c;伪静态 3.限制只能本地访问。 1.文件包含的一道题目&#xff0c;没什么难度&#xff0c; 但是一个点就是它这里去包含的那个文件名就是flag&#xff0c;而不是flag.php也不是f…

数据库---------完全备份和增量备份的数据恢复,以及断点恢复

目录 一、在数据库表中&#xff0c;分三次录入学生考试成绩 1.1先创建库&#xff0c;创建表&#xff0c;完成三次数据的录入 1.2首次录入成绩后&#xff0c;做该表的完全备份 1.3第二次插入后 做增量备份 1.4第三次插入后 做增量备份 二、模拟数据丢失&#xff0c;并使用…

小练习——java中循环语句打印乘法口诀表

正向乘法表 for (int i 1; i<9; i) {for (int j 1; j < i; j) {System.out.print(j "X" i "" (i * j) "\t");}System.out.println();}代码结果&#xff1a; 打印反向乘法表 for (int i 9; i > 1; i--) {for (int j 1; j <…

大数据技术之 Apache Doris(一)

第 1 章 Doris 简介 1.1 Doris 概述 Apache Doris 由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018 年贡献到 Apache 社区后&#xff0c;更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过 200 个产品线在使用&#xff0c;部署机器超过 10…

机器学习周报第35期

目录 一、文献阅读&#xff1a;You Only Look Once: Unified, Real-Time Object Detection1.1 摘要1.2 背景1.3 论文模型1.4 网络设计1.5 YOLO的局限性1.6 实现代码 target 7*7*30 值域为0-1 一、文献阅读&#xff1a;You Only Look Once: Unified, Real-Time Object Detection…

从0开始搭建基于VUE的前端项目(三) Vuex的使用与配置

准备与版本 vuex 3.6.2(https://v3.vuex.vuejs.org/zh/)概念 vuex是什么? 是用作 【状态管理】的 流程图如下 state 数据状态,成员是个对象 mapState 组件使用this.$store.state.xxx获取state里面的数据 getters 成员是个函数,方便获取state里面的数据,也可以加工数据 ma…

LC 106.从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a; inorder [9,3,15,20,7], post…

个人主页导航源码

源码简介 个人主页导航源码&#xff0c;个人主页导航源码&#xff0c;一款带后台的个人导航主页源码。 搭建环境 PHP 5.2 Nginx Mysql5.6 安装教程 1.上传源码压缩包到网站目录并解压 2.访问网站域名安装提示进行安装即可 后台路径为&#xff1a;https://域名/admin/ …

ngrok 内网穿透使用

title: ngrok 内网穿透使用 search: 2024-02-29 文章目录 背景Windows安装ngrok指令授权ngrok个人用户Authtoken穿透 http 或 https 服务ngrok的代理http指令ngrok获得静态域名指令ngrok的代理ssh指令 背景 这次寒假回家&#xff0c;很无奈&#xff0c;很多东西放在项目组服务…

Vue2(十一):脚手架配置代理、github案例、插槽

一、脚手架配置代理 1.回顾常用的ajax发送方式&#xff1a; &#xff08;1&#xff09;xhr 比较麻烦&#xff0c;不常用 &#xff08;2&#xff09;jQuery 核心是封装dom操作&#xff0c;所以也不常用 &#xff08;3&#xff09;axios 优势&#xff1a;体积小、是promis…