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

news2024/11/29 2:58:07

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.coloradmin.cn/o/1560096.html

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

相关文章

嵌入式linux学习之opencv交叉编译

1.下载opencv源码 OpenCV官方源码下载链接为https://opencv.org/releases/,选择3.4.16版本下载。放在ubuntu系统~/opencv文件夹中,解压缩,opencv文件夹中新建build和install文件夹用于存放编译文件和安装文件: 2. 安装编译工具…

springboot配置文件application.properties,application.yml/application.yaml

application.properties Springboot提供的一种属性配置方式:application.properties 初始时配置文件中只有一行语句。 启动时,比如tomcat的端口号默认8080,路径默认。如果我们要改变端口号及路径之类的可以在application.properties中配置。…

【C语言环境】Sublime中运行C语言时MinGW环境的安装

要知道,GCC 官网提供的 GCC 编译器是无法直接安装到 Windows 平台上的,如果我们想在 Windows 平台使用 GCC 编译器,可以安装 GCC 的移植版本。 目前适用于 Windows 平台、受欢迎的 GCC 移植版主要有 2 种,分别为 MinGW 和 Cygwin…

【算法竞赛进阶指南】0x11 栈

0x11 栈 基础应用 两个栈维护前面区间的最小元素 41. 包含min函数的栈 - AcWing题库 可以开个小根堆维护最小值,但是这样时间是logN的。如果只用一个变量来存,一旦出现了出栈操作就无从下手了。因此用一个线性结构来保存每个历史时刻的最小值。 开两个…

vue3封装Element分页

配置当前页 配置每页条数 页面改变、每页条数改变都触发回调 封装分页 Pagination.vue <template><el-paginationbackgroundv-bind"$attrs":page-sizes"pageSizes"v-model:current-page"page"v-model:page-size"pageSize":t…

常用字符串函数及模拟实现

