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

   ... ...

   }

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

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

相关文章

有线耳机插入电脑没声音

有线耳机插入电脑没声音 首先确保耳机和电脑都没问题,那就有可能是声音输出设备设置错误 右击任务栏的声音图标-打开声音设置-选择输出设备。

MySQL回表是什么?哪些情况下会回表

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…

iview时间控件 动态不可选日期 可选择24小时范围内 时间往后退24小时

演示 html 设定 起始时间 触发on-change 方法结束时间 options 动态设置不可选择的日期。 <!-- 起始时间 --> <FormItem :label"$t(startTime)" prop"startTime"><DatePickertransfertype"datetime":placeholder"$t(pleas…

php 系列题目,包含查看后端源代码

一、弱类型比较问题 原则&#xff1a; 1.字符串和数字比较&#xff0c;字符串回被转换成数字。 "admin" 0&#xff08;true) admin被转换成数字&#xff0c;由于admin是字符串&#xff0c;转换失败&#xff0c;变成0 int(admin)0,所以比较结果是ture 2.混合字符串转…

RD35M22AT、RD35M22BL、RD35M22DL插装式泄压阀

RD28M22AL、RD28M22BL、RD28M22CL、RD28M22DT、RD28M22AT、RD35M22AT、RD35M22BL、RD35M22DL、RD35M22WL插装式泄压阀 此结构在泄压时的压力非常稳定&#xff0c;若使用在低压时,请注意通过流量,不可超过35LPM。结构最大内漏量约(5滴/分, 设定压力的85%) 压力设定达到 210 ba…

抖音seo矩阵系统源代码开发部署分享

一、 开发步骤分享 抖音SEO矩阵系统源代码开发部署分享&#xff0c;需要经验丰富的开发人员和服务器管理人员&#xff0c;以下是大致的步骤&#xff1a; 确定你需要的功能和设计&#xff0c;确定开发人员和设计师的角色和任务分配&#xff0c;以及开发进度和计划。 确定服务器…

Java可视化物联网智慧工地SaaS平台源码:人脸识别考勤

基于微服务JavaSpring Cloud Vue UniApp MySql实现的智慧工地云平台源码 智慧工地是指利用云计算、大数据、物联网、移动互联网、人工智能等技术手段&#xff0c;为建筑施工现场提供智能硬件及物联网平台的解决方案&#xff0c;以实现建筑工地的实时化、可视化、多元化、智慧化…

[MyBatis系列②]Dao层开发的两种方式

目录 1、传统开发 1.1、代码 1.2、存在的问题 2、代理开发 2.1、开发规范 2.2、代码 ⭐mybatis系列①&#xff1a;增删改查 1、传统开发 传统的mybatis开发中&#xff0c;是在数据访问层实现相应的接口&#xff0c;在实现类中用"命名空间.id"的形式找到对应的映…

Elasticsearch 集成---框架集成SpringData-集成测试-索引操作

1.Spring Data 框架介绍 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的 开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce 框架和云计 算数据服务。 Spring Data 可以极大的简化 JPA &a…

【Vue框架】 router和route是什么关系

前言 之前没太注意&#xff0c;写着写着突然发现它们貌似不太一样&#xff0c;记录以下&#xff0c;回顾的看总结就好。 1、总结✨ route&#xff1a;当前激活路由的对象&#xff0c;用于访问和操作当前路由的信息 router&#xff1a;管理多个route的对象&#xff0c;整个应…

windows下安装go环境 和vscode中go扩展

1. 首先安装GO Go下载地址&#xff1a;go.dev 选择相对应的版本&#xff0c;下载&#xff0c;运行安装程序&#xff0c;并打开命令提示符&#xff0c;运行 go env &#xff0c;确认已经安装go 注意关注其中GOPATH和GOROOT&#xff0c;这两个地址可以在系统环境变量中进行设置…

纸贵科技连续三年蝉联IDC中国 FinTech 50榜单

近日&#xff0c;国际权威市场研究机构IDC公布了“2023 IDC中国FinTech 50榜单”。作为领先的区块链技术和解决方案服务商&#xff0c;纸贵科技凭借过硬的区块链技术和丰富的金融科技创新成果&#xff0c;连续第三年荣登IDC中国FinTech 50榜单。 IDC中国FinTech 50榜单是金融科…

【Apollo】自动驾驶感知——毫米波雷达

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Python科研数据可视化

在过去的20 年中&#xff0c;随着社会产生数据的大量增加&#xff0c;对数据的理解、解释与决策的需求也随之增加。而固定不变是人类本身&#xff0c;所以我们的大脑必须学会理解这些日益增加的数据信息。所谓“一图胜千言”&#xff0c;对于数量、规模与复杂性不断增加的数据&…

Java小游戏

一、需求 二、思路一 HP当然是怪物的一个属性成员&#xff0c;而武器是角色的一个属性成员&#xff0c;类型可以使字符串&#xff0c;用于描述目前角色所装备的武器。角色类有一个攻击方法&#xff0c;以被攻击怪物为参数&#xff0c;当实施一次攻击时&#xff0c;攻击方法被调…

阿里云配置MySQL-server 8.0远程登录

Ubuntu 22.04 LTS 安装MySQL-Server 8.0 # apt search mysql-server # apt install mysql-server重建服务 # service mysql stop # vi /etc/mysql/mysql.conf.d/mysqld.cnf ... bind-address 0.0.0.0 ... # service mysql start # lsof -i:3306 COMMAND PID USER FD …

创建k8s operator

目录 1.前提条件 2.进一步准备 2.1.安装golang 2.2.安装code&#xff08;vscode的linux版本&#xff09; 2.3.安装kubebuilder 3.开始创建Operator 3.1.什么是operator? 3.2.GV & GVK & GVR 3.3.创建operator 3.3.1. 生成工程框架 3.3.2.生成api(GVK) …

0101prox-shardingsphere-中间件

1 启动ShardingSphere-Proxy 1.1 获取 目前 ShardingSphere-Proxy 提供了 3 种获取方式&#xff1a; 二进制发布包DockerHelm 这里我们使用Docker安装。 1.2 使用Docker安装 step1&#xff1a;启动Docker容器 docker run -d \ -v /Users/gaogzhen/data/docker/shardings…

windows安装新openssl后依然显示旧版本

1、Windows环境下升级openssl后&#xff0c;通过指令openssl version -a查看版本号&#xff1a; 这个版本号是以前的老版本&#xff0c;不知道在哪里 2、网上找了老半天也没找到答案&#xff0c;最后通过指令 where openssl 才找到原来的openssl在哪里&#xff0c;把老的卸载掉…

【C# Programming】编程入门:数组、操作符、控制流

目录 一、数组 1、数组的声明 1.1 一维数组声明&#xff1a; 1.2 多维数组声明&#xff1a; 2、数组的实例化和赋值 2.1 数组在声明时通过在花括号中使用以逗号分隔的数据项对数组赋值&#xff0c; 例如&#xff1a; 2.2 如果在声明后赋值&#xff0c;则需…