Keepalived、LVS

1 Keepalived介紹

Keepalived軟件主要是通過VRRP協議實現高可用功能的。

三個重要功能:

1、管理LVS負載均衡軟件

2、實現對LVS集羣節點健康檢查功能(healthcheck

3、作爲系統網絡服務的高可用功能

1VRRPVirtual Router Redundancy Protocol),爲了解決靜態路由的單點故障問題而出現

2VRRP是通過一種競選機制來將路由的任務交給某臺VRRP路由器的

3VRRP是用IP組播的方式(224.0.0.18)實現高可用對之間的通信

4)工作時主節點發包,備節點接包,當備節點收不到主節點的數據包時,就啓動接管程序接管主節點的資源。備節點可以有多個,通過優先級來競選

5VRRP使用了加密協議加密數據,但Keepalived推薦用明文的方式配置認證類型和密碼

2 Keepalived高可用服務搭建準備

安裝環境說明

14臺服務器:lb01lb02web01web02

2、系統環境:

[root@lb01 ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@lb01 ~]# uname -r
2.6.32-431.el6.x86_64
[root@lb01 ~]# ls -l /application/nginx/
總用量 36
drwx------ 2 nginx root 4096 6月  28 2017 client_body_temp
drwxr-xr-x 3 root  root 4096 3月  28 00:24 conf
drwx------ 2 nginx root 4096 6月  28 2017 fastcgi_temp
drwxr-xr-x 2 root  root 4096 6月  28 2017 html
drwxr-xr-x 2 root  root 4096 5月   1 18:07 logs
drwx------ 2 nginx root 4096 6月  28 2017 proxy_temp
drwxr-xr-x 2 root  root 4096 6月  28 2017 sbin
drwx------ 2 nginx root 4096 6月  28 2017 scgi_temp
drwx------ 2 nginx root 4096 6月  28 2017 uwsgi_temp

開始安裝keepalived軟件

yum install keepalived –y
[root@lb01 ~]# rpm -qa keepalived
keepalived-1.2.13-5.el6_6.x86_64
 
[root@lb02 ~]# rpm -qa keepalived
keepalived-1.2.13-5.el6_6.x86_64
啓動keepalived
/etc/init.d/keepalived start
 
[root@lb01 ~]# ps -ef|grep keep|grep -v grep
root       1855      1  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
root       1857   1855  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
root       1858   1855  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
 
[root@lb02 ~]# ps -ef|grep keep|grep -v grep
root       2118      1  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
root       2120   2118  0 20:53 ?        00:00:00 /usr/sbin/keepalived -D
root       2121   2118  0 20:53 ?        00:00:00 /usr/sbin/keepalived –D
默認情況下會啓動三個VIP地址
[root@lb01 ~]# ip addr|grep 192.168
    inet 192.168.4.125/24 brd 192.168.4.255 scope global eth0
    inet 192.168.200.16/32 scope global eth0
    inet 192.168.200.17/32 scope global eth0
inet 192.168.200.18/32 scope global eth0
測試完成後,關閉服務
[root@lb01 ~]# /etc/init.d/keepalived stop

 

Keepalived配置文件說明

1)全局定義部分

[root@lb01 ~]# ll /etc/keepalived/keepalived.conf
-rw-r--r-- 1 root root 3562 3月  19 2015 /etc/keepalived/keepalived.conf
[root@lb01 ~]# head -13 /etc/keepalived/keepalived.conf |cat -n
     1  ! Configuration File for keepalived
     2
     3  global_defs {
     4     notification_email {
     5       [email protected]
     6       [email protected]
     7       [email protected]
     8     }
     9     notification_email_from [email protected]
     10     smtp_server 192.168.200.1
     11     smtp_connect_timeout 30
     12     router_id LVS_DEVEL
        13  }

參數說明:

1行,註釋

2  空行

3~8行是定義服務故障報警的Email地址

9行,指定發送郵件的發送人

10smtp_server指定發送郵件的smtp服務器

11 連接smtp的超時時間

12 keepalived服務器的路由標識。在一個局域網內,這個標識應該是唯一

 

2VRRP實例定義區塊部分

