p4实现负载均衡

news2024/7/6 20:06:24

实验要求

  • 基于简单版本的等成本多路径转发实现一种负载平衡。
  • 实现的交换机将使用两个表将数据包随机转发到两个目标主机之一
  • 第一个表将使用哈希函数(应用于由源和目标IP地址、IP协议以及源和目标TCP端口组成的5元组)来选择两个主机中的一个
  • 第二个表将使用计算的哈希值将数据包转发到所选主机

拓扑采用三角形拓扑结构,三个交换机互相连接,并各自接一个主机

实验内容

Step1:对照实验

首先,把不完全的p4交换机的mininet试运行一下,打开三个主机终端,我让h1发送信息到h2上,原来官方提供的我跑不了,所以随便补充了一个表上去,我反复使用了多次send,发现只能发送到h2上,说明负载不均衡

 

Step2:设计包头解析器,还有丢弃操作

parser MyParser(packet_in packet,
                out headers hdr,
                inout metadata meta,
                inout standard_metadata_t standard_metadata) {
    state start {
        transition parse_ethernet;
    }
    state parse_ethernet {
        packet.extract(hdr.ethernet);
        transition select(hdr.ethernet.etherType) {
            0x800: parse_ipv4;
            default: accept;
        }
    }
    state parse_ipv4 {
        packet.extract(hdr.ipv4);
        transition select(hdr.ipv4.protocol) {
            6: parse_tcp;
            default: accept;
        }
    }
    state parse_tcp {
        packet.extract(hdr.tcp);
        transition accept;
    }
}
 action drop() {
        mark_to_drop(standard_metadata);
    }

Step3:设计控制流

在这里它通过了一个表来指定下一跳的位置,可以看到,

  • 不再用的是ipv4_forward的action了,而是使用了set_nhop的操作
  • 这个操作根据哈希的结果指定下一条要去哪,哈希的算法在set_ecmp_select中设置
  • 根据目的地址来进行hash,hash之后目的地址就不一定是原来的了
  • 当这个包是ipv4包,而且这个包的是没有超过最大跳数的(ttl>0)就应用两个table
control MyIngress(inout headers hdr,
                  inout metadata meta,
                  inout standard_metadata_t standard_metadata) {

    action drop() {
        mark_to_drop(standard_metadata);
    }
    action set_ecmp_select(bit<16> ecmp_base, bit<32> ecmp_count) {
        /* TODO: hash on 5-tuple and save the hash result in meta.ecmp_select
           so that the ecmp_nhop table can use it to make a forwarding decision accordingly */
        hash(meta.ecmp_select,
            HashAlgorithm.crc16,
            ecmp_base,
            { hdr.ipv4.srcAddr,
              hdr.ipv4.dstAddr,
              hdr.ipv4.protocol,
              hdr.tcp.srcPort,
              hdr.tcp.dstPort },
            ecmp_count);
    }
    action set_nhop(bit<48> nhop_dmac, bit<32> nhop_ipv4, bit<9> port) {
        hdr.ethernet.dstAddr = nhop_dmac;
        hdr.ipv4.dstAddr = nhop_ipv4;
        standard_metadata.egress_spec = port;
        hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
    }
    table ecmp_group {
        key = {
            hdr.ipv4.dstAddr: lpm;
        }
        actions = {
            drop;
            set_ecmp_select;
        }
        size = 1024;
    }
    table ecmp_nhop {
        key = {
            meta.ecmp_select: exact;
        }
        actions = {
            drop;
            set_nhop;
        }
        size = 2;
    }
    apply {
        /* TODO: apply ecmp_group table and ecmp_nhop table if IPv4 header is
         * valid and TTL hasn't reached zero
         */
        if(hdr.ipv4.isValid()&&hdr.ipv4.ttl>0){
            ecmp_group.apply();
            ecmp_nhop.apply();
        }
    }
}

Step4:实验