1.strlen() 用法:求字符串长度 size_t strlen(const char *Str) 参数:字符串的起始地址,可以传地址也可以直接传一个字符串 返回值:字符串长度 模拟实现: 自己实现求字符串长度的函数(三种方法)-CSDN博客 2.strcpy() 用法:拷贝字符串 char* strcpy(char*_Destination,co…

【PduR路由】IPduM模块详细介绍

目录 1.IpduM功能简介 2.IpduM模块依赖的其他模块 2.1RTE (BSW Scheduler) 2.2PDU Router 2.3COM 3.IpduM功能详解 3.1 功能概述 3.2 I-PDU多路复用I-PDU Multiplexing 3.2.1 Definitions and Layout 3.2.2通用功能描述 General 3.2.3模块初始化 Initialization 3.…

fpga_awb

色温: sesor原始图像中的白色如果不经AWB处理&#xff0c;在高色温(如阴天)下偏蓝&#xff0c;在低色温下偏黄。 引入白平衡算法 而AWB的核心就是调整图像色温&#xff0c;使得摄像头采集的图像更加真实&#xff0c;达到人眼观察的效果。 白平衡一般通过调节传感器输出图像RGB…

CCF-CSP19<2020-06>-第1/2题

202006-1 线性分类器 题目&#xff1a;202006-1 题目分析&#xff1a; 给定n个点&#xff0c;并标记为AB两类&#xff0c;问给定直线是否能将其分为两个点集。 简单数学知识&#xff0c;点在直线上满足axbyc0&#xff0c;点在直线割平面所得的上下其值会正负相反。 AC代码…

信息安全技术基础知识总结

一、信息安全基础知识 信息安全基本要素&#xff1a; 1. 机密性&#xff08;C&#xff09;&#xff1a;确保信息不暴露给未授权的实体或进程 2. 完整性&#xff08;I&#xff09;&#xff1a;只有得到允许的人才能修改数据&#xff0c;并且能够判别出数据是否已被篡改 3. 可用性…

大话设计模式之外观模式

外观模式&#xff08;Facade Pattern&#xff09;是一种软件设计模式&#xff0c;旨在提供一个简单的接口&#xff0c;隐藏系统复杂性&#xff0c;使得客户端能够更容易地使用系统。这种模式属于结构型模式&#xff0c;它通过为多个子系统提供一个统一的接口&#xff0c;简化了…

docker无脑部署zabbix6.0+agent

文章目录 前言一、安装docker-compose二、部署Zabbix Server 6.0agent1.创建父目录2.拉取镜像3.编辑docker-compose.yml文件 二、浏览器访问Zabbix1.url栏输入http://ip/2.修改主机配置 总结 前言 随着监控的不断发展&#xff0c;zabbix这门技术也越来越重要&#xff0c;很多人…

PVE设置显卡直通(二:Linux显卡直通,以及Linux系统下安装cuda库)

PVE设置显卡直通(一:硬件设置) 本文仅记录PVE关于Linux下的显卡直通步骤 例程不过多阐述 ps: 无直通经验的同学,先参阅 PVE设置显卡直通(一:硬件设置),再参阅本博文 参阅完成 PVE设置显卡直通(一:硬件设置)后,直接在PVE面板中添加显卡硬件到自己的主机即可,此文中…

【Java与数学】若不等式x^2-a*x+a<0的解集中恰有3个整数,求a的范围?

【分析】 既然不等式存在解集&#xff0c;说明一元二次方程x^2-a*xa0有解&#xff1b; 解之间横跨三个整数&#xff0c;说明Δ大于0&#xff1b; 三个整数必然是连续的&#xff0c;因为f(x)x^2-a*xa最多只与x轴存在两个交点&#xff0c;这是题设里的隐含条件。 【传统解法】…

C++项目——集群聊天服务器项目(十)点对点聊天业务

本节来实现C集群聊天服务器项目中的点对点聊天业务&#xff0c;一起来试试吧 一、点对点聊天业务 聊天服务器中一个重要的功能就是实现点对点聊天&#xff0c;客户端发送的信息包含聊天业务msgid、自身 的id和姓名、聊天对象的id号以及聊天信息&#xff0c;例如&#xff1a; …

C语言TCP服务器模型 : select + 多线程与双循环单线程阻塞服务器的比较

观察到的实验现象: 启动三个客户端: 使用双循环阻塞服务器:只能accept后等待收发,同时只能与一个客户端建立连接,必须等已连接的客户端多次收发 明确断开后才能与下个客户端连接 使用IO多路复用select:可以同时接收所有的连接请求,并且连接状态一直是存活的,直到客户端关闭连…

离散数学--谓词逻辑之复习与前束范式与谓词演算的推理理论

引子&#xff1a;在命题演算中&#xff0c;常常要化成规范形式&#xff0c;对于谓词的演算&#xff0c;可以化成与他等价的范式&#xff01; 前束范式定义&#xff1a; 一个公式&#xff0c;如果量词均非否定地在全式的开头&#xff0c;它们的作用域延伸到整个公式的末尾&…

八、大模型之Fine-Tuning(1)

1 什么时候需要Fine-Tuning 有私有部署的需求开源模型原生的能力不满足业务需求 2 训练模型利器Hugging Face 官网&#xff08;https://huggingface.co/&#xff09;相当于面向NLP模型的Github基于transformer的开源模型非常全封装了模型、数据集、训练器等&#xff0c;资源…

工作究竟是谁的?

在近两年的就业环境中&#xff0c;普遍存在着挑战与不确定性&#xff0c;许多人追求的是一种稳定的工作和收入来源。在这样的背景下&#xff0c;我们来探讨一个核心问题&#xff1a;工作的归属是谁的&#xff1f; 根据《穷爸爸富爸爸》中提出的ESBI四象限理论&#xff0c;我们可…

【经典算法】LeetCode14:最长公共前缀(Java/C/Python3实现含注释说明)

最长公共前缀 题目思路及实现方式一&#xff1a;横向扫描思路代码实现Java版本C语言版本Python3版本 复杂度分析 方式二&#xff1a;纵向扫描思路代码实现Java版本C语言版本Python3版本 复杂度分析 方式三&#xff1a;分治思路代码实现Java版本C语言版本Python3版本 复杂度分析…