[root@lb01 ~]# head -30 /etc/keepalived/keepalived.conf |cat -n|tail -16
    15  vrrp_instance VI_1 {
    16      state MASTER
    17      interface eth0
    18      virtual_router_id 51
    19      priority 100
    20      advert_int 1
    21      authentication {
    22          auth_type PASS
    23          auth_pass 1111
    24      }
    25      virtual_ipaddress {
    26          192.168.200.16
    27          192.168.200.17
    28          192.168.200.18
    29      }
    30  }

15行定義一個實例名字

16  當前實例VI_1的角色狀態,爲MASTER

17   網絡接口

18virtual_router_id爲虛擬路由ID標識,MASTERBACKUP必須一致

19 優先級,數字越大越高

20 同步通知間隔 目前爲1

21~24權限認證配置

25~29    爲虛擬IP地址

keepalived高可用服務單實例實戰

主服務器

[root@lb01 keepalived]# vim keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
}
 
配置完畢,啓動服務,查看是否有虛擬IP
[root@lb01 keepalived]# /etc/init.d/keepalived start
正在啓動 keepalived:                                      [確定]
[root@lb01 keepalived]# ip add |grep 192.168.4.130 
    inet 192.168.4.130/24 scope global secondary eth0:1

備服務器

[root@lb02 keepalived]# cat keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
}
啓動服務,檢查是否有虛擬IP
[root@lb02 keepalived]# /etc/init.d/keepalived start
正在啓動 keepalived:                                      [確定]
[root@lb02 keepalived]# ip add|grep 192.168.4.130
[root@lb02 keepalived]#

備節點沒有虛擬IP,表示配置正確

 

如果主備都出現了虛擬IP,說明高可用裂腦了,檢查:

1、主備之間是否通信正常,若不正常是否有防火牆阻擋

2、主備對應的keepalived.conf配置是否有誤,virtual_router_id配置不一致

3、硬件故障:心跳線壞了、網卡壞了、IP配置衝突等

進行高可用主備之間的切換實驗

[root@lb01 keepalived]# /etc/init.d/keepalived stop
停止 keepalived:                                          [確定]
[root@lb02 keepalived]# ip add|grep 192.168.4.130
inet 192.168.4.130/24 scope global secondary eth0:1
 
[root@lb01 keepalived]# /etc/init.d/keepalived start
正在啓動 keepalived:                                      [確定]
[root@lb01 keepalived]# ip add|grep 192.168.4.130
inet 192.168.4.130/24 scope global secondary eth0:1
[root@lb02 keepalived]# ip add|grep 192.168.4.130

nginx負載均衡配合keepalived服務

主備的負載均衡配置一致

[root@lb01 ~]# cat /application/nginx/conf/extra/lb_bbs.conf
server {
        listen     192.168.4.130:80;
        server_name  bbs.etiantian123.org;
        location / {
            proxy_pass http://bbs_server_pools;
            proxy_set_header Host      $host;
        }
    }
[root@lb01 ~]# cat /application/nginx/conf/nginx.conf
worker_processes  1;
error_log  logs/error.log;   
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
upstream bbs_server_pools{
  server 192.168.4.121:80   weight=1;
  server 192.168.4.122:80   weight=1;
}
    #include extra/lb_www.conf;
    include extra/lb_bbs.conf;
    include extra/lb_blog.conf;
}

解決監聽的網卡上不存在IP地址的問題

nginx配置監聽的時候,如果本地的網卡沒有這個監聽的地址,可能會報錯

解決:

/etc/sysctl.conf加入內核參數配置:

net.ipv4.ip_nonlocal_bind = 1

解決高可用只針對物理服務器的問題

如果nginx服務出現問題停止而keepalived服務還在工作,這就會導致用戶訪問的VIP無法找到對應的服務。

解決辦法:

1、寫腳本檢查

[root@lb01 scripts]# cat check_nginx.sh
#!/bin/sh
while true
do
  if [`netstat -lntup|grep nginx|wc -l` -ne 1 ];then
     /etc/init.d/keepalived stop
  fi
   sleep 5
 done

2、可以使用keepalived的配置文件參數觸發寫好的監測服務腳本

