Ceph入门到精通-大流量10GB/s LVS+OSPF 高性能架构
LVS 和 LVS+keepalived 这两种架构在平时听得多了,最近才接触到另外一个架构LVS+OSPF。这个架构实际上是LVS+Keepalived 的升级版本,我们所知道LVS+Keepalived 架构是这样子的:

随着业务的扩展,我们可以对web服务器做水平扩展,以此来提高系统的处理能力。但是我们会发现,两台Director间始终只有一台是处于工作状态,而另一台处于不工作的备份状态,即使访问的流量再大,同时也只能由一台Director 去应对。换句话说,Director在这个架构里面没办法像web服务器那样做水平扩展,实现负载均衡。那么是否有办法让两台Director都处于工作的状态呢?答案是肯定的,LVS+OSPF 架构就是用来解决这个问题的。
LVS+OSPF架构图如下:

这个架构与LVS+keepalived 最明显的区别在于,两台Director都是Master 状态,而不是Master-Backup,如此一来,两台Director 地位就平等了。剩下的问题,就是看如何在这两台Director 间实现负载均衡了。这里会涉及路由器领域的一个概念:等价多路径
ECMP(等价多路径)
ECMP(Equal-CostMultipathRouting)等价多路径,存在多条不同链路到达同一目的地址的网络环境中,如果使用传统的路由技术,发往该目的地址的数据包只能利用其中的一条链路,其它链路处于备份状态或无效状态,并且在动态路由环境下相互的切换需要一定时间,而等值多路径路由协议可以在该网络环境下同时使用多条链路,不仅增加了传输带宽,并且可以无时延无丢包地备份失效链路的数据传输。
ECMP最大的特点是实现了等值情况下,多路径负载均衡和链路备份的目的,在静态路由和OSPF中基本上都支持ECMP功能。
例如下图中的路径A、路径B、路径C 3条路径的COST值相同,既是等价路径。在路由器选路的时候,便可以同时使用这3条路径,从而实现负载均衡。
注:虽然链路COST值相同,但是实际情况是,各路径的带宽、时延和可靠性等不一样,把Cost认可成一样,不能很好地利用带宽,尤其在路径间差异大时,效果会非常不理想。这时可以使用
WCMP(Weight-CostMultipathRouting)加权多路径,能够非常灵活地按照比例在链路上传递流量。

回到前面的那个问题:如何实现对多个Director 的负载均衡?相信看到这里,应该都清楚了,没错,就是利用OSFP的等价多路径来实现。那么新的问题又来了:我们知道Director 是一台LINUX/Unix机器,不是路由器,那它如何跑OSPF协议?如何实现等价多路径?
实际上就是将调度器模拟成路由器,将多台调度器与真实的路由器组成OSPF网络,需要做的就是为调度器安装quagga这个软件,并进行相关的配置即可。
【实验步骤】
实验平台 :Ubuntu12.04
路由器:使用GNS3桥接网卡模拟真实路由器
GNS3配置
vmnet2、vmnet3网卡配置如下:(vmware 菜单栏 编辑 -- 虚拟网络编辑器)

GNS3桥接vmware网卡,e1/0 桥接vmware的vmnet2网卡,e1/1 桥接vmware的vmnet3网卡。GNS3总共需要3个设备:两个云设备(用于桥接网卡)和一台路由器(模拟真实路由器)




完成后GNS3 的拓扑是这样的:

