一、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。