1. 程式人生 > >keepalived+lvs實現高可用負載均衡集群

keepalived+lvs實現高可用負載均衡集群

keepalived+lvs實現高可用

LVS實戰篇

1 環境準備

1.1 系統環境

1.1.1 系統版本

[root@lb01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@lb01 ~]# uname -r
2.6.32-696.el6.x86_64
[root@lb01 ~]# uname -m
x86_64

1.1.2 關閉安全機制

[root@lb01 ~]# sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/sysconfig/selinux
[root@lb01 ~]# setenforce 0
[root@lb01 ~]# /etc/init.d/iptables stop

1.1.3 更換yum源並添加epel

[root@lb01 ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
[root@lb01 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
[root@lb01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

1.2 主機及IP地址規劃

主機名

IP地址

說明

lb01

10.0.0.5

負載1

lb02

10.0.0.6

負載2

web02

10.0.0.7

web服務1

web01

10.0.0.8

web服務2

2 安裝ipvsadm

2.1 yum安裝

[root@lb01 ~]# yum install -y ipvsadm  ==》四臺服務器都要執行
[root@web02 ~]# rpm -qa ipvsadm    ==》四臺服務器都要執行
ipvsadm-1.26-4.el6.x86_64

2.2 做軟連接並查看是否加載內核模塊

[root@lb01 ~]# ln -s /usr/src/kernels/`uname -r` /usr/src/linux ==》只需在負載上執行即可
[root@lb01 ~]# ll /usr/src/
[root@lb01 ~]# lsmod |grep ip_vs ==》四臺服務器都要執行
ip_vs                 126705  0
libcrc32c               1246  1 ip_vs
ipv6                  336368  272 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6,ib_ipoib,ib_addr

註意:若用lsmod |graep ip_vs沒出現上述內容,則執行ipvsadm或者modprobe ip_vs命令即可 然後在執行lsmod |graep ip_vs即可出現上述內容

2.3 在負載上添加VIP

[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
或者
[root@lb02 ~]# ifconfig eth0:0 10.0.0.3/24 up

2.4 在負載上添加節點

[root@lb01 ~]# ipvsadm -C  ==》清空
[root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr  ==》增加vserver
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1 ==》添加節點
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# ipvsadm --set 30 5 60  ==》優化
[root@lb01 ~]# ipvsadm -Ln  ==》查看
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr
  -> 10.0.0.7:80                  Route   1      0          0        
  -> 10.0.0.8:80                  Route   1      0          0

2.5 RS上綁定VIP和一直ARP

[root@web01 ~]# ip addr add 10.0.0.3/32 dev lo label lo:0  ==》綁定VIP
或者
[root@web01 ~]# ifconfig lo:0 10.0.0.3/32 up
[root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore  ==》抑制ARP
[root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
##
[root@web02 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web02 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@web02 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@web02 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
##
[root@web01 ~]# route add -host 10.0.0.3 lo  ==》增加一條路由 不是必須的


2.6RS上搭建Web服務

詳細搭建過程在前面的nginx基礎篇已經介紹過,可以點擊下面的連接進行查看

http://blog.51cto.com/lzhnb/2095335

2.7 測試

在瀏覽器中輸入10.0.0.3進行訪問

技術分享圖片

可以在命令行輸入下面的命令進行監視

[root@lb01 ~]# watch -n 1 ipvsadm -Ln
Every 1.0s: ipvsadm -Ln                                                                                      Sat May 26 21:15:56 2018
 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr
  -> 10.0.0.7:80                  Route   1        1          0
  -> 10.0.0.8:80                  Route   1       2          0

3 ipvsadm常用參數總結

[root@lb01 ~]# ipvsadm --help
ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
  ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine]
  ipvsadm -D -t|u|f service-address
  ipvsadm -C
  ipvsadm -R
  ipvsadm -S [-n]
  ipvsadm -a|e -t|u|f service-address -r server-address [options]
  ipvsadm -d -t|u|f service-address -r server-address
  ipvsadm -L|l [options]
  ipvsadm -Z [-t|u|f service-address]
  ipvsadm --set tcp tcpfin udp
  ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
  ipvsadm --stop-daemon state
  ipvsadm -h
命令:    
允許長或短選項。    
--add-service -A添加具有選項的虛擬服務    
--edit-service -E使用選項編輯虛擬服務    
--delete-service -D刪除虛擬服務    
--clear -C清除整個表    
--restore -R從stdin恢復規則    
--save -S將規則保存到stdout    
--add-server -a添加帶有選項的實服務器    
--edit-server -e編輯帶有選項的實服務器    
--delete-server -d刪除真實服務器    
--list -L | -l列出表    
--zero -Z零計數器在服務或所有服務    
--set tcp tcpfin udp設置連接超時值    
--start-daemon啟動連接同步守護程序    
--stop-daemon停止連接同步守護程序    
--help -h顯示此幫助消息
 
選項:    
--tcp-service -t service-address service-address是host [:port]    
--udp-service -u service-address service-address是host [:port]    
--fwmark-service -f fwmark fwmark是一個大於零的整數    
--scheduler -s調度程序rr | wrr | lc | wlc | lblc | lblcr | dh | sh | sed | nq默認調度程序是wlc。     
--persistent -p [timeout]持久服務    
--netmask -M netmask持久粒度掩碼    
--real-server -r服務器地址服務器地址是主機(和端口)    
--gatewaying -g網關(直接路由)(默認)    
--ipip -i ipip encapsulation(tunneling)    
--masquerading -m偽裝(NAT)    
--weight -w實服務器的權重   
 --syncid sid syncid用於連接同步(默認值= 255)     
--ipip -i ipip encapsulation(tunneling)    
指定LVS的工作模式為隧道模式    
--masquerading -m偽裝(NAT)    
指定LVS的工作模式為NAT模式      
--u-threshold -x連接的閾值上限閾值    
--l-threshold -y lthreshold連接的下限閾值         
--mcast-interface接口用於連接同步的組播接口    
指定組播的同步接口    
--syncid sid syncid用於連接同步(默認值= 255)    
--connection -c當前IPVS連接的輸出    
顯示LVS目前的連接如:ipvsadm -L -c    
超時輸出超時(tcp tcpfin udp)    
顯示tcp tcpfin udp的超時值如:ipvsadm -L --timeout    
--daemon輸出守護進程信息    
顯示同步守護進程狀態    
統計信息的統計輸出    
顯示統計信息    
速率信息的速率輸出    
顯示速率信息    
閾值輸出閾值信息    
   --persistent-conn輸出持久連接信息    
服務/服務器條目的排序輸出    
對虛擬服務器和真實服務器排序輸出    
--ops -O單分組調度        
--numeric -n地址和端口的數字輸出    
 輸出IP地址和端口的數字形式       
-numeric -n輸出IP地址和端口的數字形式  
--stat選項是統計自那條轉發規則生效以來的包    
Conns(connections scheduled)已經轉發過的連接數    
InPkts(incoming packets)入包個數    
OutPkts(outgoing packets)出包個數    
InBytes(傳入字節)入流量(字節)      
OutBytes(outgoing bytes)出流量(字節)      
--rate選項是顯示速率信息    
CPS(current connection rate)每秒連接數    
InPPS(當前包速率)每秒的入包個數    
OutPPS(當前輸出包速率)每秒的出包個數    
InBPS(字節速率)每秒入流量(字節)    
OutBPS(current out byte rate)每秒入流量(字節)


4keepalived+lvs

4.1 安裝keepalived服務

[root@lb01 ~]# yum install keepalived -y  ==
》在負載上安裝


4.2 配置keepalived

[root@lb01 keepalived]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}
virtual_server 10.0.0.3 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
 
    real_server 10.0.0.7 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
    }
 }
    real_server 10.0.0.8 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
      }
 }
 
}

4.3 RS節點執行下面的腳本

[root@web02 init.d]# cat /etc/init.d/lvs
#!/bin/bash
#description Config LVS to realserver lo and apply noarp
#Written by LZH
 
VIP=10.0.0.3
. /etc/init.d/functions
 
case "$1" in
        start)
               ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
               #/sbin/route add -host $SNS_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 "RealServer Start OK"
               ;;
        stop)
               ifconfig lo:0 down
             #  route del $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 "RealServer Stoped"
               ;;
        *)
               echo "Usage: $0 {start|stop}"
               exit 1
        esac
 
        exit 0

註意需要給該腳本加上可執行權限!!!

[root@web02 init.d]# chmod +x /etc/init.d/lvs

keepalived+lvs 是生產中常用的實現lvs負載均衡的方法

5 lvs故障排錯思路

5.1 導致負載不均衡的原因

q LVS自身的會話保持參數設置(-p 300),優化:大公司常用cookies代替session

q LVS調度算法設置,如rrwrrwlclc

q 後端RS節點的會話保持參數,如apachekeepalived參數

q 用戶發送請求時間短,請求資源的大小

5.2 排錯思路

q 調度器上LVS調度規則及IP的正確性

q RS節點上VIP綁定和arp的抑制檢查

vip綁定處理方案:

? RS綁定的VIP做實時監控

? RS綁定的VIP 做成配置文件,/etc/sysconfig/network-scripts/ifcfg-lo:0

arp抑制處理方案:

? 如果是單個VIP,則可以用stop傳參設置0

? 若果RS有多個VIP綁定,即使stop也一定不要設置為0

q RS節點上自身提供服務的檢查(DR不能進行端口轉換)

q 利用輔助工具tcpdumpping等進行排查


keepalived+lvs實現高可用負載均衡集群