[root@lb01 scripts]# cat chk_nginx_proxy.sh
#!/bin/sh
  if [`netstat -lntup|grep nginx|wc -l` -ne 1 ];then
     /etc/init.d/keepalived stop
  fi
[root@lb01 scripts]# chmod +x chk_nginx_proxy.sh

此時keepalived的完整配置爲:

[root@lb01 keepalived]# vim keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
}
 
vrrp_script chk_nginx_proxy {          《===定義vrrp腳本,檢測http端口
script “/server/scripts/chk_nginx_proxy.sh” 《===執行腳本,當nginx服務有問題,停掉keepalived服務
interval 2            《====間隔2秒
weight 2
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
track_script {
chk_nginx_proxy                 《====觸發檢查
}
}

解決多組keepalived服務器在一個局域網的衝突問題

global_defs {
router_id lb01
vrrp_mcast_group4 224.0.0.19 <===這個就是指定組播地址的配置
}

配置指定文件接受keepalived服務日誌

默認情況下keepalived會輸出到系統日誌/var/log/messages

1)/etc/sysconfig/keepalived第14行KEEPALIVED_OPTIONS="-D"修改爲
KEEPALIVED_OPTIONS="-D –d –S 0"
2)修改rsyslog的配置文件
vi /etc/rsyslog.conf
#keepalived
local0.*                                /var/log/keepalived.log
3)完成後,重啓rsyslog服務
/etc/init.d/rsyslog restart


監測keepalived裂腦的腳本

[root@lb02 ~]# cat /server/scripts/check_split_brain.sh
#!/bin/sh
lb01_vip=192.168.4.130
lb01_ip=192.168.4.125
while true
do
ping -c -W 3 $lb01_ip &>/dev/null
 if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ]
   then
     echo "ha is split brain.warning."
else
     echo "ha is ok"
fi
sleep 5
done

 

3 LVS

LVS負載均衡集羣介紹

負載均衡LB提供了一種廉價、有效、透明的方法,來擴展網絡設備和服務器帶寬、增加吞吐量、加強網絡數據能力、提高網絡的靈活性和可用性。

搭建負載均衡服務的需求

1)把單點計算機無法承受的大規模併發訪問或數據流量分擔到多臺節點設備上分別處理,減少用戶等待響應時間,提升用戶體驗。

2)單個重負載的運算分擔到多臺節點設備上做並行處理,每個節點設備處理結束後,將結果彙總,返回給用戶,系統處理能力得到大幅提高。

37*24的服務保證,任意一個或多個有限後面節點宕機,不會影響業務。

在負載均衡集羣中,所有計算機節點都會提供相同的服務。集羣負載均衡器截獲所有對該服務器的入站請求。然後將這些請求儘可能地平均的在

所有集羣節點上。

LVSlinux virtual server

LVSLinux Virtual Server的縮寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統,可以在UNIX/LINUX平臺下實現負載均衡集羣功能。

IPVS軟件工作層次

LVS負載均衡調度技術是在內核層面完成的。

體系結構與工作原理簡單描述

LVS集羣負載均衡器接受服務的所有入站客戶端的計算機請求,並根據調度算法決定那個集羣節點應該處理回覆請求。

負載均衡器(LB)有時也被稱爲LVS Direcotr

LVS虛擬服務器的體系結構,一組服務器通過高速的局域網或者地理分佈的廣域網相互連接,在它們的前端有一個負載調度器(load Balancer)

負載調度器能無縫地將網絡請求調度到真實的服務器上,從而使得服務器集羣的結構對於客戶是透明的,客戶訪問集羣系統提供的網絡服務就像

訪問一臺高性能、高可用的服務器一樣。客戶程序不受服務器集羣的影響不需作任何修改。

LVS相關術語命名約定

名稱                                     縮寫    說明

虛擬IP地址(Virtual Ip Address)             VIP     Director用於向客戶端計算機提高服務的IP地址。比如www.etiantian.org域名就要解析到VIP上。

真實IP地址(Real Server Ip Address)         RIP     在集羣下面節點上使用的IP地址。

DirectorIP地址(Director Ip Address)       DIP     Director用於連接內外網絡的IP地址,物理網卡上的IP地址。

