LVS+Keepalived負載均衡實踐與心得補遺

一.實踐背景,分析:

公司研發的業務系統某個功能頻繁出現數據庫Mysql性能問題,導致系統使用卡頓,響應慢,且數據庫所在服務器CPU負載居高不下,影響其他項目系統的正常數據庫訪問和使用。除去研發人員優化sql工作外,作爲運維人員可以嘗試對當前服務架構改造,目前架構大致如下:

如上圖所示,當前壓力都集中在數據庫這一節點上,且代碼上沒有做讀寫分離,也一定程度上影響了系統性能。雖然有主從複製備庫存在,但是當DB出現故障時,切換操作需要耗費一定的時間,實時性比較差。經過與研發同學討論決定把架構改成如下:

如此一來避免了數據庫單一節點故障的問題,針對Mysql來說,主主複製若出現故障,恢復步驟較主從複製繁瑣。但是出於DB服務器系統本身的負載和性能考慮,圖上該架構性能較優。

二.搭建環境:

1.下載keepalived和lvs(ipvsadm)源碼包,編譯安裝,此處不贅述詳細過程,僅提供經測試有效的配置文件,

首先是在兩個LVS節點上都要部署的keepalived和lvs服務:

/etc/keepalived/keepalived.conf:

! Configuration File for keepalived

global_defs {
    router_id LVS_2  # 設置lvs的id,在一個網絡內應該是唯一的
}

#vrrp_sync_group test_group {
#group {
#  VI_1
#}
#}

vrrp_instance VI_1 {
    state BACKUP   #指定Keepalived的角色,MASTER爲主,BACKUP爲備
    interface eth0  #虛擬ip所在網
 #   lvs_sync_daemon_interface eth0
    virtual_router_id 51  #虛擬路由編號,主備要一致
    priority 50  #定義優先級,數字越大,優先級越高,主DR必須大於備用DR
    advert_int 1  #檢查間隔,默認爲1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.7.247/24  #定義虛擬IP(VIP)爲10.0.7.247,可多設,每行一個
    }
}
# 定義對外提供服務的LVS的VIP以及port
virtual_server 10.0.7.247 80 {
    delay_loop 6 # 設置健康檢查時間,單位是秒
    lb_algo wlc # 設置負載調度的算法爲wlc 基於權重的調度算法
    #lb_algo wrr # 設置負載調度的算法爲wrr 加權輪詢調度算法
   # lb_algo rr # 設置負載調度的算法爲wrr 輪詢調度算法
    lb_kind DR # 設置LVS實現負載的機制,有NAT、TUN、DR三個模式,該處使用直接路由模式DR
    nat_mask 255.255.255.0
   # persistence_timeout 20 會話保持時間   (爲了實驗效果可以註釋掉該選項)
    protocol TCP

  real_server 10.0.7.211 80 {  # 指定real server1的IP地址
        weight 60   # 配置節點權值,數字越大權重越高
        TCP_CHECK {
        connect_timeout 20
        nb_get_retry 3
        #delay_before_retry 3
        connect_port 80
        }
    }
  real_server 10.0.7.29 80 {  # 指定real server2的IP地址
        weight 40  # 配置節點權值,數字越大權重越高
        TCP_CHECK {
        connect_timeout 20
        nb_get_retry 3
      # delay_before_retry 3
        connect_port 80
        }
     }
 }

/etc/init.d/lvs_server腳本(該腳本可以放置在/etc/init.d目錄下,配置爲系統服務,方便控制):

#!/bin/bash
#把一下內容保存成:lvs_server
#並放置在/etc/init.d目錄下
#如果想啓動LVS Server執行:/etc/init.d/lvs_server start
#如果想停止LVS Server執行:/etc/init.d/lvs_server stop
#如果想重啓LVS Server執行:/etc/init.d/lvs_server restart
#/sbin/ipvsadm 需要根據實際安裝路徑修改


VIP=10.0.7.247 #虛擬IP,更具具體情況而變
#有幾個輸入幾個,與下面的配置對應,同時必須與KeepAlived.config配置對應
RIP1=10.0.7.211 #實際的服務器IP
RIP2=10.0.7.29 #實際的服務器IP
. /etc/rc.d/init.d/functions # 如果提示權限不夠,那麼先在命令行執行: chmod 777 /etc/rc.d/init.d/functions
case "$1" in

