• LVS+OSPF 架构(转)


    http://blog.51cto.com/pmghong/1399385

    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

       ... ...

       }

  • 相关阅读:
    【WPF】数据验证
    CSS 属性:touch-action
    sublime text3 中设置默认浏览器,并且设置快捷键
    Git克隆、修改、更新项目,及查看项目地址命令
    监听文本框输入oninput和onpropertychange事件
    css基础笔记
    纯css,div隐藏滚动条,保留鼠标滚动效果。
    打印机如何取消打印任务
    git使用上
    Git设置记住账号密码
  • 原文地址:https://www.cnblogs.com/xiaohanlin/p/7901081.html
Copyright © 2020-2023  润新知