這次實踐主要是嘗試:keepalived高可用lvs,完成對後端主機的負載均衡。lvs使用最爲常用的DR模型,DIP,RIPs使用內網地址,節省公網IP的使用。
一、實驗要求
要求任何一臺代理服務器不可用時,不影響正常訪問,任何一臺真實主機服務不可用時,不影響正常訪問。
二、實驗環境
這裏假設192.168.0.0/24作爲外網地址(因爲它確實能連接外網),192.168.100.0/24作爲內網網絡,前端代理放置在外網,真實服務器放在內網。這樣設計可以使用更少的IP完成架構。這裏要注意的是:1.要了解DR模型中的要點,需要所有的網卡都要在一個物理網絡中,才能修改MAC實現轉發;2.內網主機要求只有內網(保證其默認網關要指向內網路由),這裏實在虛擬機內操作的,沒用xshell。
系統中服務器配置(mysql服務器沒有配置,不影響實驗):
系統 | 角色 | IP | 網關 | 軟件 |
CentOS 6.6 | 前端代理 | 192.168.0.140 192.168.100.140 | 192.168.0.1 | keepalived+lvs(dr) |
CentOS 6.6 | 前端代理 | 192.168.0.141 192.168.100.141 | 192.168.0.1 | keepalived+lvs(dr) |
CentOS 6.6 | web服務器 | 192.168.100.142 | 192.168.100.146 | httpd |
CentOS 6.6 | web服務器 | 192.168.100.143 | 192.168.100.146 | httpd |
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
六、測試
七、總結
實驗中出現問題:
1.keepalived 140對142監控可以連接上,但是從來不把請求轉發到142服務器,其他正常。以後再做一次看看什麼問題;
2.實驗中keepalive對真實主機的測試,回被記錄到access日誌中,可以再建立虛擬主機並設置日誌的位置,方便線上統計;
3.現有的結構中除了沒有提供mysql(當然也需要高可用),由於http協議是無狀態協議,對於一次用戶訪問,session不會和調度一致,理論上也屬於單點故障,所以後期還可以添加session的解決方案,比如session 集羣或session server。想想還有好多東西要做,後期慢慢完善。
實驗中有的地方值得留下mark,搭建結構的步驟很重要,弄清來龍去脈:
做好需求,安裝好服務器的各種軟件(可能沒有內網YUM源,所以在外網環境中安裝好);
網絡設計:搞清楚DR要求的條件,VIP、DIP、RIPs要求在一個物理網絡,DIP,RIPs可以用私網地址但是使用私網地址需要設置內網路由;設置內網路由,那麼需要開啓轉發功能;當然在實際環境中可能一個真實路由器搞定了,路由器性能要好點,畢竟需要轉發響應報文,而響應報文是需要轉發能力和帶寬的,不容忽視;
良好的步驟和驗證:
首先,設計內網真實的主機,能夠正常服務;
其次,設置外網負載均衡,保證能夠動態負載後端,任何一臺前端或後端失敗都不會影響後端服務器正常訪問;
再次,設置內網路由器,確保其能夠轉發,最好外網自己的主機設置返回內網的路由條目,使內網的報文能夠返回到內網服務器,這時候用RS是能夠ping外網主機,路由功能正常。
4.確保內網主機使用默認網關爲內網路由器的內網地址。
快速完成架構部署還不是熟練,儘量一步一步趨於完善。
實驗就是這樣了,如果有對其中實驗的問題,歡迎留言!