客戶端主機IP地址(Client Ip Address)        CIP    客戶端用於計算機請求集羣服務的IP地址,該地址用作發送給集羣的請求的源IP地址。

LVS負載均衡集羣的3種工作模式介紹

1NAT模式-網絡地址轉換

(Virtual Server via Network Address Translation(VS/NAT)

通過網絡地址轉換,調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給後端的真實服務器;真實服務器的響應報文通過調度器時

報文的源地址被重寫,在返回給客戶端,完成整個負載調度過程。

提示:VS/NAT模式,很類似公路收費站,來去都要進過LB負載均衡器,通過修改目的地址,端口或源地址或源端口。(10-20臺)

2TUN模式-隧道模式

Virtual Server via IP Tunneling (VS/TUN)

採用NAT技術時,由於請求和響應報文都必須經過調度器地址重寫,當客戶請求越來越多時,調度器的處理能力將成爲瓶頸。

爲了解決這個問題,調度器把請求報文通過IP隧道(相當於ipipipsec)轉發至真實服務器,而真實服務器將響應直接返

回給客戶,這樣調度器只處理請求報文。由於一般網絡應答數據比請求報文大很多,採用VS/TUN技術後,集羣系統的最大

吞吐量可以調高10倍。

3DR模式-直接路由模式

Virtual Sever via Direct Routing (VS/DR)

VS/DR通過改寫請求報文的MAC地址,將請求發送到真實的服務器,而請求發送到真實的服務器,而真實服務器將響應直接返回給客戶。

VS/TUN技術一樣,VS/DR技術可極大的提高集羣系統的伸縮性。這種方法沒有IP隧道的開銷,對於集羣中真實服務器也沒有必須支持

IP隧道協議的要求,但是要求調度器與真實服務器都有一塊網卡連接在統一服務網段上。

LVS的調度算法

LVS調度算法決定了如何在這些集羣節點之間分佈工作負荷。

Director收到來自客戶端的訪問它VIP上的集羣服務入站請求時,Director必須決定哪個集羣節點應該獲得請求。

Director可用於做出該決定的調度方法分爲兩個基本類別:

固定調度算法:rr,wrr,dh,sh

動態調度算法:wlc,lc,lblc,lblcr,SE,NQ

 

10種調度算法如下:

rr : 輪詢調度(Round-Robin),它將請求一次分配不同的RS,也就是在RS中均攤請求。這種算法簡單,但是隻適合與RS處理

性能相差不大的情況。

wrr 加權輪詢調度(Weighted Round-Robin),它將依據不同RS的權值分配任務。權值較高的RS將優先獲得任務,並且分配到

的連接數將比權值較低的RS更多。相同權值的RS得到相同的連接數。

dh 目的地址哈希調度(Destination Hashing)以目的地址爲關鍵字查找一個靜態的hash表來獲得需要的RS

sh:  源地址哈希調度(Source Hashing)以源地址爲關鍵字查找一個靜態hash表來獲得需要的RS

lc:  最小連接數調度(Least-Connection)IPVS表存儲了所有的活動連接。把新的連接請求發送到當前連接數最小的RS

wlc: 加權最小連接數調度(Weighted Least-Connection)假設各臺RS的權值一次爲Wi(l=1..n),當前的TCP連接數依次爲

     Ti(l=1..n),依次選取Ti/Wi爲最小的RS作爲下一個分的的RS

lblcr:基於地址的最小連接數調度(Locality-Based Least-Connect)將來自同一目的地址的請求分配給同一臺RS,如果這臺服務器

     尚未滿負荷,否則分配給連接數最小的RS,並以它爲下一次分配的首選考慮。

lblcr: 基於地址帶重複最小連接數調度(Locality-Based Least-Connection with Replication)對於某一目的地址,對應有一個

      RS子集。對此地址請求,爲它分配子集中連接數最小RS;如果子集中所有服務器均已滿負荷,則從集羣選擇一個連接數較小服

      務器。將它加入到此子集並分配連接;若一定時間內,未被做任何修改,則將子集中負載最大的節點從子集刪除。

LVS的調度算法和生產環境選型

一般的網絡服務,如HTTPMailMySQL等,常用的調度算法爲:

1)基本輪詢調度rr算法 2)加權最小連接調度wlc  3)加權輪詢調度wrr算法。

