前言

之前在某公司工作,接触到了相关的技术,其中有一项令我非常感兴趣 - - - 利用路由器协议(ospf、bgp)智能选路的能力实现集群高可用、负载均衡的效果。但是因为技术的盲区(我是linux运维兼开发,对交换机、路由器基本没接触过),始终没办法实现,为此还专门报名了华为认证的课程班,后才将此集群功能的模拟了出来。
此架构利用了ospf的原理,通过quagga服务将服务器和交换机设备结合在一起,达到负载均衡和高可用的目的,如果配备多个接口,也就具备了分布式的效果;

前期准备

1、电脑安装VMware虚拟机;
2、华为模拟器eNSP;
3、一台centos主机(后面会讲原因)

eNSP模拟器架构图

image.png
其中:

  • Cloud1和Cloud2是通过网卡桥接了VM虚拟机中的linux(centos7.9),实质上Cloud1/2 就是连接在AR路由器上的两台linux服务器,实际生产环境中也是这样的;
  • AR1和AR2路由配置并运行了ospf协议,分别发布了与自己相邻的网段;
  • LSW1和LSW2是两台交换机,没有任何配置,接入、测试 使用;
  • 下面的PC1/2/4是客户端,只用于ping测试,来测试高可用的效果;

架构图中标明了所有PC的IP、路由器的接口IP,细心的同学可能会发现,Cloud1和Cloud2上配置的lo:0网卡的IP竟然是相同的!在同一个网络中不能存在相同的IP,这是基本常识。对,你没看错,我也没写错,确实需要给两台linux服务器配置lo:0网卡,同时配置了相同的IP; ┗( ▔, ▔ )┛

整个架构图的部署测试过程

高可用、负载均衡的目标:172.33.33.33
意思就是在 pc1/2/3 上任意一台机器上ping 172.33.33.33 都能找到离自己最近的那台 172.33.33.33
比如,在 10.10.10.2或者10.10.10.3 上ping 172.33.33.33,那么它访问的就是左边cloud1的机器,因为左边的cloud1距离它们最近;如果在 11.11.11.2 上ping 172.33.33.33,那么它访问的就是右边的cloud2,因为右边的cloud2距离它比较近;
实现原理,利用了ospf协议进行最短路径选路,路由器通过ospf进行路由的交换,服务器如果也想要利用ospf进行路由的交换,就必须也运行ospf,而运行ospf协议的服务就是这个quagga!

一、模拟器桥接真机

如果你掌管着机房,并且有条件使用路由器和服务器的话,可以直接按照此架构图进行配置、测试,也就不需要使用ensp进行真机的桥接了;
桥接的目的就是让模拟器中的路由器可以和真实的linux系统连接起来;ensp中的cloud就是这个作用;

cloud1 桥接的是vm虚拟机中的centos,centos使用的网络模式为NAT,所以需要就必须要桥接vm8网卡(具体场景根据自己的网卡进行桥接);
由于vm虚拟机只能有一个NAT,所以,cloud2只能想办法桥接其他的,这里我使用以太网,也就是网线和另一台笔记本(centos7系统)进行了连接;

这是NAT模拟桥接vm8的相关网卡信息:
image.png
这是以太网网卡的相关信息:
image.png

在ensp中拉出cloud,双击打开,进行配置,以 cloud1 为例:
image.png

image.png

image.png

cloud1桥接了vm8(192.168.29.1),vm虚拟机中linux的ip是192.168.29.135,这样,它们通过vm8网卡就实现了ensp和vm虚拟机的连接;
同样,cloud2也是用此方法进行桥接,不过在第3步中要选择 【以太网---192.168.5.3】,然后用网线连接的另一台centos的笔记本配置ip为192.168.5.0/24网段的就可以了(我配置的是192.168.5.2)。

二、路由器配置ospf

首先按照图中给路由器的接口配置ip地址,此处略;然后配置ospf宣告路由;
以AR1为例:

