LVS(注意iptables和selinux的問題)


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

    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、管理集群服務
      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
    2、管理集群服務中的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上實現

    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>確保調度器上的發包正確,增加如下配置

    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腳本:

#!/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 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM