从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.rhkb.cn/news/293366.html

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

相关文章

C#.net8创建webapi,使用SqlSugar,仓储模式,DTO,服务层,控制层的综合应用(企业级)

本文源码地址: https://download.csdn.net/download/u012563853/89036104 源码中,也有详细的注释说明。 代码总览: 这是一个综合性比较强的文章,需要有一定的基础,没有基础的人,看了后,会全面的了解一下,有基础的人,看了后会加强认识,更加的巩固,直接在项目中去应…

自贡市第一人民医院:超融合与 SKS 承载 HIS 等核心业务应用,加速国产化与云原生转型

自贡市第一人民医院始建于 1908 年,现已发展成为集医疗、科研、教学、预防、公共卫生应急处置为一体的三级甲等综合公立医院。医院建有“全国综合医院中医药工作示范单位”等 8 个国家级基地,建成高级卒中中心、胸痛中心等 6 个国家级中心。医院日门诊量…

Docker实现原理

namespaces System V IPC概述 System V引入了三种高级进程间的通信机制:消息队列、共享内寸和信号量 IPC对象(消息队列、共享内存和信号量)存在于内核中而不是文件系统中,由用户控制释放,不像管道的释放由内核控制 IPC对象通过其标识符来引…

后端SpringBoot+Mybatis 查询订单数据库奇怪报错加一

排错过程: 看报错意思是SQL语句存在错误,然后使用图形化工具运行这个SQL语句 其实这里稍微细心想一下就能发现问题,但是当时没深入想,就觉得order表前加了数据库名字影响不大,所以感觉SQL语句是没问题的,然…

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

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

硬件设备对接协议

硬件设备对接协议是指在硬件设备之间进行数据交换时所遵循的一系列规则和标准。这些协议定义了数据的传输方式、数据格式、通信接口等,以确保设备间能够有效地进行通信和数据交换。以下是一些常见的硬件设备对接协议。北京木奇移动技术有限公司,专业的软…

网络基础二补充——json与http协议

五、市面上常用序列化和反序列化工具 ​ 常用的有:json、protobuf、xml三种方案; 5.1json的使用 1.安装jsoncpp库,是一个第三方的开发库文件; sudo yum install -y jsoncpp-devel2.使用json ​ 经常使用的头文件是json.h&…

气膜室内足球馆:价格究竟是多少?

气膜建筑在体育场馆中的应用越来越广泛,而气膜室内足球馆作为其中的一种代表,备受关注。那么,建设气膜室内足球馆到底需要多少投资呢?轻空间就带您一起来了解一下。 气膜室内足球馆的价格因地区、规格和材料等因素而有所不同。具体…

LLM--提示词Propmt的概念、作用及如何设计提示词

文章目录 1. 什么是提示词?2. 提示词的作用3. 如何设计提示词?3.1. 提供详细的信息3.2. 指定角色3.3. 使用分隔符和特殊符号3.4. 提供示例3.5. 少量示例的思维链(COT)模型3.6. 思维树(TOT)模型3.7. 自洽性 …

C++ MFC

C是一种静态数据类型检查的、支持多重编程范式的程序设计语言,支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等泛型程序设计的多种程序设计风格。 MFC(Microsoft Foundation Classes),是一个微软公司提供的类库,以C类的形式封装…

unity学习(74)——服务器Dispose异常

1.返回的1 2 11是怪物初始化,源代码中也没有 2. 3.客户端中的网络连接初始化如下: 4.不是因为超时,设置10s为超时期限后,客户端和服务器有时依然会报错! 5.我感觉就是update中发包给弄坏的! 6.不在“帧”…

本地GPU调用失败问题解决3重新配置anaconda环境(成功)

1、右键“以管理员身份”打开anaconda prompt conda create -n python 3.9 2、使用官方下载源的配置 3、修改conda下载超时 conda config --set remote_connect_timeout_secs 60 conda config --set remote_read_timeout_secs 100 查看配置结果conda config --show 配置内…

快速排序---算法

1、算法概念 快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的数据均比另一部分的数据小,则可分别对这两部分记录继续进行排序,以达到震哥哥序列有序。 快速排序的最坏运行情况是O(),比如说顺序数…

蓝桥备赛——贪心

题干 AC Code n, w = map(int, input().split()) # n种类, w核载重 a = [] # [[weight1, value1], [weight2, value2], ...] for _ in range(n):a.append(list(map(int, input().split()))) a.sort(key=lambda x: x[1] / x[0], reverse=True)maxVal = 0for i in a:if i[0…

原生js实现循环滚动效果

原生js实现如下图循环滚动效果 核心代码 <div class"scroll"><div class"blist" id"scrollContainer"><div class"bitem"></div>......<div class"bitem"></div></div> </di…

ViveNAS性能调试笔记(一)

ViveNAS是一个开源的NAS文件服务软件&#xff0c;有一套独立自创的架构&#xff0c;ViveNAS希望能做到下面的目标&#xff1a; - 能支持混合使用高性能的介质(NVMe SSD)和低性能介质&#xff08;HDD&#xff0c;甚至磁带&#xff09;。做到性能、成本动态均衡。因此ViveNAS使用…

数据结构八大常见的排序

数据结构八大常见的排序 常见排序算法分类1.插入排序2.希尔排序(缩小增量排序)3.选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序归并排序非递归的实现8.计数排序 常见排序算法分类 1.插入排序 基本思想&#xff1a;把待排序的数组按大小逐个插入到一个已经排好序的有序序列中…

民航电子数据库:CAEMigrator迁移数据库时总是卡死

目录 一、场景二、异常情况三、排查四、应急方案 一、场景 1、对接民航电子数据库 2、将mysql数据库迁移到cae数据库 3、使用CAEMigrator迁移工具进行数据库迁移时&#xff0c;该工具会卡死&#xff08;不清楚是否是部署cae服务的服务器资源导致&#xff09; 二、异常情况 …

大数据技术之 Apache Doris(一)

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