当前位置: 首页 > news >正文

Ceph入门到精通-大流量10GB/s LVS+OSPF 高性能架构

 LVS 和 LVS+keepalived 这两种架构在平时听得多了,最近才接触到另外一个架构LVS+OSPF。这个架构实际上是LVS+Keepalived 的升级版本,我们所知道LVS+Keepalived 架构是这样子的:

wKiom1NJKMSw-GPhAADwcASdokw040.jpg

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

       LVS+OSPF架构图如下:

wKiom1NKAJzj7bMKAAE4PO25-Xw866.jpg

      这个架构与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)加权多路径,能够非常灵活地按照比例在链路上传递流量。

wKiom1NKA9rSiD14AAESeOtCGdE361.jpg

       回到前面的那个问题:如何实现对多个Director 的负载均衡?相信看到这里,应该都清楚了,没错,就是利用OSFP的等价多路径来实现。那么新的问题又来了:我们知道Director 是一台LINUX/Unix机器,不是路由器,那它如何跑OSPF协议?如何实现等价多路径?

       实际上就是将调度器模拟成路由器,将多台调度器与真实的路由器组成OSPF网络,需要做的就是为调度器安装quagga这个软件,并进行相关的配置即可。

【实验步骤】

实验平台 :Ubuntu12.04

路由器:使用GNS3桥接网卡模拟真实路由器

GNS3配置

vmnet2、vmnet3网卡配置如下:(vmware 菜单栏 编辑 -- 虚拟网络编辑器)

wKioL1NQ_tXiNSmLAAO0dGOEDF8501.jpg

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

wKioL1NQ_5Cz6hGuAAM11hK_KNo129.jpg

wKiom1NQ_7qj76xyAALKHxfReRY804.jpg

wKioL1NQ_5GiyzopAAMbDA_p4Dw532.jpg

wKiom1NQ_7rxXe-zAAK2xG_5isI043.jpg

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

wKioL1NUiXyT5i_kAACiJHVbZPs707.jpg

#配置真实路由器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

wKiom1NUjAKDVsLHAAJS9VD9JxE595.jpg

wKioL1NUi9mDym0DAAG4Xzud-oc620.jpg

至此,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服务器做水平扩展&#xf…...

Unity光照相关

1. 光源类型 Unity支持多种类型的光源,包括: 1. 点光源(Point Light):从一个点向四周发射光线,适用于需要突出物体的光源。 2. 平行光(Directional Light):从无限远处…...

Qt基本类型

QT基本数据类型定义在#include <QtGlobal> 中&#xff0c;QT基本数据类型有&#xff1a; 类型名称注释备注qint8signed char有符号8位数据qint16signed short16位数据类型qint32signed short32位有符号数据类型qint64long long int 或(__int64)64位有符号数据类型&#x…...

前端基础(Element、vxe-table组件库的使用)

前言&#xff1a;在前端项目中&#xff0c;实际上&#xff0c;会用到组件库里的很多组件&#xff0c;本博客主要介绍Element、vxe-table这两个组件如何使用。 目录 Element 引入element 使用组件的步骤 使用对话框的示例代码 效果展示 vxe-table 引入vxe-table 成果展…...

C++学习记录——이십팔 C++11(4)

文章目录 包装器1、functional2、绑定 这一篇比较简短&#xff0c;只是因为后要写异常和智能指针&#xff0c;所以就把它单独放在了一篇博客&#xff0c;后面新开几篇博客来写异常和智能指针 包装器 1、functional 包装器是一个类模板&#xff0c;对可调用对象类型进行再封装…...

UE学习记录03----UE5.2 使用拖拽生成模型

0.创建蓝图控件&#xff0c;自己想要展示的样子 1.侦测鼠标拖动 2.创建拖动操作 3.拖动结束时生成模型 3.1创建actor , 创建变量EntityMesh设为可编辑 生成Actor&#xff0c;创建变量EntityMesh设为可编辑 屏幕鼠标位置转化为3D场景位置 4.将texture设置为变量并设为可编辑&am…...

Spring Cache框架(缓存)