同时开启三个终端,当我的h1 ./send.py 10.0.0.1 "lcz is coming"时,发现h2和h3都有可能会收到,说明负载被均衡了,这里可以看到,10.0.0.1并不是这里任何一个主机的地址,这个目的地址被哈希掉了成为了h2或h3地址的某一个

 我使用抓包工具验证一下,我同时开了s1-eth1 s2-eth1 s3-eth1来抓包,我发送了8个数据包,可以看到,中间抓包工具在s1-eth1抓到了8个包,目的地址是10.0.0.1,但是从它们出去以后,抵达了目的网段的时候,目的地址就是各自的h2或h3了,这是因为被哈希了

 

 小结

  • 这样的发包模式是基于哈希的,也就是发的包不是一直连续的
  • 假设一个场景(是我的毕设),有个应用要上传一段视频,这段UDP包,要分布式发往不同的服务器做应用处理最后把结果汇聚到源地址上,如果一条路径上包不连续,就没有任何意义,因为服务器根本处理不了断断续续的内容
  • 如果我想实现,一个端口发连续的30%的包,然后紧接着另一个端口发连续的50%的包,然后紧接着再来一个端口发20%的包,要怎么做?也就是按比例划分而不是概率划分
  • 我的想法是p4设置一个表,这个表执行一个匹配操作,如果包头的值在0-20%在20%-70%在70%100会分别发往不同的服务器,但是控制面的实时配置工作以及如何匹配我还不是很了解,需要再多多学习!

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

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

相关文章

gnn神经网络是什么,gnn神经网络代码

1、gnn什么意思? 指图形神经网络。 生物神经网络主要是指人脑的神经网络&#xff0c;它是人工神经网络的技术原型。人脑是人类思维的物质基础&#xff0c;思维的功能定位在大脑皮层&#xff0c;后者含有大约10^11个神经元。 每个神经元又通过神经突触与大约103个其它神经元…

永磁同步电机(PMSM)磁场定向控制(FOC)及Matlab/Simulink仿真分析

文章目录前言一、FOC的基本原理二、坐标变换2.1.Clark坐标变换2.2.Park坐标变换三、永磁同步电机在同步旋转坐标系下的数学模型四、永磁同步电机磁场定向控制Matlab/Simulink仿真分析4.1.电压开环控制4.1.1.仿真电路分析4.1.2.仿真结果分析4.2.电流闭环控制4.2.1.仿真电路分析4…

两个月吃透阿里P9推荐260页SpringBoot2企业应用实战pdf入职定P6+

前言 都说程序员工资高、待遇好&#xff0c; 2022 金九银十到了&#xff0c;你的小目标是 30K、40K&#xff0c;还是 16薪的 20K&#xff1f;作为一名 Java 开发工程师&#xff0c;当能力可以满足公司业务需求时&#xff0c;拿到超预期的 Offer 并不算难。然而&#xff0c;提升…

Ansys Zemax | 使用OpticStudio进行闪光激光雷达系统建模(下)

在消费类电子产品领域&#xff0c;工程师可利用激光雷达实现众多功能&#xff0c;如面部识别和3D映射等。尽管激光雷达系统的应用非常广泛而且截然不同&#xff0c;而“闪存激光雷达”解决方案适用于在使用固态光学元件的目标场景中生成可检测的点阵列。 凭借在针对小型封装获…

「Redis」08 主从复制

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程 Redis——主从复制 1. 简介 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的 master/slaver 机制&#xff0c;Master 以写为主&#xff0c;Slaver 以读为主。 主从复制的好处 读写分离&#xff0c;性能扩展…

利用styleSheet,避免js手动频繁修改样式

styleSheet是一个样式表&#xff0c;记录了一个html文件中<style>标签中的样式 &#x1f5a8;️体感styleSheet 对于下面一个html文件 <!DOCTYPE html> <html lang"en"><head><style>h1 {color: red;}div {color: green; }</styl…

VMware替换难?听听ZStack 的这3家制造业客户怎么说……

随着国家对信创转型的持续扶持&#xff0c;加之VMware原有的产品与客户云建设需求的契合度不高&#xff0c;越来越多的用户选择将自身的IT系统替换为国产化的信创产品&#xff0c;且已经在金融、交通、制造业、教育、房地产等领域落地出现从VMware迁移转型的成功案例。在此趋势…

Python实战案例,PyQt5+socket模块,Python制作小型桌面应用

前言 本文给大家分享的是如何通过用PyQt5制作小型桌面应用 PyQt概述 PyQt5是Qt框架的Python语言实现&#xff0c;由Riverbank Computing开发&#xff0c;是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合&#xff0c;每一个PyQt控件都对应一个Qt控件&#xff0c;…

js实现的在线绘图板,写字板

一个像素完美的基于web的MS Paint重制版和更多…试试看&#xff01; JS Paint高度逼真地再现了MS Paint的每个工具和菜单&#xff0c;甚至是鲜为人知的功能。 它支持主题、其他文件类型和辅助功能&#xff0c;如眼睛注视模式和语音识别。 在线demo地址在线绘图板&#xff0c;在…

