keepalived高可用lvs-dr 負載均衡httpd

  這次實踐主要是嘗試:keepalived高可用lvs,完成對後端主機的負載均衡。lvs使用最爲常用的DR模型,DIP,RIPs使用內網地址,節省公網IP的使用。

一、實驗要求

    要求任何一臺代理服務器不可用時,不影響正常訪問,任何一臺真實主機服務不可用時,不影響正常訪問。

二、實驗環境

  這裏假設192.168.0.0/24作爲外網地址(因爲它確實能連接外網),192.168.100.0/24作爲內網網絡,前端代理放置在外網,真實服務器放在內網。這樣設計可以使用更少的IP完成架構。這裏要注意的是:1.要了解DR模型中的要點,需要所有的網卡都要在一個物理網絡中,才能修改MAC實現轉發;2.內網主機要求只有內網(保證其默認網關要指向內網路由),這裏實在虛擬機內操作的,沒用xshell。

  實驗中物理圖如下:wKioL1c5LuagaEWQAACdfaKcIng538.png

   系統中服務器配置(mysql服務器沒有配置,不影響實驗):

系統
角色IP網關軟件
CentOS 6.6前端代理192.168.0.140
192.168.100.140
192.168.0.1keepalived+lvs(dr)
CentOS 6.6前端代理192.168.0.141
192.168.100.141
192.168.0.1keepalived+lvs(dr)
CentOS 6.6web服務器192.168.100.142192.168.100.146httpd
CentOS 6.6web服務器192.168.100.143192.168.100.146httpd
CentOS 6.6內網路由

192.168.0.146

192.168.100.146

192.168.0.1


   *說明keepalived VIP爲192.168.0.144。

三、搭建後端web服務器,設置lvs(dr)模型真實服務器設置

  搭建web服務器只要簡單設置就可以了,這裏不在重複,要記住標準化環境;這裏設置不同的頁面標識調度器的情況,這裏僅僅提供了不同的index頁面。

  真實主機的設置使用腳本初始化:

#cat dr.sh
#!/bin/sh
#
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 192.168.0.144 netmask 255.255.255.255 broadcast 192.168.0.144
route add -host 192.168.0.144 gw 192.168.0.144

  腳本兩臺RS上都要運行,驗證下web服務器可用。真實服務器準備好了。

四、建立前端的keepalived高可用

   在兩臺前端反向代理安裝keepalived,ipvsadm,修改/etc/keepalived/keepalived.conf,配置如下:

  CentOS6-140的keepalived配置:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node2
   vrrp_mcast_group4 224.0.29.18
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 20
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11112222
    }
    virtual_ipaddress {
        192.168.0.144 dev eth0 label eth0:0 
    }
}

