lvs+keepalived使用總結

一、lvs簡介和推薦閱讀的資料
二、lvs和keepalived的安裝
三、LVS VS/DR模式搭建
四、LVS VS/TUN模式搭建
五、LVS VS/NAT模式搭建
六、keepalived多種real server健康檢測實例
七、lvs持久性工作原理和配置
八、lvs數據監控
九、lvs+keepalived故障排除

一、lvs簡介和推薦閱讀的資料

學習lvs+keepalived必須閱讀的三個文檔。

1、  《keepalived權威指南》

2、  《lvs手冊》

3、  《Red_Hat_Enterprise_Linux-5-Virtual_Server_Administration-zh-CN》

這三個文檔是官方文檔,介紹了大部分原理和基礎知識。下面我主要記錄一些使用的案例,方便查閱。

他們負責什麼工作?

在lvs+keepalived環境裏面,lvs主要的工作是提供調度算法,把客戶端請求按照需求調度在real服務器,keepalived主要的工作是提供lvs控制器的一個冗餘,並且對real服務器做健康檢查,發現不健康的real服務器,就把它從lvs集羣中剔除,real服務器只負責提供服務。

二、lvs和keepalived的安裝

環境規劃

2*(lvs+keepalived服務器)+n*real-server,一般lvs+keepalived是這樣的架構。

開始安裝

1、  下載軟件包

http://www.linuxvirtualserver.org/ 下載lvs的軟件包

http://www.keepalived.org/ 下載keepalived軟件包

2、先編譯安裝lvs,再安裝keepalived,安裝lvs需要內核源碼

下載lvs源碼的時候,一定要選擇你內核版本對應的源碼包。

# uname  -r
2.6.18-164.el5PAE
#yum install kernel-devel -y  //安裝內核源碼包
#ln -s /usr/src/kernels/2.6.18-164.el5PAE-i686/ /usr/src/linux
#wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz  //                                                ipvsadm包就是lvs軟件包,別覺得名字不一樣
# tar -zxvf ipvsadm-1.24.tar.gz
# cd ipvsadm-1.24
#make && make install

檢查lvs是否安裝成功:

#ipvsadm //查看是否有輸出

#lsmod | grep ip_vs   //如果ipvsadm有輸出,那麼使用這個命令查看是否加載ip_vs模塊,如果加載,那麼lvs算安裝成功。

2、  編譯安裝keepalived,一定在安裝完lvs以後在安裝keepalive

#wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz //不建議選擇最新的版本
#tar -zxvf keepalived-1.1.15.tar.gz
#cd keepalived-1.1.15
#./configure --prefix=/  --mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/linux/
Keepalived version       : 1.1.15
Compiler                 : gcc
Compiler flags           : -g -O2
Extra Lib                : -lpopt -lssl -lcrypto
Use IPVS Framework       : Yes
IPVS sync daemon support : Yes
Use VRRP Framework       : Yes
Use LinkWatch            : No
Use Debug flags          : Nod


看見如上輸入,注意yes和no的值,如果一樣,證明配置成功,如果lvs爲no,那麼證明你的lvs沒有安裝成功,需要從新安裝lvs再安裝keepalived。

#make && make install

如果沒有報錯,那麼就安裝成功了,檢查一下是否生成了keepalived命令。

三、LVS VS/DR模式搭建

環境介紹

主機IP

角色

安裝軟件

122.225.32.134

Lvs+keepalived MASTER

Ipvsadm keepalived

122.225.32.135

Lvs+keepalived BACKUP

Ipvsadm keepalived

122.225.32.136

Real server

Lvs_real腳本

122.225.32.137

Real server

Lvs_real腳本

122.225.32.142

VIP


注意:所有機器都在一個交換機,並且在一個網段。

1、在134和135上安裝ipvsadm和keepalived軟件。

2、修改keepalived的配置文件

122.225.32.134

# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        122.225.32.142
    }
}
virtual_server 122.225.32.142 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 0             //此值爲0,主要是爲了方便測試,每次刷新頁面結果會不一樣
    protocol TCP
    real_server 122.225.32.136 80{
        weight 1
        TCP_CHECK {
            connect_port    80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 122.225.32.137 80{
        weight 1
        TCP_CHECK {
            connect_port    80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


122.225.32.135

和122.225.32.134相比,值需要刪除state MASTER 和 修改priority的值小於master的。

real server

在所有real server上添加下面腳本,名執行# cat  /sbin/lvs_real

#!/bin/bash
#description:start realserver
vip=122.225.32.157
source /etc/rc.d/init.d/functions
case $1 in
start)
        echo "Start Realserver"
        /sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 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
;;
stop)
        echo "Stop Realserver"
        /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
;;
*)
        echo "Usage: $0 (start | stop)"
exit 1
esac

執行腳本以後,使用ip add命令查看lo接口是否添加了虛擬ip地址。

當然,real server上面需要安裝http服務,並啓動,在index.html裏面添加自己的IP地址,方便客戶端訪問時候辨別訪問的是哪個主機。

3、配置完成以後,開始測試:

在122.225.32.134和122.225.32.135上使用ip add檢查,虛擬IP應該配置在134上面。

測試1{主要測試lvs}:訪問虛擬IP是否可以訪問真實服務器,是否輪詢real server

在master上使用 ipvsadm命令查看lvs狀態。

# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  122.225.32.142:http rr
  -> 122.225.32.137:http          Route   1      0          0        
  -> 122.225.32.136:http          Route   1      0          0

在客戶端訪問虛擬IP 122.225.32.142,看是否可以訪問。每次刷新,應該會換一個real server。訪問數次後,通過ipvsadm觀察lvs狀態。

# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  122.225.32.142:http rr
  -> 122.225.32.137:http          Route   1      0          6        
  -> 122.225.32.136:http          Route   1      0          6

測試2{主要測試keepalived}:lvs服務器的HA,當keepalived master掛掉後,keepalived backup會不會接管虛擬IP。

關閉master主機上的keepalived進程。

在backup上ip add查看是否添加虛擬IP,通過/var/log/message查看相關轉換日誌。


測試3{測試backup的lvs}:使用客戶端訪問現在虛擬ip,查看是否一切正常

測試完成後,開啓master的keepalived進程,等虛擬ip轉移到master以後,在從客戶端訪問,查看是否存在問題。

四、LVS VS/TUN模式搭建

環境介紹

主機IP

角色

安裝軟件

122.225.32.134

Lvs+keepalived MASTER

Ipvsadm keepalived

122.225.32.135

Lvs+keepalived BACKUP

Ipvsadm keepalived

122.225.32.155

Real server


122.225.32.156

Real server


122.225.32.142

VIP


注意:虛擬ip,master和backup在同意網段和交換機,realserver在不同網段,但是同屬於外網IP

1、在134和135上安裝ipvsadm和keepalived軟件。

2、修改keepalived的配置文件

122.225.32.134

 # cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        122.225.32.142
    }
}
virtual_server 122.225.32.142 80 {
    delay_loop 6
    lb_algo rr
    lb_kind TUN
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 122.225.32.155 80{
        weight 1
        TCP_CHECK {
            connect_port    80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 122.225.32.156 80{
        weight 1
        TCP_CHECK {
            connect_port    80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


122.225.32.135

和122.225.32.134相比,值需要刪除state MASTER 和 修改priority的值小於master的。


real server

在所有real server上添加下面腳本,名執行。

# cat /sbin/lvs_real_tun
#!/bin/sh
# description: Config realserver tunl port and apply arp patch
VIP=122.225.32.142
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "Tunl port starting"
ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev tunl0
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
;;
stop)
echo "Tunl port closing"
ifconfig tunl0 down
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0" {start|stop}
exit 1
esac

3、配置完成以後,開始測試:

測試方法和DR方法一樣。


五、LVS VS/NAT模式搭建

環境介紹

主機IP

角色

安裝軟件

122.225.32.134

Lvs+keepalived MASTER

Ipvsadm keepalived

122.225.32.135

Lvs+keepalived BACKUP

Ipvsadm keepalived

10.1.1.9

Real server

Lvs_real腳本

10.1.1.10

Real server

Lvs_real腳本

122.225.32.142

VIP eth0

外網虛擬IP

10.1.1.118

VIP eth1

內網虛擬IP

注意:所有機器都在一個交換機,並且在一個網段,LVS服務器端最好開啓數據包轉發net.ipv4.ip_forward。

1、在134和135上安裝ipvsadm和keepalived軟件。

2、修改keepalived的配置文件

注意:這裏由於需要內外網IP的同時漂移,所以需要用到vrrp同步組,並且需要同時開啓兩個vrrp實例。

122.225.32.134

經過上面的配置,大家應該比較熟悉了,相對於TUN和DR模式,NAT的配置文件主需要做一下修改。

! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_sync_group G1 {
  group {
    VI_1
    VI_2
  }
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        122.225.32.142
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.1.118
    }
}
virtual_server 122.225.32.142 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 10.1.1.251 80{
        weight 1
        TCP_CHECK {
            connect_port    80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 10.1.1.8 80{
        weight 1
        TCP_CHECK {
            connect_port    80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

122.225.32.135

和122.225.32.134相比,值需要刪除state MASTER 和 修改priority的值小於master的。

real server

10.1.1.9和10.1.1.10的網關需要指定的lvs的內網虛擬IP也就是10.1.1.118,不需要其他設置。


六、keepalived多種real server健康檢測實例

keepalived對lvs的real server檢測方式主要有以下幾種,HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK.

其中TCP_CHECK是最常用的方式,一般內容在keepalived手冊中都可以查到,值得提一下的就是關於digest和genhash的用法。

HTTP_GET | SSL_GET {
url {
path /
digest <string> ##genssh工具算出的。
status_code 200
}
connect_port 80
bindto <IPADD>
connect_timeout 10
nb_get_retry 3
delay_before_retry 2
}


這裏需要注意的就是digest的值如何算,一般在安裝keepalived後,會生成一個genhash的工具。

可以使用

#genhash -h 查看幫助

常見的使用方法如下

# genhash  -s 10.1.1.8 -p 80 -u index.html 如果你是ssl連接,需要加 -S 參數,算出的值貼到配置文件中就可以了。


七、lvs持久性工作原理和配置

一、LVS持久連接技術

lvs的持久性連接有兩方面。

1、把同一個client的請求信息記錄到lvs的hash表裏,保存時間使用persistence_timeout控制,單位爲秒。persistence_granularity 參數是配合persistence_timeout的,在某些情況特別有用,他的值是子網掩碼,表示持久連接的粒度,默認是255.255.255.255,也就是單獨的client ip,如果改成,255.255.255.0就是client ip一個網段的都會被分配到同一個real server。

2、一個連接創建後空閒時的超時時間,這個時間爲3種

a、tcp的空閒超時時間

b、lvs收到客戶端tcp fin的超時時間

c、udp的超時時間

如何查看這些值?

# ipvsadm  //可以查看連接空閒的超時時間,紅色標記。

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  122.225.32.142:http rrpersistent 10

-> 122.225.32.137:http          Route   1      0          1

-> 122.225.32.136:http          Route   1      0          0

# ipvsadm -l –timeout  //查看tcp tcpfin udp的超時時間

Timeout (tcp tcpfin udp): 900 120 300

他們是如何工作的?

我們通過

# ipvsadm -Lcn

IPVS connection entries

pro expire state       source             virtual            destination

TCP 00:57 NONE        110.184.96.173:0   122.225.32.142:80  122.225.32.136:80

TCP 01:57  FIN_WAIT    110.184.96.173:54568 122.225.32.142:80  122.225.32.136:80

當一個client訪問vip的時候,ipvs或記錄一條狀態爲NONE的信息,紅色的值的初始值是persistence_timeout的值,然後根據時鐘主鍵變小,在以下記錄存在期間,同一client ip連接上來,都會被分配到同一個後端。

FIN_WAIT的值就是tcp tcpfin udp的超時時間,當NONE的值爲0時,如果FIN_WAIT還存在,那麼NONE的值會從新變成60秒,再減少,直到FIN_WAIT消失以後,NONE纔會消失,只要NONE存在,同一client的訪問,都會分配到統一real server。


如何設置這些值?

persistence_timeout可以通過以下兩種方法設置

1、  ipvsadm -A -t 192.168.20.154:80 -s rr -p 60

注意:上面命令中紅色標記的80端口,表示同一客戶端訪問服務器的80端口,會被定義到同一個real server,如果把80端口改爲0,那麼同一客戶端訪問服務器的任何服務都會被轉發到同一real server。

2、修改keepalived配置文件在虛擬服務器配置下面加入 persistence_timeout 60


tcp tcpfin udp的配置

#ipvsadm –set tcp tcpfin udp

# ipvsadm –set 120 50 50 //實例

建議:tcpfin的值最好小於persistence_timeout的值,這樣比較方便計算。

lvs持久性參考資料:

http://www.linuxvirtualserver.org/docs/persistence.html


二、防火牆標記

http://lymrg.blog.51cto.com/1551327/684681


三、conn_syncd

lvs負載調度器在進行切換的時候,還是會影響服務的,因爲備用的調度器上沒有已經建立的連接信息,當這些已經建立的連接通過備用的調度器的時候,連接會被reset掉,從而導致連接中斷,這個時候就該conn_syncd上場了。詳細信息請參見(http://www.linuxvirtualserver.org/docs/sync.html),lvs中文手冊也提到過這個問題。

解決方案:

Here is simple intructions to use IPVS connection synchronization. On the primary load balancer, run
#ipvsadm --start-daemon=master --mcast-interface=eth0
On the backup load balancers, run
#ipvsadm --start-daemon=backup --mcast-interface=eth0
To stop the daemon, run
#ipvsadm --stop-daemon

注意:這個命令需要手工啓用,並且如果主lvs掛掉,切換到備用的時候,連接信息是同步的,但是主恢復,搶佔vip後,連接信息是不會被反同步回去的。配置不搶佔是使用nopreempt,只能配置在backup狀態的主機,並且優先級必須比另外一臺高,也就是配置在主lvs上,但是主lvs不能配置state master值。

八、lvs數據監控

可以使用lvs-rrd工具和cacti來監控,具體請google。


九、lvs+keepalived故障排除


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