基於局部性的最小連接LBLC和帶複製的基於局部性最少連接LBLCR主要適用webCache集羣。

源地址散列調度和目標地址散列可以結合適用在防火牆集羣中,他們可以保證整個系統的唯一出入口。最短預期延遲調度SED和不排列調度

NQ主要是對處理時間相對比較長的網絡服務。

 

LVS DR模式具體的調度原理過程:


安裝LVS

1、下載相關軟件包

[root@lb01 tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

2、安裝LVS命令

查看是否存在LVS

[root@lb01 tools]# lsmod |grep ip_vs

檢查系統內核版本

[

root@lb01 tools]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@lb01 tools]# uname -r
2.6.32-431.el6.x86_64

做個軟鏈接

[root@lb01 tools]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64
drwxr-xr-x. 22 root root 4096 5月  20 2017 /usr/src/kernels/2.6.32-431.el6.x86_64
[root@lb01 tools]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64 /usr/src/linux
drwxr-xr-x. 22 root root 4096 5月  20 2017 /usr/src/kernels/2.6.32-431.el6.x86_64
lrwxrwxrwx   1 root root   39 5月   1 17:34 /usr/src/linux -> /usr/src/kernels/2.6.32-431.el6.x86_64

編譯安裝

[root@lb01 tools]# tar zxf ipvsadm-1.26.tar.gz
[root@lb01 tools]# cd ipvsadm-1.26
[root@lb01 ipvsadm-1.26]# make
[root@lb01 ipvsadm-1.26]# make install

 

如果出現報錯,可能是由於缺少3個組件popt-develpopt-staticlibnl-develyum安裝即可

[root@lb01 ipvsadm-1.26]# lsmod |grep ip_vs

安裝完成後並沒有加載到內核

啓動LVS

[root@lb01 ipvsadm-1.26]# /sbin/ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lb01 ipvsadm-1.26]# lsmod |grep ip_vs
ip_vs                 125220  0
libcrc32c               1246  1 ip_vs
ipv6                  317340  275 ip_vs

 

配置LVS虛擬IP

[root@lb01 ~]# ifconfig eth0:127 192.168.4.127 netmask 255.255.255.0
[root@lb01 ~]# ifconfig eth0:127
eth0:127  Link encap:Ethernet  HWaddr 00:0C:29:06:6E:89 
          inet addr:192.168.4.127  Bcast:192.168.4.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
手工執行配置添加LVS服務
[root@lb01 ~]# ipvsadm -C
[root@lb01 ~]# ipvsadm --set 30 5 60
[root@lb01 ~]# ipvsadm -A -t 192.168.4.127:80 -s wrr -p 20
[root@lb01 ~]# ipvsadm -a -t 192.168.4.127:80 -r 192.168.4.122:80 -g -w 1
[root@lb01 ~]# ipvsadm -a -t 192.168.4.127:80 -r 192.168.4.121:80 -g -w 1

查看配置及狀態信息