1、介绍&#xff1a; Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单加个注解&#xff0c;就能实现缓存功能。它提供了一层抽象&#xff0c;底层可以切换不同的cache实现。具体就是通过CacheManager 接口来实现不同的缓存技术。 针对不同…...

Linux学习之Ubuntu 20使用systemd管理OpenResty服务

sudo cat /etc/issue可以看到操作系统的版本是Ubuntu 20.04.4 LTS&#xff0c;sudo lsb_release -r可以看到版本是20.04&#xff0c;sudo uname -r可以看到内核版本是5.5.19&#xff0c;sudo make -v可以看到版本是GNU Make 4.2.1。 需要先参考我的博客《Linux学习之Ubuntu 2…...

[数据集][目标检测]疲劳驾驶数据集VOC格式4类别-4362张

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;4362 标注数量(xml文件个数)&#xff1a;4362 标注类别数&#xff1a;4 标注类别名称:["closed_eye","closed_mouth"…...

matlab使用教程(25)—常微分方程(ODE)选项

1.ODE 选项摘要 解算 ODE 经常要求微调参数、调整误差容限或向求解器传递附加信息。本主题说明如何指定选项以及每个选项与哪些微分方程求解器兼容。 1.1 选项语法 使用 odeset 函数创建 options 结构体&#xff0c;然后将其作为第四个输入参数传递给求解器。例如&#xff0…...

MybatisPlus简单到入门

一、MybatisPlus简介 1、入门案例&#xff08;重点&#xff09;&#xff1a; 1.SpringBoot整合MP1).创建新模块选择&#xff0c;Spring项初始化。2).选择当前模块使用的技术&#xff0c;只保留MySQL Driver就行&#xff0c;不要选择mybatis避免与后面导入mybatisPlus的依赖发…...

9. 优化器

9.1 优化器 ① 损失函数调用backward方法&#xff0c;就可以调用损失函数的反向传播方法&#xff0c;就可以求出我们需要调节的梯度&#xff0c;我们就可以利用我们的优化器就可以根据梯度对参数进行调整&#xff0c;达到整体误差降低的目的。 ② 梯度要清零&#xff0c;如果梯…...

go学习之流程控制语句

文章目录 流程控制语句1.顺序控制2.分支控制2.1单分支2.2双分支单分支和双分支的四个题目switch分支结构 3.循环控制for循环控制while 和do...while的实现 4.跳转控制语句breakcontinuegotoreturngotoreturn 流程控制语句 介绍&#xff1a;在程序中&#xff0c;程序运行的流程…...

docker基于已有容器和通过Dockerfile进行制作镜像配置介绍

目录 一.制作镜像的两种方式 1.在已有容器中更新并提交这个镜像 2.使用Dockerfile来制作 二.基于容器制作镜像 1.格式 &#xff08;1&#xff09;主要格式 &#xff08;2&#xff09;可选参数 2.案例 基于容器创建镜像设置标签并进行验证是否可用 &#xff08;1&…...

2022年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;最长上升子序列 一个数的序列bi&#xff0c;当b1 < b2 < … < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN)&#xff0c;我们可以得到一些上升的子序列(ai1, ai2, …, aiK)&#xff0c;这里1 < i1 < i2 &…...

二级MySQL(九)——表格数据处理练习

在Mysql中&#xff0c;可以用INSERT或【REPLACE】语句&#xff0c;向数据库中已一个已有的表中插入一行或多行记录。 在Mysql中&#xff0c;可以用【DELETE】或【TRUNCATE】语句删除表中的所有记录。 在Mysql中&#xff0c;可以用【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屏幕线束定义&#xff1a; 一、STM32 CubeMX 设置 时钟树 这里设置的时钟&#xff0c;关于刷新速度 举例子&#xff1a;LCD_CLK24MHz 时…...

Redis问题集合(三)在Redis容器里设置键值对

前言 前提是已经拉取了Redis镜像并创建了对应的容器做个记录&#xff0c;方便后续查看 步骤 查看Redis容器的ID&#xff1a;docker ps -a 进入容器&#xff1a;docker exec -it 容器ID /bin/bash进入redis命令行&#xff1a;redis-cli输入密码&#xff1a;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…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...