eponia
这个作者很懒,什么都没留下…
展开
-
【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(四) - 物理服务器互联
4.物理服务器互联4.1 本节目标理解在spine leaf网络中,物理服务器之间通信方式; 了解如何在leaf交换机上配置下联物理机的接口; 了解如何在物理机上配置上联物理网卡;4.2 拓扑结构在上一节的基础上,加入4台服务器,以下图的拓扑连接到leaf交换机上,leaf交换机没两个分为一对,连接一组物理服务器,如下图,leaf01/02为一对,leaf03/04为一对。...原创 2020-03-12 17:31:02 · 4445 阅读 · 2 评论 -
【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(三) - 交换设备互联
3. 交换机互联3.1 本节目标了解Spine Leaf网络基本拓扑结构; 网络设备互联接口配置; 网络设备bgp配置;3.2 拓扑结构:如下图所示, 本节使用的Spine Leaf网络拓扑,由2台Spine和4台Leaf组成,Spine和Leaf之间两两互联。为方便管理,加入一台linux主机用于管理各交换机设备,则拓扑如下:3.3 测试环境6台交换机(即Sp...原创 2020-03-12 16:42:28 · 8194 阅读 · 1 评论 -
【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(一) - 叶脊网络架构简介
1. 叶脊网络架构简介天地万物,应运而生。传统的三层网络架构,在发展了多年后,终于也命数将尽了,替代它的,将是叶脊网络架构。究其原因,是因为传统三层网络架构自身存在一些无法突破的限制与弊端,在当今云计算风起云涌,虚拟化如火如荼,数据中心越来越大,网络规模需要无限扩展的时代,叶脊网络架构应运而生。1.1 传统三层网络的弊端如上图是传统三成网络架构的典型拓扑结构:接入层:接入交换...原创 2019-08-01 15:32:08 · 49145 阅读 · 4 评论 -
【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(五) - 物理服务器路由方案及配置
2.2 路由方案设计2.2.1 物理设备路由方案大道至简,本着这个原则,本文的设计只采用了静态路由和BGP两种路由协议。其中,静态路由配置在每个leaf上,调度目的地址为本leaf上所接服务器的业务IP的流量,每个leaf与其相连接的spine之间建立eBGP链接,将leaf上配置的静态路由同步到spine上,各leaf通过spine,也互相学习到了各自的静态路由,这样一来,每个leaf和...原创 2019-08-26 16:37:29 · 9290 阅读 · 3 评论 -
【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(二) - 网络规划
2. 全三层架构设计思路采用全三层网络架构设计的出发点是:使用尽量少的交换机高级功能,可以尽可能减少由于功能bug故障造成的问题; 使用尽量少的网络协议,以兼容不通厂商的网络设备 实现简单,易于维护,绝对可靠的路由协议; 通过控制路由来调度流量,尽量减少设备或协议的故障域; 牺牲高级功能带来的便捷,得到更高的可用性和性能;由上述原则,本文的设计选择只使用静态路由和BGP...原创 2019-08-22 10:51:05 · 18167 阅读 · 1 评论 -
Rust语言项目实战(九 - 完结) - 胜利与失败
在前面的章节中,我们已经实现了这个游戏中大部分的模块和功能,我们可以指挥我们的战机左右移动,并发射子弹;我们还创造了一堆的侵略者,从屏幕上方缓缓降落,试图到达屏幕的底部。本章中,我们将对游戏的输赢作出最后的裁决,到底是我们的保卫者英勇无敌,还是侵略者更胜一筹呢,作为这个程序的创造者,让我们来为输赢制定规则吧。原创 2023-12-04 12:55:11 · 702 阅读 · 0 评论 -
【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(六) - 虚拟机路由方案及配置
6.虚拟机路由方案及配置在虚拟化的数据中心中,虚拟机承载着关键业务,其相互之间的通信必不可少,虚拟机的网卡桥接在宿主机的网桥上,以宿主机的IP地址作为默认网关,同一物理机上的虚拟机之间的通信,直接通过宿主机网桥可二层互通,不同宿主机上的虚拟机通信经过三层转发互通。6.1 本节目标理解VM直接的通信过程; 学习在leaf交换机上配置VM的路由; 学习在VM及其宿主机上配置VM的路由...原创 2020-03-12 17:54:17 · 5066 阅读 · 1 评论 -
【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(七) - 负载均衡及高可用
7.负载均衡及高可用7.1 本节目标理解spine leaf网络下,服务高可用及负载均衡原理; 学习在leaf交换机和服务器上进行相关配置;7.2 方案对比在二层网络中,长长采用主备的方式保证服务的高可用,而spine leaf网络下则是采用多活的方式,克服了在全三层网络中不能使用keepalived等HA软件的缺陷,还且实现了负载均衡和高可用。7.2.1 主备方式...原创 2020-03-12 20:54:01 · 3760 阅读 · 1 评论 -
【DevOps】GitOps最佳实践(一) - 为DevOps助力
GitOps是一套贯穿整个应用开发和部署周期的DevOps最佳实践。它将Git作为主要的基础设施,应用和配置的存储和同步机制。这种模式将开发人员从基础设施管理任务中解放出来,让他们能够专注于应用程序的开发和交付。GitOps的工作流程非常简单,所有的更改都在Git存储库中进行,包括应用程序代码、基础设施配置和应用程序配置等。当新的更改被推送到存储库时,GitOps控制器会检测到更改并将其自动部署到目标环境中。这种自动化过程可以消除部署过程中的人为错误,从而提高生产力和可靠性。原创 2023-04-07 10:43:47 · 733 阅读 · 1 评论 -
【DevOps】GitOps最佳实践(二) - 困难与简例
上一篇文章中,我们介绍了GitOps能为我们带来许多的好处,然而,任何新的探索都将不会是一帆风顺的。在开始之前,如果能了解实践GitOps通常会遇到的挑战,并对此作出合适的应对,可能会使我们使用GitOps的旅程更加的顺利。原创 2023-04-07 23:02:02 · 509 阅读 · 0 评论 -
【DevOps】GitOps最佳实践(三) - 未竟之事
虽然GitOps有这么多令人头疼的问题,但是仍然不失为一种优秀的持续交付方案,并且越来越收到欢迎,上面说到的这些问题,相信在将来也会被不断地完善。原创 2023-04-14 22:54:44 · 597 阅读 · 0 评论 -
【DevOps】GitOps最佳实践(四) - 弃用分支区分环境
上面说的这些问题,在环境越来越多的情况下,处理的难度会指数级的上升,因此,在GitOps的实践中,一定不要选用分支的方式来管理多个环境。下一篇文章中,我们会推荐一种在GitOps中进行多环境管理的方式。原创 2023-04-15 22:32:45 · 719 阅读 · 0 评论 -
【DevOps】GitOps最佳实践(五) - 多目录模式管理多环境
多分支模式在管理复杂环境时会遇到很多棘手的问题,而多目录模式则基本解决了这些问题。本文列举了一个复杂环境的目录结构设计示例以供参考,再次墙裂建议大家在GitOps的实践中采用多目录模式来管理多个环境。原创 2023-04-20 17:18:03 · 634 阅读 · 0 评论 -
Rust语言项目实战(一) - 项目介绍及开始
在实战篇中,我们将制作一个终端小游戏,在终端中运行一款类似于太空大战的游戏,玩家控制一个小飞机,发射子弹打败敌人。原创 2023-12-01 08:45:51 · 689 阅读 · 0 评论 -
Rust语言项目实战(二) - 准备键盘和终端屏幕
上一章节中,我们实现了游戏开始音频的播放,本章我们开始编写游戏界面。我们的游戏是在命令行终端中运行的,因此编写的界面也是终端中展示的界面,上一章中,我们已经把相关的依赖包crossterm添加到了依赖列表中。本章首先为游戏准备所需的键盘和屏幕配置。原创 2023-12-01 08:46:11 · 192 阅读 · 0 评论 -
Rust语言项目实战(三) - 创建主循环
众所周知,游戏在不手动退出的情况下应该一直运行下去,因此所有的游戏机会都应该有一个主循环来保证游戏不会自动退出。原创 2023-12-01 09:28:30 · 113 阅读 · 0 评论 -
Rust语言项目实战(四) - 界面绘制与渲染
Escq目前游戏的界面还是一片空白,本章我们开始为游戏在终端上绘制并渲染界面,这真是一个激动人心的工作。原创 2023-12-01 09:28:45 · 913 阅读 · 0 评论 -
Rust语言项目实战(五) - 动态渲染
Escq。原创 2023-12-01 09:28:56 · 151 阅读 · 0 评论 -
Rust语言项目实战(六) - 玩家模块
玩家的行为才是游戏的灵魂,还是与之前一样,我们将玩家的行为逻辑以及相关的函数,结构体都放在单独的模块中,以使项目的结构更加清晰。原创 2023-12-01 09:29:08 · 121 阅读 · 0 评论 -
Rust语言项目实战(七) - 子弹模块
x: usize,y: usize,Self {同时,还要定义玩家发射子弹的函数, 我们可以规定玩家可以同时拥有的存活的子弹数量上限,例如2, 如果达到了上限就不能继续发射子弹,并用一个bool类型返回发射结果,发射成功就返回true, 失败就返回falsetrue} else {false另外我们还需要对玩家的所有子弹进行状态更新,只保留那些还存活的子弹, 下面例子中的retain。原创 2023-12-01 09:29:20 · 194 阅读 · 0 评论 -
Rust语言项目实战(八) - 入侵者模块
我们已经说明,入侵者应当是一组敌人,所以我们应当先定义单个入侵者,然后定义入侵者们。下面的代码中, 单个入侵者具有坐标信息, 而入侵者军团包含军团(一组入侵者), 移动计时器,移动方向的信息;x: usize,y: usize,move_timer: Timer, // 计时器到时就移动direction: i32 // 移动方向, 正数为右, 负数为左所有入侵者的行动都是一致的,因此我们只需要对入侵者们统一定义一些行为, 也就是为Invadersx的坐标区间为(1, 列数-2)原创 2023-12-01 09:29:34 · 183 阅读 · 0 评论 -
Rust语言入门教程(一) - 简介及Cargo使用
内存安全: 在编译阶段就保证了内存的安全;无畏并发: 由于更优秀的安全性,所以在进行并发编程时更加无所畏惧,因为所有的不安全因素都会在编译时被发现;快速:由于零成本的抽象和其他优秀特性,Rust具有惊人的运行速度和性能;相比之下, 一些高级语言如Ruby和Python虽然可以保证内存安全, 但是却很难做到高并发和高性能。一些系统编程语言如C语言和C++, 虽然可以获得高性能,以及一定程度上的高并发,但是却总是被内存安全问题所困扰。原创 2023-11-23 14:24:39 · 1559 阅读 · 0 评论 -
Rust语言入门教程(二) - 变量与作用域
语句以分号结尾,用花括号包含语句块。Rust的语法其实借鉴了很多其他的语言,比如C语言和Python, 所以变量定义的格式看起来也跟很多我们熟悉的其他语言相似。Rust中,使用let关键字声明一个变量。在上面的例子中, 我们声明了一个变量bunnies, 并且初始化了它的值为2Rust是一种强类型的语言,那么在上面的语句中,哪里标注了这个变量的类型呢?在Rust编程中,如果Rust能准确的识别这个变量的类型,那么我们不需要显式的标注变量的类型,也不需要像C#那样标注一个auto表示它的类型是自动识别的。原创 2023-11-23 16:51:12 · 1088 阅读 · 0 评论 -
Rust语言入门教程(三) - 函数与模块系统
Rust并不要求函数定义的位置必须在调用它之前,所以如果你习惯于把main函数放在最前面的话,是完全没有问题的。函数的参数格式为参数名: 参数类型, 多个参数之间用分隔,在参数列表后, 用->原创 2023-11-23 18:03:02 · 919 阅读 · 0 评论 -
Rust语言入门教程(四) - 数据类型
变量的值可能是一个英文字母,也可能是一个其他语言中的字母,也可能是一个汉字, 甚至可以是一个表情符号,还可能是一些不可打印的控制符号,只要它是在。, 根据参数的类型不同,函数的行为会发生变化, 此时如果我需要传入的参数值为5, 那么我就需要为这个5指定类型,那么便可以写为。我们的代码编辑器显示的源代码也是UTF-8格式的,因此,我们在代码中看到的一个字符,其实并不等同于Rust中的一个。需要注意的是,虽然Rust有这些整型,但根据你的系统位数不同,有的整型类型可能不被支持,比如在一个。原创 2023-11-24 12:48:50 · 755 阅读 · 0 评论 -
Rust语言入门教程(五) - 流控制语句
在Rust中, if语句的判断条件不需要用( )括起来, 它会认为所有在if和判断条件的表达式必须返回一个bool如果要进行多分支的条件判断,可以使用else if(注意else和if是分开的),最后也可以用else注意,if是一种表达式, 而不是语句。注意,在上面的例子中,每个判断分支的结尾没有;, 因为这是一个尾部表达式, 用于给if表达式返回一个值;我们也不能使用return关键字, 而只能使用尾部表达式,因为return只能用于函数定义的代码块中,给函数返回结果;原创 2023-11-24 17:17:30 · 583 阅读 · 0 评论 -
Rust语言入门教程(六) - 字符串类型
Rust的标准库的集合类型提供的索引操作始终保证是时间恒定的操作, 但是对于字符串的索引却不能做到,因为当我们对字符串进行索引操作时,得到的是字节,而这个结果大概率并不是我们想要得到的结果(如上所述,一个有意义的语言文字字符可能是一个或多个字节组成的)。, UTF-8的编码规则下, 一个Unicode字符可能占用1 - 4个字节的长度不定,因此必须要遍历每个字节,才知道每个符号从哪里开始,在哪里结束。在Rust的标准库中,至少都提供了6种字符串类型,我们平常使用的最多的是其中的两种。从数据结构的角度来看,原创 2023-11-26 15:20:19 · 566 阅读 · 0 评论 -
Rust语言入门教程(七) - 所有权系统
所有权系统是Rust敢于声称自己为一门内存安全语言的底气来源,也是让Rust成为一门与众不同的语言的所在之处。也正是因为这个特别的所有权系统,才使得编译器能够提前暴露代码中的错误,并给出我们必要且精准的错误提示。原创 2023-11-26 16:11:43 · 458 阅读 · 0 评论 -
Rust语言入门教程(八) - 引用与借用
上一章的内容中我们讨论了Rust的所有权系统,当我们不想移动值的所有权时,我们可以使用引用和借用,而这正是本章想要讨论的问题。原创 2023-11-27 07:00:00 · 879 阅读 · 0 评论 -
Rust语言入门教程(九) - 结构体
在其他很多编程语言中,有类(Class)的存在,在Rust中,我们没有类(Class)的概念,我们使用结构体(Struct)。以struct关键词开头,后面紧跟结构体的名称(以大写字母开头的驼峰式命名),大括号中是结构体的数据字段,每个字段由字段名称及它的类型声明组成, 字段间用分隔。最后一个字段后面也可以加上, 并且我们推荐大家这样做,以防在以后添加新字段时忘记在前面的字段后添加。原创 2023-11-27 11:05:54 · 727 阅读 · 0 评论 -
Rust语言入门教程(十) - Trait与泛型
println!"}// 输出 “BYTE!如上,我们为内置类型u8实现我们自定义的Trait, 在前面的章节中我们已经提到了, 在Rust中,Byte和u8是等价的, 因此对u8类型实现get_noise这个方法,我们让他直接打印出“BYTE!在main函数中,我们调用, 由于参数类型是u8, 因此会调用到Noisy对u8类型的实现,直接打印出"BYTE!// 无默认行为的函数// 定义函数的默认行为println!// 定义函数的默认行为println!原创 2023-11-28 08:59:58 · 748 阅读 · 0 评论 -
Rust语言入门教程(十一) - 集合类型Collections
在 Rust 中,collections 是一组用于存储多个值的标准库数据结构。不同于数组和元组,collections 可以存储可变数量的数据。Rust 的标准库提供了几种常用的集合类型,每种类型都有其特定的用途和性能特点。原创 2023-11-28 09:00:12 · 357 阅读 · 0 评论 -
Rust语言入门教程(十二) - 枚举类型Enums与模式匹配
在Rust中, 枚举(Enums)类型更接近Haskell中的代数数据类型,而不是类似于C语言中的枚举类型。enum{ }如果只看上面的例子,其实有点类似于C语言中的枚举类型。当我们想要使用Color这个枚举类型中的特定变体时,可以用。原创 2023-11-29 00:45:00 · 453 阅读 · 0 评论 -
Rust语言入门教程(十三) - 重要的枚举类型Option与Result
首先,还是再列出Option的定义, 它用于任何可能为空的变量。注意在中我们指定了x如果不为空时的关联数据变量类型,且使用None时, 也没有使用或者, 这是因为Option类型实在是太常用了,所以Rust默认已经把他们都引入了,不需要再手动导入。判断一个Option类的变量是Some还是None此外, Option还实现了的Trait, 这使得它可以被视为一个长度为0或1的向量,从而可以用for。原创 2023-11-29 08:30:00 · 516 阅读 · 0 评论 -
Rust语言入门教程(十四) - 闭包Closure
闭包在 Rust 中是非常强大的功能,允许你编写更灵活和表达性的代码。闭包的语法和功能在某些方面类似于其他语言(如 JavaScript 或 Python)中的匿名函数或 lambda 表达式。在Rust中,当我们想要生成一个新的线程,或者是想在迭代中进行一些函数式编程对迭代变量进行处理时,通常就会用到闭包, 当然,在标准库中一些其他的常见的地方,也会涉及到闭包的使用。闭包本质上是一个匿名函数,它可以从其所在的作用域中借用或捕获到一些变量或数据。原创 2023-11-30 08:47:41 · 234 阅读 · 0 评论 -
Rust语言入门教程(十五) -线程(Thread)
Rust的线程具有很好的可移植性,在Mac, Window, Linux以及其他许许多多不能一一列举的平台上,Rust的线程都可以完美运行。原创 2023-11-30 08:47:19 · 230 阅读 · 0 评论 -
【网络-高可用】Keepalived虚拟ip不漂移问题
Keepalived主要是通过虚拟路由冗余来实现高可用功能。本文将不对keepalived的基本原理进行阐述,可参考文章Keepalived详细介绍简介、keepalived vip漂移基本原理及选举算法。本文记录了在实践过程中使用keepalived时,在weight值变化的情况下vip不漂移的问题及解决方法。原创 2019-04-21 11:35:24 · 12824 阅读 · 3 评论 -
【网络/内核】Linux内核参数group_fwd_mask-设置bridge过滤MAC地址范围
笔者在利用gns3模拟器搭建网络实验时,发现交换机设备和服务器之间无法成功协商LACP协议,CISCO NEXUS 9K互相之间却可以成功协商LACP, 在交换机和服务器上抓包发现,Nexus 9K发出的LACP报文中的目的MAC地址为00:01:02:03:04:05(而标准LACP协议中规定的是01:80:c2:00:00:02),服务器发出的LACP报文的目的MAC是01:80:c2:00:...原创 2019-07-23 17:11:51 · 2555 阅读 · 0 评论 -
【网络/内核】Linux内核参数ignore_routes_with_link_down-忽略已断开连接的路由
Linux内核参数ignore_routes_with_link_down-忽略已断开连接的路由原创 2019-08-01 17:42:18 · 1627 阅读 · 2 评论 -
【网络】linux网口bond的链路检测及恢复机制
近期的项目中遇到了这样一个问题,引发了笔者对linux bond和lacp协议的一些研究:情景:如上图所示,server有两张网卡配置了bond0, 工作在mode4负载均衡模式下, 现在从client对server进行持续的ping测试,发现:插拔server端物理网口的网线时, ping一直正常,无丢包; 用ifconfig down enp4s0f0/1 来关闭物理网口时...原创 2020-03-11 17:59:07 · 4885 阅读 · 0 评论