start)
        echo "啓動LVS服務器"
          #設置虛擬IP和同步參數
          /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.0 up
          echo "1" >/proc/sys/net/ipv4/ip_forward
          #清空 IPVS的內存數據
          /sbin/ipvsadm -C


          #開啓WEB 80 端口服務,並指向RIP1和RIP2的服務器
          /sbin/ipvsadm -A -t $VIP:80 -s wlc
          /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 60
          /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 40
          #運行LVS
          /sbin/ipvsadm -ln
          ;;
stop)
       echo "關閉LVS服務器"
       echo "0" >/proc/sys/net/ipv4/ip_forward
       /sbin/ipvsadm -C
       /sbin/ifconfig eth0:0 down
       ;;

restart)
       echo "關閉LVS服務器"
       echo "0" >/proc/sys/net/ipv4/ip_forward
       /sbin/ipvsadm -C
       /sbin/ifconfig eth0:0 down

      echo "啓動LVS服務器"
      #設置虛擬IP和同步參數
      /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.0 up
      echo "1" >/proc/sys/net/ipv4/ip_forward
      #清空 IPVS的內存數據
      /sbin/ipvsadm -C

      #設置LVS
      #開啓WEB 80 端口服務,並指向RIP1和RIP2的服務器
      /sbin/ipvsadm -A -t $VIP:80 -s wlc
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 60
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 40
      #運行LVS
      /sbin/ipvsadm -ln
      ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

2.然後是部署在兩臺真實服務器real_server(這裏由於架構拓撲上lvs直接和web服務端連通,所以此處的真實服務器角色是兩個WEB SERVER節點)上的realserver腳本:

/etc/init.d/realserver,該腳本主要作用是用於真實服務器realserver與虛擬IP,即VIP通訊,轉發數據包,具體底層網絡原理可查閱相關文檔

#!/bin/bash
#把一下內容保存成:real_server
#並放置在root目錄下
#如果想啓動real Server執行:/root/real_server start
#如果想停止real Server執行:/root/real_server stop

CLUSTER_VIP=10.0.7.247 #虛擬IP,更具具體情況而變
. /etc/rc.d/init.d/functions # 如果提示權限不夠,那麼先在命令行執行: chmod 777 /etc/rc.d/init.d/fu
nctionscase "$1" in
start)
       /sbin/ifconfig lo:0 $CLUSTER_VIP netmask 255.255.255.255 broadcast $CLUSTER_VIP
       /sbin/route add -host $CLUSTER_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
       sysctl -p >/dev/null 2>&1
       echo "真實服務器啓動....."
       ;;
stop)
       /sbin/ifconfig lo:0 down
       /sbin/route del $CLUSTER_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 "真實服務器停止....."
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

3.最後依次啓動兩個真實服務器realserver上的realserver腳本建立網卡子接口,並啓動兩個LVS服務器上的keepalived服務和lvs_server腳本即可。檢查各服務器節點間防火牆放行規則,確保通訊成功。並在LVS服務器節點上可使用

while ((1));do ipvsadm -Ln;sleep 1;done

動態刷新查看lvs服務連接數的分發狀態等信息,如果修改lvs分發算法和權重,需要同步修改所有節點的配置文件,並在測試時候觀察實際連接數是否符合算法特徵。

三.心得體會

1.當前公司使用的阿里雲已經集成了收費的負載均衡功能,可以實時調整後端服務器訪問權重,lvs分發所使用的算法,不需要再繁瑣的專門分配單獨服務器部署lvs系統,也算是帶來了一定的便利性,用戶可以根據實際需要選用。

2.關於Mysql和後端服務器節點之間的架構,考慮到災後恢復的時效性,數據重建的便利性,性能負載的使用效率三個方面,上文描述中的選型不是最佳解決方案。包括如何分配數據庫服務器資源出來做讀寫分離,使用主主複製還是主從複製幾個問題,均有待後續研究和完善。

3.從測試後得出的結果來看,數據庫分流確實一定程度上解決了數據庫服務器本身的負載問題(包括CPU,磁盤IO),但是歸根到底還是要從sql的性能和數據結構等根本方面去優化,如果根本問題沒有得到解決,那也只能是治標不治本,代碼質量最關鍵 (成功甩鍋,逃)。

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