CorelDRAW破解版是如何一步一步坑人的

如果你还在说破解版软件免费好用&#xff0c;那我真的要用一个朋友的例子和你讲讲破解版CorelDRAW的害人之处了。 小赵是我的朋友学设计的&#xff0c;学生党一枚苦于囊中羞涩经常上破解版的车。一次他接了一个设计LOGO的活儿&#xff0c;准备用CorelDRAW来做这个LOGO。于是从…

web安全之post注入和cookie注入

目录 环境 靶场11&#xff08;POST注入&#xff09; 靶场20&#xff08;cookie注入&#xff09; 环境 靶场&#xff1a;sqli-labs&#xff0c;工具&#xff1a;burp 靶场11&#xff08;POST注入&#xff09; 抓包修改请求体 uname-1 union select 1,2 #&passwd&s…

2023年天津仁爱学院高职升本科专业考试报考须知

2023年天津仁爱学院高职升本科专业考试报考须知 一、报名条件 1.报考我校2023年高职升本科各专业的考生&#xff0c;应符合天津市教育招生考试院制定的2023 年天津市高职升本科及我校专业考试有关报考条件&#xff0c;须完成2023年天津市高职升本科文化考试报名相关手续&#x…

【Web端智能聊天客服】之HTML、CSS、Bootstrap的讲解及实例(超详细必看 附源码)

觉得有帮助请点赞关注收藏~~~ 一、HTML基础 HTML全称是HyperText Markup Language 是网页的标准标记语言&#xff0c;使用HTML可以创建自定义网站或者模板网站&#xff0c;HTML代表超文本标记语言&#xff0c;主要用于描述网页结构&#xff0c;HTML页面元素体现浏览器如何显示…

商业智能BI在面向报表和模型开发时,有什么不同?

企业在面试商业智能BI技术开发人员&#xff0c;发现基本上90%的人分不清什么是面向报表开发&#xff0c;什么是面向模型开发&#xff0c;不明白这个问题背后的意思。10%左右的人稍微暗示一下&#xff0c;大概就懂你想了解的是什么了&#xff0c;这10%的是真正有过完整的数据仓库…

我是如何开始能写python爬虫的?给零基础入门Python小白一条清晰的学习路线

重要的事说三遍&#xff1a;不要从看书开始&#xff0c;不要从看书开始&#xff0c;不要从看书开始&#xff01;~~ 爬虫这么有意思的东西&#xff0c;看书多没有乐趣&#xff0c;从网上找个视频&#xff0c;直接跟着写&#xff0c;然后再根据视频&#xff0c;按照自己的想法写…

Polaris 和 dubbogo 全面对接,让微服务更简单

作者 | 邓正威&#xff0c;廖春涛&#xff08;春少&#xff09;&#xff0c;赵新&#xff08;花名 于雨&#xff09;背景概述什么是 PolarisPolaris 是腾讯开源的服务治理平台&#xff0c;致力于解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问…

公路交叉数(POJ3067)-树状数组解决逆序对

题目大意&#xff1a; 东海岸有N个城市&#xff0c;西海岸有M个城市&#xff08;N≤1000&#xff0c;M≤1000&#xff09;&#xff0c;将建K条公路。每个海岸的城市从北到南编号为1,2&#xff0c;…每条高速公路都是直线&#xff0c;连接东海岸和西海岸的城市。建设资金由高速公…

各开发语言DNS缓存配置建议

作者&#xff1a;翟贺龙 一、背景 在计算机领域&#xff0c;涉及性能优化动作时首先应被考虑的原则之一便是使用缓存&#xff0c;合理的数据缓存机制能够带来以下收益&#xff1a; 1.缩短数据获取路径&#xff0c;热点数据就近缓存以便后续快速读取&#xff0c;从而明显提升…

小侃设计模式(十六)-备忘录模式

1.概述 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型模式&#xff0c;它的主要思想是在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并将该状态保存在该对象之外&#xff0c;这样以后就可将该对象恢复到原先保存的状态。它是相对简…

【项目问题】程序里,oracle相关的内容,为什么有些能显示表有些不能显示表,但是用oracle工具就可以看到所有表

运行过程中的问题客户提出问题找一下原因问题找到了那如何解决这个看不到的问题呢客户提出问题 1、oracle数据源链接成功了&#xff0c;但是在产品使用过程中发现&#xff0c;没有表&#xff0c;空空如也 找一下原因 先看一下用户&#xff1a;zd202207 2、再去看看数据库工…