[root@lb01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.4.127:80 wrr persistent 20
  -> 192.168.4.121:80             Route   1      0          0        
  -> 192.168.4.122:80             Route   1      0          0  
[root@lb01 ~]# ipvsadm -L -n  --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.4.127:80                   14       37        0     1892        0
  -> 192.168.4.121:80                    8       22        0     1128        0
  -> 192.168.4.122:80                    6       15        0      764        0

 

刪除配置

[root@lb01 ~]# ipvsadm -D -t 192.168.4.127:80
[root@lb01 ~]# ipvsadm -d -t 192.168.4.127:80 -r 192.168.4.121:80

命令相關參數說明

--clear  -C  clear the whole table
--add-service -A add virtual service with options
--tcp-service -t service-address service-address is host[:port]
--scheduler -s   scheduler  one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
--add-server -a add real server with options
--real-server -r server-address server-addres s is host(and port)
--masquerading -m masquerading (NAT)
--gatewaying -g gatewaying(direct routing)(default)
--delete-server -d delete real server
--persistent -p [timeout]   persistent server(會話保持功能)
--set tcp tcpfin udp       set connection timeout values
--weight  -w weight  capacity of real server
[root@lb01 ~]# ipvsadm –help    《===更多命令幫助


 

手工在RS端綁定VIP

[root@lamp01 ~]# ifconfig lo:127 192.168.4.127 netmask 255.255.255.255 up
[root@lamp01 ~]# route add -host 192.168.4.127 dev lo
[root@lnmp02 ~]# ifconfig lo:127 192.168.4.127 netmask 255.255.255.255 up
[root@lnmp02 ~]# route add -host 192.168.4.127 dev lo

 

手工在RS端抑制ARP響應

cat /proc/sys/net/ipv4/conf/lo/arp_ignore
cat /proc/sys/net/ipv4/conf/all/arp_ignore
cat /proc/sys/net/ipv4/conf/all/arp_announce
cat /proc/sys/net/ipv4/conf/lo/arp_announce
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

最後瀏覽器訪問VIP進行測試

LVS自動化腳本

ipvs_server

#!/bin/bash
# function:
# version:1.1
. /etc/init.d/functions
VIP=192.168.4.127
SUBNET=eth0:`echo $VIP|cut -d. -f4`
PORT=80
GW=192.168.4.1
 
#w=3
RIP1=(
        192.168.4.121
     )
#w=1
RIP2=(
        192.168.4.122
     )
IFCONFIG=/sbin/ifconfig
ROUTE=/sbin/route
IPVSADM=/sbin/ipvsadm
ARPING=/sbin/arping
 
#functions
function usage (){
        local script_name
        script_name=$1
        echo "Usgae : $script_name [ start | stop | restart ]"
        echo ""
        return 1
}
 
function checkCmd (){
        if [ ! -f $1 ]; then
                echo "Can't find "$1
                return 1
        fi
}
 
function checkSubnet (){
        $IFCONFIG |grep "$1"|wc -l
}
 
function ipvsStart (){
        #judge if $SUBNET is exist.
        if [ $(checkSubnet $SUBNET) -ne 0 ]; then
                $IFCONFIG $SUBNET down
        fi
        local rs
        #$IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.255 up
        $IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up
        #$ROUTE add -host $VIP dev $SUBNET
        $IPVSADM -C
        $IPVSADM -A -t $VIP:$PORT -s wrr -p 60
 
        for ((i=0; i<`echo ${#RIP1[*]}`; i++))
        do
                $IPVSADM -a -t $VIP:$PORT -r ${RIP1[$i]}:$PORT -g -w 1
        done
 
        for ((i=0; i<`echo ${#RIP2[*]}`; i++))
        do
                $IPVSADM -a -t $VIP:$PORT -r ${RIP2[$i]}:$PORT -g -w 1
        done
        rs=$?
        $IPVSADM >/tmp/wangxin.log
 
        # update MAC
       NetIf=$(echo ${SUBNET}|awk -F ":" '{print $1}')
        $ARPING -c 1 -I ${NetIf} -s $VIP $GW >>/tmp/wangxin.log
        [ $rs -eq 0 ] && action "Ipvsadm start." /bin/true
        return $rs
}
 
function ipvsStop (){
        local rs
       rs=1
        #clean ipvs
       $IFCONFIG $SUBNET down
        $IPVSADM -C
        $IPVSADM -Z
       
        rs=$?
        #$ROUTE del $VIP
       $ARPING -c 1 -I ${NetIf} -s $VIP $GW  >/dev/null 2>&1
        [ $rs -eq 0 ] && action "Ipvsadm stoped." /bin/true
        return $rs
}
 
main ()
{
       #judge argv num by wangxin
        if [ $# -ne 1 ]; then
                usage $0
        fi
 
        case "$1" in
                start)
                        ipvsStart
                        ;;
                stop)
                        ipvsStop
                        ;;
                restart)
                        ipvsStop
                        ipvsStart
                        ;;
                *)
                        usage $0
                        ;;
        esac
}
 
#start operating
main $*

ipvs_client

#!/bin/bash
# description: Config realserver lo and apply noarp
VIP=(
        192.168.4.127
     )
 