virtual_server 192.168.0.144 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
#    persistence_timeout 50
    protocol TCP

    sorry_server 127.0.0.1  80

    real_server 192.168.100.142 80 {
        weight 1
        HTTP_GET {
            url { 
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.100.143 80 {
        weight 1
        HTTP_GET {
            url { 
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

   CentOS6-141的keepalived配置如下:

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node2
   vrrp_mcast_group4 224.0.29.18
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 20
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 11112222
    }
    virtual_ipaddress {
        192.168.0.144 dev eth0 label eth0:0 
    }
}

virtual_server 192.168.0.144 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
#    persistence_timeout 50
    protocol TCP

    sorry_server 127.0.0.1  80

    real_server 192.168.100.142 80 {
        weight 1
        HTTP_GET {
            url { 
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.100.143 80 {
        weight 1
        HTTP_GET {
            url { 
              path /index.html
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

  先啓動從服務器,查看IP:

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:31:79:fe brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.141/24 brd 192.168.0.255 scope global eth3
    inet 192.168.0.144/32 scope global eth3
    inet6 fe80::250:56ff:fe31:79fe/64 scope link 
       valid_lft forever preferred_lft forever
3: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:35:d5:87 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.141/24 brd 192.168.100.255 scope global eth2
    inet6 fe80::250:56ff:fe35:d587/64 scope link 
       valid_lft forever preferred_lft forever

  可以看到keepalived備服務器已經取得了IP地址,再啓動主服務器可用看到從服務器IP被主服務器奪了過去。

[root@CentOS6-140-basic ~]# service keepalived start
Starting keepalived:                                       [  OK  ]
[root@CentOS6-140-basic ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4a:2a:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.140/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.144/32 scope global eth0:0
    inet6 fe80::20c:29ff:fe4a:2a21/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:24:1e:26 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.140/24 brd 192.168.100.255 scope global eth1
    inet6 fe80::250:56ff:fe24:1e26/64 scope link 
       valid_lft forever preferred_lft forever

  從前端主機請求後端真實的web服務(這裏實驗設置的web服務器內容不一致,真實服務器要求一致):

[root@CentOS6-140-basic ~]# curl http://192.168.100.142
<h1>server 142</h1>
[root@CentOS6-140-basic ~]# curl http://192.168.100.143
<h1>server 143</h1>

 查看lvs的轉發情況:

# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.144:http rr
  -> 192.168.100.142:http         Route   1      0          0         
  -> 192.168.100.143:http         Route   1      0          0

五、設置內網路由器

  這時候請求http://192.168.0.144不能請求到。實際上可以看到lvs鏈接記錄,但是不會得到迴應,因爲後端這時服務器不知道該向哪裏轉發,找不到網關MAC信息。

  這裏需要配置雙網的內網路由器轉發。

  配置路由器可以轉發:

[root@CentOS6-146 ~]# cat /proc/sys/net/ipv4/ip_forward 
1

  設置IP地址和路由如下:

[root@CentOS6-146 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:3e:e1:4f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.146/24 brd 192.168.0.255 scope global eth0
    inet 192.168.100.146/24 brd 192.168.100.255 scope global eth0:0
    inet6 fe80::250:56ff:fe3e:e14f/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:50:56:2b:e1:67 brd ff:ff:ff:ff:ff:ff

 配置路由:

# route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0       192.168.0.1         0.0.0.0         UG    0      0        0 eth0

六、測試

wKioL1c5O4nzyv4iAAC3CwJgnR8110.gif

七、總結

  實驗中出現問題:

  1.keepalived 140對142監控可以連接上,但是從來不把請求轉發到142服務器,其他正常。以後再做一次看看什麼問題;

 2.實驗中keepalive對真實主機的測試,回被記錄到access日誌中,可以再建立虛擬主機並設置日誌的位置,方便線上統計;

 3.現有的結構中除了沒有提供mysql(當然也需要高可用),由於http協議是無狀態協議,對於一次用戶訪問,session不會和調度一致,理論上也屬於單點故障,所以後期還可以添加session的解決方案,比如session 集羣或session server。想想還有好多東西要做,後期慢慢完善。

  實驗中有的地方值得留下mark,搭建結構的步驟很重要,弄清來龍去脈:

  1. 做好需求,安裝好服務器的各種軟件(可能沒有內網YUM源,所以在外網環境中安裝好);

  2. 網絡設計:搞清楚DR要求的條件,VIP、DIP、RIPs要求在一個物理網絡,DIP,RIPs可以用私網地址但是使用私網地址需要設置內網路由;設置內網路由,那麼需要開啓轉發功能;當然在實際環境中可能一個真實路由器搞定了,路由器性能要好點,畢竟需要轉發響應報文,而響應報文是需要轉發能力和帶寬的,不容忽視;

  3. 良好的步驟和驗證:

  首先,設計內網真實的主機,能夠正常服務;

   其次,設置外網負載均衡,保證能夠動態負載後端,任何一臺前端或後端失敗都不會影響後端服務器正常訪問;

   再次,設置內網路由器,確保其能夠轉發,最好外網自己的主機設置返回內網的路由條目,使內網的報文能夠返回到內網服務器,這時候用RS是能夠ping外網主機,路由功能正常。

 4.確保內網主機使用默認網關爲內網路由器的內網地址。

  快速完成架構部署還不是熟練,儘量一步一步趨於完善。

  實驗就是這樣了,如果有對其中實驗的問題,歡迎留言! 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章