[Huawei]ospf 1
[Huawei-ospf-1]area 0.0.0.0
[Huawei-ospf-1-area-0.0.0.0]network 10.10.10.0 0.0.0.255 
[Huawei-ospf-1-area-0.0.0.0]network 172.10.10.0 0.0.0.255 
[Huawei-ospf-1-area-0.0.0.0]network 192.168.29.0 0.0.0.255
[Huawei-ospf-1-area-0.0.0.0]display this 
[V200R003C00]
#
 area 0.0.0.0 
  network 10.10.10.0 0.0.0.255 
  network 172.10.10.0 0.0.0.255 
  network 192.168.29.0 0.0.0.255 
#
return

按照以上步骤依次在其他路由器上配置,不同的是network后面宣告的网段,必须是自己接口所在的网段。

三、linux安装和配置quagga

以cloud1为例

1、安装

这个简单,我用的是centos7,可以直接使用yum安装,当然,也可以去官网下载源码包安装;

yum install quagga -y

等待安装完成即可;
安装完成后系统就会新添4个服务:

[root@template quagga]# systemctl list-unit-files | grep ospf
ospf6d.service                                disabled
ospfd.service                                 enabled 
[root@template quagga]# systemctl list-unit-files | grep zebra
zebra.service                                 enabled 
[root@template quagga]# systemctl list-unit-files | grep bgp
bgpd.service                                  disabled
[root@template quagga]# systemctl list-unit-files | grep rip
ripd.service                                  disabled
ripngd.service                                disabled

分别是 ospf、zebra、bgp、rip,其中 ospf、bgp、rip都是交换机上常用的路由协议,想要用哪种协议,到时候就开启那个服务;而zebra是quagga本身的核心服务,无论用哪种协议,这个zebra都要开启的;

同时,系统的 /etc/quagga/ 下也就有了默认的配置文件,不过基本上都是空的,也补全,后面都需要手动新建、配置;

2、配置ospf

quagga的配置有两种方式,一种是修改配置文件,另一种是进入quagga的终端,使用命令行配置;
在shell下执行 vtysh 就可以进入quagga的终端

[root@template quagga]# vtysh 

