最近在研究 負載均衡。目前研究的是keepalived+lvs模式php
一、軟件介紹html
keepalived:顧名思義是保持存活,經常使用來搭建設備的高可用,防止業務核心設備出現單點故障。keepalived主要用做realserver的健康檢查以及負載均衡主機和backup主機之間的故障漂移。
linux
單點故障:在公司整個業務流程中,某一點出現故障就會致使整個系統架構不可用,單點故障常發生在數據庫、核心業務系統等。對此咱們的解決辦法是對核心業務系統進行高可用負載均衡。
web
LVS:Linux Virtual Server,linux虛擬服務器,是一個虛擬的服務器集羣系統。目前有三種負載均衡技術(VS/NAT、VS/TUN和VS/DR);十種調度算法(rrr|wrr|lc|wlc|lblcr|lblc|dh|sh|sed|nq)。
算法
二、實驗拓撲圖。shell
本次實驗一共用到4臺服務器,其中兩臺服務器用來搭建keepalived+lvs,另兩臺是對外提供服務的web服務器。
數據庫
本次實驗用到了5個ip地址。後端
Master:10.68.4.201 Backup:10.68.4.58
bash
web1:10.68.4.198 web2:10.68.4.248
服務器
virtualIP:10.68.4.199
三、拓撲圖介紹
keepalived--master和keepalived--backup 二者之間經過vrrp協議利用組播進行通訊,master主機對外接受請求並將請求轉發至後方的realserver,backup主機只接受請求而不轉發請求。某時刻當backup主機沒有接受到master主機發送的信息時,因而發送vrrp通告信息並廣播arp信息,宣城本身是master,若是收到其餘主機發送的通告信息的優先級比本身的高,那麼本身將繼續轉爲backup,優先級別高的機器,此時就是新master主機,並接替原master主機的工做。
每一個keepalived機器都對後方的realserver進行監控,只不過master負責將外部請求轉發至後方的realserver,backup則不做該處理。
四、keepalived安裝
keepalived的安裝參照這篇博客http://my.oschina.net/zyc1016/blog/138574?p=2#comments
keepalived的配置參照這篇博客http://bbs.nanjimao.com/thread-845-1-1.html
安裝的過程當中,若是報錯
checking for IPVS syncd support... yes
checking for kernel macvlan support... no
checking whether SO_MARK is declared... no
configure: error: No SO_MARK declaration in headers
那麼只須要在編譯時,添加--disable-fwmark參數便可。最後確保以下幾項爲yes狀態便可,加粗必定得是yes。
Use IPVS Framework : Yes IPVS sync daemon support : Yes IPVS use libnl : Yes Use VRRP Framework : Yes
! Configuration File for keepalived global_defs { notification_email { } router_id LVS_DEVEL } vrrp_instance VI_1 { #定義一個vrrp組,組名惟一 state MASTER #定義改主機爲keepalived的master主機 interface eth0 #監控eth0號端口 virtual_router_id 58 #虛擬路由id號爲58,id號惟一,這個id決定了多播的MAC地址 priority 150 #設置本節點的優先級,master的優先級 要比backup的優先級別高,數值要大 advert_int 1 #檢查間隔,默認爲1秒 authentication { auth_type PASS #認證方式,密碼認證 auth_pass 1111 #認證的密碼,這個密碼必須和backup上的一致 } virtual_ipaddress { #設置虛擬的ip, 這個ip是之後對外提供服務的ip。 10.68.4.199 } } virtual_server 10.68.4.199 80 { #虛擬主機設置,ip同上。 delay_loop 2 #服務器輪詢的時間間隔 lb_algo rr #lvs的調度算法 lb_kind DR #lvs的集羣模式 nat_mask 255.255.255.0 persistence_timeout 50 #會話超時50s protocol TCP #健康檢查是用tcp仍是udp real_server 10.68.4.248 80 { #後端真實主機1 weight 100 #每臺機器的權重,0表示不給該機器轉發請求,知道它恢復正常。 TCP_CHECK { #健康檢查項目,如下 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 10.68.4.198 80 { #後端真實主機2 weight 100 #每臺機器的權重,0表示不給該機器轉發請求,知道它恢復正常。 TCP_CHECK { #健康檢查項目,如下 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
backup主機的配置基本同上,只有如下地方須要修改。
state BACKUP #定義改主機爲keepalived的backup主機,監控主master priority 100 #設置本節點的優先級,數值要比master主機上的小
測試keepalived的故障漂移,
首先,在10.68.4.201和10.68.4.58上同時啓動keepalived,此時觀察master主機和backup主機
能夠看出虛擬ip此時綁定在4.201--master上,而後中止4.201上的keepalived服務
經過查看4.58上的日誌,能夠看到4.58已經宣告本身是master了。而且虛擬ip也漂移到新的mater機器上。
以上的配置,keepalived的高可用功能已經實現。
五、realserver服務器配置
本例中,我在4.198和4.248上,分別安裝了httpd,模擬兩臺web服務器。而後要在兩臺服務器上配置虛擬vip,這裏我寫了一個腳本。
#!/bin/bash #description: config realserver lo and apply noarp WEB_VIP=10.68.4.199 #虛擬vip,也就是虛擬ip . /etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP /sbin/route add -host $WEB_VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce 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/eth0/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/eth0/arp_announce echo "1" > /proc/sys/net/ipv4/conf/default/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/default/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $WEB_VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "0" > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/eth0/arp_announce echo "0" > /proc/sys/net/ipv4/conf/default/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/default/arp_announce echo "RealServer Stoped" ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $WEB_VIP` isrothere=`netstat -rn | grep "lo:0" | grep $WEB_VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac exit 0
將此腳本分別在4.198和4.248上執行下。此時,咱們在兩臺keepalived的主機上能夠查看到以下相同信息。
此時,咱們經過網頁訪問10.68.4.199,時,根據ipvsadm查詢到的realserver主機的順序,能夠看出此時優先訪問4.198.
而當咱們將4.198這臺機器的httpd的服務停掉,首先能夠看到兩臺keepalived主機都會將4.198這臺機器剔除,此時咱們再次查詢時ipvsadm,只能夠看到一臺web服務器,再次頁面訪問,這時就是在訪問4.248這臺機器了。
而當咱們修復好4.198機器後,keepalived又會自動將改服務器添加進來。
從上面的測試可知,lvs的負載均衡功能已經實現。
六、我碰到過的問題
頁面乜有任何顯示,思來想去就是找不到問題出在哪? 後面從論壇上看到一位網友也出現一樣的問題,細問下才知致使這個問題出現是由於咱們keepalived.conf 文件 的書寫格式存在問題,後面我回去從新檢查了下,發現少寫了一個 「}」 keepalived啓動時不會檢測keepalived.conf 配置文件語法格式。 因此之後再配置書寫時,必定要格外注意啊。