LVS(注意iptables和selinux的問題)

1.LVS(高負載)
  LVS(Linux虛擬服務器)
  Linux Virtual Server
  LVS集羣採用IP負載均和技術和基於內容請求分發技術。調取器具備很好的吞吐率,將請求均衡的轉移到不一樣的服務器執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能,高可用的虛擬服務器
  原理詳解
    http://junwang.blog.51cto.com/5050337/1439428/
  1.查看內核是否支持ipvslinux

    grep -i 'vs' /boot/config-3.17.4-301.fc21.i686+PAE
    grep -i 'vs' /boot/config-3.17.4-301.fc21.i686

 


  2.安裝ipvsadm
    yum install ipvsadm
  3.ipvsadm命令
    一、管理集羣服務
      1.添加:-Aipvsadm -A|E -t|u|f service-address
          -t:tcp協議集羣 -u:udp協議集羣 -f:防火牆標記集羣
      2.修改:-E
      3.刪除:-D ipvsadm -D -t|u|f service-address
    二、管理集羣服務中的RealServer
      1.添加:-aipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
          -r:RS的地址,NAT模型中,可用IP:PORT實現端口映射
          -g:DR模型 -i:TUN模型 -m:NAT模型 -w:權重
      2.修改:-e
      3.刪除:-d ipvsadm -d -t|u|f service-address -r server-address
    3.管理集羣服務的查看
      1.ipvsadm -L|l [options]
            options:-n:數字格式顯示
                --stats 統計信息
                --rate:統計速率
                --timeout:顯示tcp、tcpinfo、udp的會話超時時長
                -c:鏈接客戶端數量
    4.狀況計數器:ipvsadm -Z [-t|u|f service-address]

    5.狀況規則:ipvsadm –C

    6.保存規則:
        1.ipvsadm -S > /path/to/somefile
        2.ipvsadm-save > /path/to/somefile
        3.ipvsadm-restore < /path/to/somefile
    4.lvs調度算法:

        1. 固定調度
          i. rr:輪詢
          ii. wrr:加權輪詢
          iii. sh:source hash,源地址hash(必定時間內,相同的源地址發往相同的主機)session affinity、 session sharing
          iv. dh:對於同一個請求,發往同一個服務器(緩存服務器)

        2. 動態調度(默認爲wlc)
            i. lc(least-connection)最少鏈接
                1) active*256+inactive 誰的小,挑選誰
            ii. wlc:加權最少鏈接
                1) (active*256+inactive)/weight 誰的小,挑選誰
            iii. sed:最短時間望延遲
                1) (active+1)*256/weight 誰的小,挑選誰
            iv. nq:never queue(基於sed,不考慮incative)
            v. lblc(locality-based least-connection)基於本地的最少鏈接
            vi. lblcr:基於本地的帶複製功能的最少鏈接(緩存共享對象,兄弟服務器)
              儘量調度到相同的服務器,只有新請求發送到最少的服務器,沒有的話會去查詢兄弟服務器



    5.LVS之 DR模型
      DR模型原理

      當客戶端訪問集羣中的服務(例如web),源IP(定義爲A)和目標IP(定義爲B)如上圖所示,發送數據報文到調度器上

  <1>客戶端發送報文必須到調度器上,不能到Rearserver上,否則沒法實現調度
    實現原理:雖然RS上的lo口也配置VIP,可是卻沒法響應,經過以下配置在RS上實現web

    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

 



    arp_ignore(接受到arp請求時的響應級別,默認0)
      1) 0:只要本地配置有相應的地址,給予響應
      2) 1:僅在請求的目標地址配置請求到達的接口上的時候,纔給於響應
    arp_announce(將本身地址向外通告時的通告級別,默認0)
      1) 0:將本地任何接口上的任何地址向外通告
      2) 1:試圖僅向目標網絡通告語氣網絡匹配的地址
      3) 2:僅向與本地接口上地址匹配的網絡進行通告

   2.調度器收到報文後查詢ipvsadm規則,符合集羣服務後發送報文到RS上,源目IP地址不變,是經過修改MAC地址發送到RS上的,
    <1>調度器規則算法

    ipvsadm -A -t 192.168.11.100:80 -s wrr
    ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.12 -g -w 2
    ipvsadm -a -t 192.168.11.100:80 -r 192.168.11.13 -g -w 4

 



      RS收到報文後,發現目標IP爲本身的VIP(lo:0上配置,不對外響應,只作回報的源IP),用本身的VIP做爲源地址發送報文

    <1>如何實現發送報文時,源IP爲本身的lo:0上的VIP,默認linux報文從哪一個接口出源IP爲那個接口
      實現原理:緩存

      ifconfig lo:1 192.168.11.100 netmask 255.255.255.255 up (配置RS的VIP,不對外響應)

      route add -h 192.168.11.100 dev lo:0 (增長路由,報文目標IP爲192.168.11.100的接口爲lo:0,這樣回報也是經過lo:0回報,確保報文源IP爲VIP)

 



    <2>確保調度器上的發包正確,增長以下配置bash

    ifconfig eth:0 192.168.11.100 netmask 255.255.255.255 up (添加VIP地址)
    route add -h 192.168.11.100 dev eth:0 

 



    客戶端收到後源IP爲VIP,目的IP爲客戶端的IP,報文的封裝爲:RS經過本身的lo:0迴應報文,源IP則爲VIP,目標IP則爲客戶端IP

DR模型實現腳本
DR類型中,Director和RealServer的配置腳本示例:
服務器

 



Director腳本:網絡

#!/bin/bash
#
# LVS script for VS/DR
# chkconfig: - 90 10
#
. /etc/rc.d/init.d/functions
#
VIP=192.168.11.100
DIP=192.168.11.11
RIP1=192.168.11.12
RIP2=192.168.11.13
PORT=80
RSWEIGHT1=2
RSWEIGHT2=4
#
case "$1" in
start) 
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:1
# Since this is the Director we must be able to forward packets
echo 1 > /proc/sys/net/ipv4/ip_forward
# Clear all iptables rules.
/sbin/iptables -F
# Reset iptables counters.
/sbin/iptables -Z
# Clear all ipvsadm rules/services.
/sbin/ipvsadm -C
# Add an IP virtual service for VIP 192.168.0.219 port 80
# In this recipe, we will use the round-robin scheduling method. 
# In production, however, you should use a weighted, dynamic scheduling method. 
/sbin/ipvsadm -A -t $VIP:80 -s wrr
# Now direct packets for this VIP to
# the real server IP (RIP) inside the cluster
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w $RSWEIGHT1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w $RSWEIGHT2
/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;; 
stop)
# Stop forwarding packets
echo 0 > /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
/sbin/ipvsadm -C
# Bring down the VIP interface
/sbin/ifconfig eth0:0 down
/sbin/route del $VIP

/bin/rm -f /var/lock/subsys/ipvsadm

echo "ipvs is stopped..."
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ]; then
echo "ipvsadm is stopped ..."
else
echo "ipvs is running ..."
ipvsadm -L -n
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
;;
esac

 



RealServer腳本:session

#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: - 90 10
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
VIP=192.168.11.100
host=`/bin/hostname`
case "$1" in
start)
# Start LVS-DR real server on this machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
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
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:0 down
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
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $VIP`
isrothere=`netstat -rn | grep "lo:0" | grep $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 real server Running."
fi
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;;
esac 
相關文章
相關標籤/搜索