. /etc/rc.d/init.d/functions
 
case "$1" in
start)
        for ((i=0; i<`echo ${#VIP[*]}`; i++))
        do
           interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
           /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up
        done
        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
           action "Start LVS of RearServer.by wang1xin"
        ;;
stop)
        for ((i=0; i<`echo ${#VIP[*]}`; i++))
        do
            interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"
            /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down
        done
        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
           action "Close LVS of RearServer.by wang2xin"
        ;;
*)
        echo "Usage: $0 {start|stop}"
        exit 1
esac

一個腳本同時實現自動剔除和加入RS

#!/bin/bash
 
PORT="80"
VIP=192.168.4.127
 
RIP=(
    192.168.4.121
    192.168.4.122
)
 
function check_url()
{
 
for ((i=0; i<`echo ${#RIP[*]}`; i++))
do
judge=($(curl -I -s http://${RIP[$i]}|head -1|tr "\r" "\n"))
if [[ "${judge[1]}" == ‘200‘ && "${judge[2]}"==‘OK‘ ]]
   then
     if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -ne 1 ]
      then
      ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT
     fi
 
else
      if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -eq 1 ]
      then
      ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT
     fi
fi
done
}
 
while true
do
check_url
sleep 5
done

4  LVS+keepalived高性能集羣應用實戰

LVS配置(略)

 

Keepalived配置

主節點

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
}
 
virtual_server 192.168.4.130 80 {
    delay_loop 6         
    lb_algo wrr               
    lb_kind DR               
    nat_mask 255.255.255.0
    persistence_timeout 50    
    protocol TCP               
 
    real_server 192.168.4.121 80 {
        weight 1              
        TCP_CHECK {
        connect_timeout 8      
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
 
    real_server 192.168.4.122 80 {
        weight 1             
        TCP_CHECK {
        connect_timeout 8      
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

備節點

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.130/24 dev eth0 label eth0:1
    }
}
 
virtual_server 192.168.4.130 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50    
    protocol TCP
 
    real_server 192.168.4.121 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
 
    real_server 192.168.4.122 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}

5 其他

keepalived+LVS部署問題排錯思路

1iptables防火牆問題

2linux負載均衡器轉發問題

對於nat模式,linux內核轉發及iptables轉發功能需要開放,對於DR模式,可以不打開

3RS端抑制ARP問題

4RSlo上綁定業務VIP,每個RS都要綁定

5RSlo上綁定的業務VIP,有時lo接口VIP會丟失

解決辦法:

aipvs_client完整腳本啓動命令放入rc.local

b)通過nagios監控RS端上綁定的業務VIP做監控報警

c)把RSlo上綁定的業務VIP做成網卡配置文件提供服務

如:/etc/sysconfig/network-scripts/ifcfg-lo:123

6、確保client用戶、directorRS 三者之間任意兩者業務服務可訪問

可用wget telnet等命令來監測

7ipvsadm -L -n來檢查LVS真是服務器情況及VIP連接及配置

8、檢查keepalived配置文件是否配置正確

9、查看系統日誌/var/log/messages

10、通過tcpdump命令跟蹤數據包流向

11、注意LVS配置的語法,尤其是大括號問題

 

keepalived+LVS生產環境負載均衡維護思路

1、業務高峯期儘量不修改負載均衡配置,以免發生故障

2、修改keepalived.conf時,備份

3、將keepalived.conf的配置下載下來,保留原始文件再進行修改,對比,然後傳到服務器

4、替換正式配置文件後,主負載均衡器可以先執行/etc/init.d/keepalived stop,把業務切換到備份負載均衡器上

 

LVS負載均衡器的多臺RS上線方案

1)通過ipvsadm命令下線機器

2)通過url做健康檢查,然後,移走健康檢查文件。這樣director會把此RS從轉發池中移除

 

LVS性能調優

1、關閉iptables,換硬件防火牆

大流量時,iptables是一個性能瓶頸

2、調整連接超時時間

3、內核優化

4、網卡優化

5TCP/IP優化

6、硬件優化

7、增大哈希表,ip_vs_conn_tab_bits調到20

通過重啓,向內核傳遞參數來調整

 


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