#配置真实路由器R1
R1#conf t
R1(config)#int lo1
R1(config-if)#ip addr 2.2.2.2 255.255.255.0
R1(config-if)#int e1/0
R1(config-if)#ip add 192.168.20.120 255.255.255.0
R1(config-if)#no shut
R1(config-if)#int e1/1
R1(config-if)#ip add 192.168.30.120 255.255.255.0
R1(config-if)#no shut
R1(config-if)#int e1/0
R1(config-if)#ip ospf hello-interval 1
R1(config-if)#ip ospf dead-interval 3
R1(config-if)#ip ospf network point-to-point
R1(config-if)#ip ospf priority 100
R1(config-if)#int e1/1
R1(config-if)#ip ospf hello-interval 1
R1(config-if)#ip ospf dead-interval 3
R1(config-if)#ip ospf network point-to-point
R1(config-if)#ip ospf priority 99
R1(config-if)#exit
R1(config)#router ospf 1
R1(config-router)#network 192.168.20.0 0.0.0.255 area 0
R1(config-router)#network 192.168.30.0 0.0.0.255 area 0
R1(config-router)#network 2.2.2.2 0.0.0.0 area 0
调度器上配置quagga,模拟路由器
#安装quagga
root@node1:~# apt-get install quagga -y
#修改配置文件
root@node1:~# vim /etc/quagga/daemons
zebra=yes
ospfd=yes
root@node1:~# cp /usr/share/doc/quagga/examples/ospfd.conf.sample /etc/quagga/ospfd.conf
root@node1:~# cp /usr/share/doc/quagga/examples/zebra.conf.sample /etc/quagga/zebra.conf
root@node1:~# chown quagga.quagga /etc/quagga/ospfd.conf
root@node1:~# chown quagga.quagga /etc/quagga/zebra.conf
#启动quagga
root@node1:~# /etc/init.d/quagga restart
#查看是否有相应监控端口
root@node1:~# netstat -nultp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2601 0.0.0.0:* LISTEN 1737/zebra
tcp 0 0 127.0.0.1:2604 0.0.0.0:* LISTEN 1741/ospfd
node2上的安装步骤同上
#尝试远程连接quagga、配置quagga
root@node1:~# telnet 127.0.0.1 2604
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Hello, this is Quagga (version 0.99.20.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
User Access Verification
Password: #默认密码为zebra
#估计看到这,学过网络的童鞋都已经很熟悉了,可以大展身手了。闲话少说,继续配置:
node1 配置如下
ospfd> en
ospfd# configure terminal
ospfd(config)# router ospf
ospfd(config-router)# router-id 192.168.20.101
ospfd(config-router)# network 192.168.20.0/24 area 0
ospfd(config-router)# network 1.1.1.1/24 area 0
ospfd(config-router)# exit
ospfd(config)# interface eth0
ospfd(config-if)# ospf hello-interval 1
ospfd(config-if)# ospf dead-interval 3
ospfd(config-if)# ip ospf network point-to-point
ospfd(config-if)# end
ospfd# wr
Configuration saved to /etc/quagga/ospfd.conf
ospfd# exit
Connection closed by foreign host.
node2配置如下
ospfd> en
ospfd# configure terminal
ospfd(config)# router ospf
ospfd(config-router)# router-id 192.168.30.100
ospfd(config-router)# network 192.168.30.0/24 area 0
ospfd(config-router)# network 3.3.3.3/24 area 0
ospfd(config-router)# exit
ospfd(config)# interface eth0
ospfd(config-if)# ospf hello-interval 1
ospfd(config-if)# ospf dead-interval 3
ospfd(config-if)# ip ospf network point-to-point
ospfd(config-if)# end
ospfd# wr
Configuration saved to /etc/quagga/ospfd.conf
ospfd# exit
Connection closed by foreign host.
#在node1和node2上分别启用一个loopback口,用于测试
root@node1:~# ifconfig lo:1 1.1.1.1 netmask 255.255.255.0
root@node2:~# ifconfig lo:1 3.3.3.3 netmask 255.255.255.0
测试
在路由器R1 上执行show ip ospf neighor 可以看到OSPF的邻居
R1#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
192.168.30.100 0 FULL/ - 00:00:02 192.168.30.100 Ethernet1/1
192.168.20.101 0 FULL/ - 00:00:02 192.168.20.101 Ethernet1/0
在node1上面ping node2


至此,ospf的配置完成!
至于LVS的配置,基本上同LVS+Keepalived 架构,在配置的过程中,应注意的地方有以下几点:
1、配置router_id 的时候,为了区分开,可用ip地址作为router_id ,例如:
global_defs {
router_id 192.168.30.102
}
2、因为两台调度器都是要提供服务的,因此两台调度器应都处于Master的状态,那么这里有3个方面要注意:
(1)首先是状态那里,两台调度器都要是MASTER
vrrp_instance VI_1 {
state MASTER
... ...
}
(2)其次,要以双主的模式启动,需要使调度器处于不同的域中。(一山不容二虎么... ...)
node1
vrrp_instance VI_1 {
... ...
virtual_router_id 51
... ...
}
node2
vrrp_instance VI_1 {
... ...
virtual_router_id 52
... ...
}
(3)这里的优先级应一致,统一由真实路由器R1进行调度。
node1
vrrp_instance VI_1 {
... ...
priority 110
... ...
}
node2
vrrp_instance VI_1 {
... ...
priority 110
... ...
}
相关文章:
Ceph入门到精通-大流量10GB/s LVS+OSPF 高性能架构
LVS 和 LVSkeepalived 这两种架构在平时听得多了,最近才接触到另外一个架构LVSOSPF。这个架构实际上是LVSKeepalived 的升级版本,我们所知道LVSKeepalived 架构是这样子的: 随着业务的扩展,我们可以对web服务器做水平扩展…...
Unity光照相关
1. 光源类型 Unity支持多种类型的光源,包括: 1. 点光源(Point Light):从一个点向四周发射光线,适用于需要突出物体的光源。 2. 平行光(Directional Light):从无限远处…...
Qt基本类型
QT基本数据类型定义在#include <QtGlobal> 中,QT基本数据类型有: 类型名称注释备注qint8signed char有符号8位数据qint16signed short16位数据类型qint32signed short32位有符号数据类型qint64long long int 或(__int64)64位有符号数据类型&#x…...
前端基础(Element、vxe-table组件库的使用)
前言:在前端项目中,实际上,会用到组件库里的很多组件,本博客主要介绍Element、vxe-table这两个组件如何使用。 目录 Element 引入element 使用组件的步骤 使用对话框的示例代码 效果展示 vxe-table 引入vxe-table 成果展…...
C++学习记录——이십팔 C++11(4)
文章目录 包装器1、functional2、绑定 这一篇比较简短,只是因为后要写异常和智能指针,所以就把它单独放在了一篇博客,后面新开几篇博客来写异常和智能指针 包装器 1、functional 包装器是一个类模板,对可调用对象类型进行再封装…...
UE学习记录03----UE5.2 使用拖拽生成模型
0.创建蓝图控件,自己想要展示的样子 1.侦测鼠标拖动 2.创建拖动操作 3.拖动结束时生成模型 3.1创建actor , 创建变量EntityMesh设为可编辑 生成Actor,创建变量EntityMesh设为可编辑 屏幕鼠标位置转化为3D场景位置 4.将texture设置为变量并设为可编辑&am…...
Spring Cache框架(缓存)
1、介绍: Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单加个注解,就能实现缓存功能。它提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager 接口来实现不同的缓存技术。 针对不同…...
Linux学习之Ubuntu 20使用systemd管理OpenResty服务
sudo cat /etc/issue可以看到操作系统的版本是Ubuntu 20.04.4 LTS,sudo lsb_release -r可以看到版本是20.04,sudo uname -r可以看到内核版本是5.5.19,sudo make -v可以看到版本是GNU Make 4.2.1。 需要先参考我的博客《Linux学习之Ubuntu 2…...
[数据集][目标检测]疲劳驾驶数据集VOC格式4类别-4362张
数据集格式:Pascal VOC格式(不包含分割的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):4362 标注数量(xml文件个数):4362 标注类别数:4 标注类别名称:["closed_eye","closed_mouth"…...
matlab使用教程(25)—常微分方程(ODE)选项
1.ODE 选项摘要 解算 ODE 经常要求微调参数、调整误差容限或向求解器传递附加信息。本主题说明如何指定选项以及每个选项与哪些微分方程求解器兼容。 1.1 选项语法 使用 odeset 函数创建 options 结构体,然后将其作为第四个输入参数传递给求解器。例如࿰…...
MybatisPlus简单到入门
一、MybatisPlus简介 1、入门案例(重点): 1.SpringBoot整合MP1).创建新模块选择,Spring项初始化。2).选择当前模块使用的技术,只保留MySQL Driver就行,不要选择mybatis避免与后面导入mybatisPlus的依赖发…...
9. 优化器
9.1 优化器 ① 损失函数调用backward方法,就可以调用损失函数的反向传播方法,就可以求出我们需要调节的梯度,我们就可以利用我们的优化器就可以根据梯度对参数进行调整,达到整体误差降低的目的。 ② 梯度要清零,如果梯…...
go学习之流程控制语句
文章目录 流程控制语句1.顺序控制2.分支控制2.1单分支2.2双分支单分支和双分支的四个题目switch分支结构 3.循环控制for循环控制while 和do...while的实现 4.跳转控制语句breakcontinuegotoreturngotoreturn 流程控制语句 介绍:在程序中,程序运行的流程…...
docker基于已有容器和通过Dockerfile进行制作镜像配置介绍
目录 一.制作镜像的两种方式 1.在已有容器中更新并提交这个镜像 2.使用Dockerfile来制作 二.基于容器制作镜像 1.格式 (1)主要格式 (2)可选参数 2.案例 基于容器创建镜像设置标签并进行验证是否可用 (1&…...
2022年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:最长上升子序列 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 < i1 < i2 &…...
二级MySQL(九)——表格数据处理练习
在Mysql中,可以用INSERT或【REPLACE】语句,向数据库中已一个已有的表中插入一行或多行记录。 在Mysql中,可以用【DELETE】或【TRUNCATE】语句删除表中的所有记录。 在Mysql中,可以用【UPDATE】语句来修改数据表中的记录。 为了完…...
QT ListQvector at赋值出错以及解决办法 QT基础入门【QT存储结构】
1、问题 error: passing const QString as this argument discards qualifiers error: assignment of read-only location vec.QVector<int>::at(0) 在Qt中QList,Qvector一般获取元素都是通过at(index)来获取,但是at()的返回是一个const & 常引用,也就是元素不支…...
STM32 CubeMX (H750)RGB屏幕 LTDC
STM32 CubeMX STM32 RGB888 LTDC STM32 CubeMX一、STM32 CubeMX 设置时钟树LTDC使能设置屏幕参数修改RGB888的GPIO 二、代码部分效果 RGB屏幕线束定义: 一、STM32 CubeMX 设置 时钟树 这里设置的时钟,关于刷新速度 举例子:LCD_CLK24MHz 时…...
Redis问题集合(三)在Redis容器里设置键值对
前言 前提是已经拉取了Redis镜像并创建了对应的容器做个记录,方便后续查看 步骤 查看Redis容器的ID:docker ps -a 进入容器:docker exec -it 容器ID /bin/bash进入redis命令行:redis-cli输入密码:auth 配置密码 查看…...
spark中排查Premature EOF: no length prefix available
报错信息 /07/22 10:20:28 WARN DFSClient: Error Recovery for block BP-888461729-172.16.34.148-1397820377004:blk_15089246483_16183344527 in pipeline 172.16.34.64:50010, 172.16.34.223:50010: bad datanode 172.16.34.64:50010 [DataStreamer for file /bdp/data/u9…...
CREO 6.0装配实战:别再乱拖零件了,手把手教你用‘移动’和‘角度偏移’精准定位
CREO 6.0装配实战:从零件乱飞到精准定位的进阶技巧 刚接触CREO装配模块的新手设计师,最常遇到的挫败感莫过于:明明在脑海中构思好了零件位置,实际操作时却总是出现零件"乱飞"、"定位不准"的情况。这种体验就像…...
基于宏观通胀预测模型的利率预期重定价:华尔街降息路径为何出现系统性回撤?CPI成为关键校准变量
摘要:本文通过宏观通胀预测模型,结合利率预期曲线重定价算法与市场情绪迁移分析,对当前美通胀路径、CPI数据影响及华尔街降息预期变化进行系统性建模,分析利率政策预期从宽松交易向数据依赖模式切换的结构性原因。一、市场情绪迁移…...
OpenClaw vs Hermes Agent,谁是 2026 年 AI Agent 最优解?
OpenClaw+Hermes 全集成,一键调用所有 AI 技能:https://ai-skills.ai/?inviteCode=S2JV3NCK 前言 2026 年,AI Agent 已从 “实验玩具” 迈入 “工程化落地” 关键期。GitHub 上 OpenClaw 与 Hermes Agent 两大开源项目热度飙升,均宣称解决大模型 “失忆、弱执行、难沉淀”…...
别再死记硬背了!用一块74283芯片搞定所有BCD码转换(附实战练习题)
用74283芯片玩转BCD码转换:从原理到实战的终极指南 在数字电路设计与计算机组成原理的学习中,BCD码转换一直是让许多学生头疼的"拦路虎"。传统的死记硬背方法不仅效率低下,更无法应对考试中千变万化的题型。本文将彻底改变这一现状…...
LaTeX排版避坑指南:为什么你的多图caption编号对不齐?一个案例讲清subfig、minipage和tabular的选择
LaTeX多图排版实战:从编号错乱到完美对齐的解决方案 第一次在学术论文中遇到多图排版问题时,我盯着那个歪歪扭扭的(c)编号看了整整十分钟——它本该和(a)(b)整齐排列,却像迷路的孩子一样缩在角落。更糟的是,当我引用这些子图时&am…...
从零手写CNN:理解卷积网络的生物学原理与工程逻辑
1. 项目概述:从人眼到机器之眼,一次真实的视觉理解之旅你有没有盯着一张照片发过呆?比如朋友刚发来的旅行照——蓝天、雪山、一只歪头的雪豹。你几乎是一瞬间就认出了“雪豹”,甚至能判断它“在看镜头”“毛很厚”“可能刚睡醒”。…...
Python轻量级Web框架fws:从核心原理到RESTful API实战
1. 项目概述:一个轻量级、可扩展的Web服务框架在构建现代Web应用时,我们常常面临一个选择:是使用功能全面但可能略显臃肿的成熟框架,还是从零开始,只为满足特定需求而构建一个精简的解决方案?前者提供了开箱…...
CDFControl工具详解,搞定云桌面黑屏、卡顿、随机掉线疑难故障
一 前言 在企业Citrix云桌面运维工作中,我们经常遇到一类无明确报错、间歇性复现的疑难故障。常规Windows事件查看器日志干净无报错,常规DDC控制台监控无异常,但终端用户会频繁出现登录黑屏、会话卡顿、虚拟机随机掉线、VDA注册超时等问题。 很多运维人员遇到此类问题只能…...
STM32CubeMX外部中断实战:从按键消抖到LED状态切换
1. STM32CubeMX外部中断基础配置 第一次用STM32CubeMX配置外部中断时,我盯着那一堆选项有点懵。后来发现其实只要抓住几个关键点,整个过程就像搭积木一样简单。这里以最常见的按键控制LED为例,带你一步步实现这个功能。 首先打开CubeMX新建…...
TI C2000 DSP入门新姿势:Simulink硬件支持包安装与CCS v10.1.0联调实战记录
TI C2000 DSP开发环境搭建:从Simulink支持包到CCS联调全指南 当第一次打开Matlab准备为C2000 DSP开发算法时,很多人会惊讶地发现:明明安装了CCS和Matlab,却无法直接在Simulink中找到C2000的硬件支持。这不是个例——根据TI官方论坛…...