Hello, this is Quagga (version 0.99.22.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

template.centos.xpt# 
  clear        Reset functions
  configure    Configuration from vty interface
  copy         Copy from one file to another
  debug        Enable debug messages for specific or all part.
  disable      Turn off privileged mode command
  end          End current mode and change to enable mode
  exit         Exit current mode and down to previous mode
  list         Print command list
  no           Negate a command or set its defaults
  ping         Send echo messages
  quit         Exit current mode and down to previous mode
  show         Show running system information
  ssh          Open an ssh connection
  start-shell  Start UNIX shell
  telnet       Open a telnet connection
  terminal     Set terminal line parameters
  traceroute   Trace route to destination
  undebug      Disable debugging functions (see also 'debug')
  write        Write running configuration to memory, network, or terminal

终端内的配置命令和思科的命令几乎是一致的,这里因为我对思科的命令不太熟悉,所以选择了使用修改配置文件的方式;其实都是一样的,在终端内使用命令配置,保存后一样会在生成对应的配置文件;

---在/etc/quagga/下修改 zebra.conf:

hostname Router01
password zebra
debug zebra events
debug zebra packet
debug zebra rib
log file /var/log/quagga/zebra.log

hostname 是主机表示,可以随便写,不要和其他重复即可;
password是密码;
log file 后面是quagga的日志文件;

---在/etc/quagga/下新建 ospfd.conf:

hostname ospfd
password zebra
debug ospf event
debug ospf packet all
router ospf
ospf router-id 192.168.29.129
network 192.168.29.0/24 area 0.0.0.0
network 172.33.33.0/24 area 0.0.0.0
log file /var/log/quagga/ospfd.log

hostname 是ospf主机表示;
password是密码;
router 表示运行的ospf协议;
ospf router-id 是ospf通信的唯一id,必须是唯一的,因为路由器中ospf也会有自己的router-id;
network 是要宣告的网段,一个是和路由器相连的网段,另一个就是要实现高可用负载均衡的ip了(也可以是ip网段);
log file 是ospfd服务的日志文件;

保存退出;

3、配置辅助ip

----首先为什么要配置辅助ip
因为我们利用quagga运行ospf协议,并且也发布了 172.33.33.33 的路由,整个架构中的节点通过ospf报文,都相互学习到了彼此的路由条目,所有访问 172.33.33.33 的数据包就都会路由到cloud1上来,也就是配置了quagga的那台服务器。因为数据包到达服务器之后,服务器要进行处理,就必须有 172.33.33.33 这个ip来接收

----如何配置
执行:

ifconfig lo:0 172.33.33.33 broadcast 172.33.33.33 netmask 255.255.255.0 up

就会给本机的lo网卡配置一个ip,此ip的目的就是来接收、处理到达本机的172.33.33.33的数据包的;
或者给linux直接再添加一个网卡,配置ip为172.33.33.33,也是可以的;

4、启动服务

不管使用ospf还是bgp或者是rip都要运行 zebra服务:

[root@template quagga]# systemctl start zebra.service

然后运行ospfd(以为使用的是ospf协议):

[root@template quagga]# systemctl start ospfd.service

查看运行服务:

[root@template quagga]# netstat -tunlp 
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      866/zebra           
tcp        0      0 127.0.0.1:2604          0.0.0.0:*               LISTEN      880/ospfd
...省略...

可以看到已经启动成功了。这个时候它们已经相互学习到彼此的路由条目了;
查看cloud1(centos7)上的路由:

[root@template ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.29.2    0.0.0.0         UG    100    0        0 ens33
10.10.10.0      192.168.29.111  255.255.255.0   UG    11     0        0 ens33
11.11.11.0      192.168.29.111  255.255.255.0   UG    13     0        0 ens33
172.10.10.0     192.168.29.111  255.255.255.0   UG    11     0        0 ens33
172.20.20.0     192.168.29.111  255.255.255.0   UG    12     0        0 ens33
172.33.33.33    0.0.0.0         255.255.255.255 UH    10     0        0 lo
192.168.5.0     192.168.29.111  255.255.255.0   UG    13     0        0 ens33
192.168.29.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

看,整个架构中所有的路由都已经有了;

查看 AR1 上的路由:

[Huawei]display ip routing-table
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
         Destinations : 17       Routes : 17       

Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

     10.10.10.0/24  Direct  0    0           D   10.10.10.111    GigabitEthernet
2/0/0
   10.10.10.111/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
2/0/0
   10.10.10.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
2/0/0
     11.11.11.0/24  OSPF    10   3           D   172.10.10.222   GigabitEthernet
0/0/1
      127.0.0.0/8   Direct  0    0           D   127.0.0.1       InLoopBack0
      127.0.0.1/32  Direct  0    0           D   127.0.0.1       InLoopBack0
127.255.255.255/32  Direct  0    0           D   127.0.0.1       InLoopBack0
    172.10.10.0/24  Direct  0    0           D   172.10.10.111   GigabitEthernet
0/0/1
  172.10.10.111/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
0/0/1
  172.10.10.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
0/0/1
    172.20.20.0/24  OSPF    10   2           D   172.10.10.222   GigabitEthernet
0/0/1
   172.33.33.33/32  OSPF    10   11          D   192.168.29.135  GigabitEthernet
0/0/0
    192.168.5.0/24  OSPF    10   3           D   172.10.10.222   GigabitEthernet
0/0/1
   192.168.29.0/24  Direct  0    0           D   192.168.29.111  GigabitEthernet
0/0/0
 192.168.29.111/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
0/0/0
 192.168.29.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
0/0/0
255.255.255.255/32  Direct  0    0           D   127.0.0.1       InLoopBack0

路由器也通过ospf学习到了所有的路由条目,包括172.33.33.33,同时 AR2 上也会学习到这些路由,不过通往172.33.33.33的路由是指向了 192.168.5.2(通过网线连接的那台centos7的笔记本) !
查看 AR2 上的路由:

[Huawei]display ip routing-table 
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
         Destinations : 17       Routes : 17       

Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

     10.10.10.0/24  OSPF    10   3           D   172.20.20.222   GigabitEthernet
0/0/0
     11.11.11.0/24  Direct  0    0           D   11.11.11.1      GigabitEthernet
0/0/1
     11.11.11.1/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
0/0/1
   11.11.11.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
0/0/1
      127.0.0.0/8   Direct  0    0           D   127.0.0.1       InLoopBack0
      127.0.0.1/32  Direct  0    0           D   127.0.0.1       InLoopBack0
127.255.255.255/32  Direct  0    0           D   127.0.0.1       InLoopBack0
    172.10.10.0/24  OSPF    10   2           D   172.20.20.222   GigabitEthernet
0/0/0
    172.20.20.0/24  Direct  0    0           D   172.20.20.111   GigabitEthernet
0/0/0
  172.20.20.111/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
0/0/0
  172.20.20.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
0/0/0
   172.33.33.33/32  OSPF    10   13          D   192.168.5.2     GigabitEthernet
0/0/0
    192.168.5.0/24  Direct  0    0           D   192.168.5.5     GigabitEthernet
2/0/0
    192.168.5.5/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
2/0/0
  192.168.5.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
2/0/0
   192.168.29.0/24  OSPF    10   3           D   172.20.20.222   GigabitEthernet
0/0/0
255.255.255.255/32  Direct  0    0           D   127.0.0.1       InLoopBack0

四、测试

篇幅有限,不再贴图;其实看路由器上172.33.33.33的路由就可以看的很清楚了;

1、在pc1/2上ping 172.33.33.33

在cloud1处抓包:可以抓到icmp报文
在cloud2处抓包:没有来自pc1/2的icmp报文

2、在pc4上ping 172.33.33.33

在cloud1处抓包:没有来自pc4的icmp报文
在cloud2处抓包:可以抓到来自pc4的icmp报文

3、将cloud1的和AR1的网线断开,模拟故障,再ping 172.33.33.33

模拟cloud1故障(宕机或者断开网线)之后,路由器通过ospf报文的交互会重新更新路由表,将去往172.33.33.33的数据包引导至cloud2上,实现高可用;此时再查看AR1的路由表,就会发现已经更新下一条了:

[Huawei]display ip routing-table
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Tables: Public
         Destinations : 17       Routes : 17       

Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface
...部分略
  172.10.10.255/32  Direct  0    0           D   127.0.0.1       GigabitEthernet
0/0/1
    172.20.20.0/24  OSPF    10   2           D   172.10.10.222   GigabitEthernet
0/0/1
   172.33.33.33/32  OSPF    10   11          D   172.10.10.222   GigabitEthernet
0/0/0
    192.168.5.0/24  OSPF    10   3           D   172.10.10.222   GigabitEthernet
...部分略

五、其他

1、架构图中的AR4(处于中间位置),到cloud1和2的距离是相同的,但是ospf依旧会通过算法选择出最优的路线,包括中间的节点数(少的优先)、网络状态(网络好的优先)、接口带宽(千兆口大于百兆口)等等...

2、实际应用
----高可用:通过这种方式将cloud1和cloud2两台机器放在不同的地方,防止单区域故障,比如同机房中不同的位置,或者同城中不同的机房(机房需要打通);
----负载均衡:假设机房购买了两个公网ip,通过路由器在机房中不同的位置接入,那么就可以将负载分成两部分,可以解决高并发的问题;

假设一个机房只有一个公网ip,那么不管你的机房内再怎么用集群、负载均衡,入口始终都是一个,在高并发时,入口就成了瓶颈,即便你机房内可以抗住此时的高并发;
通过两条公网带宽的方式类似于现在的CDN业务,用户就近访问;dns可以配置多个公网ip,这样的就把所有的流量分成了两份,减轻了入口负载;

示例图:(自画)
image.png
或者也可以和lvs等服务结合使用:(网图)
image.png
用法多种多样,最大的好处就是将服务器系统的负载均衡高可用和路由器结合了起来;

3、其实吧啦讲了一堆,原理很简单,就是利用了ospf而已,不过重点是如何让服务器也支持ospf,所以就需要安装quagga了,也可以不用quagga,使用其他开源支持路由协议的服务也行;然后就是两个(或者多个)服务器发布了一个相同的ip,这个ip就是负载均衡高可用的入口。

结尾

架构不仅限于此,还可以和docker等虚拟网卡结合使用,不过就需要有强大的判断数据包走向和路由配置的能力了,之前公司也确实是这么用的;
有疑问的可以留言,我会尽快解答,谢谢大家支持;

打赏
支付宝 微信
上一篇 下一篇