簡介: LVS 是 Linux Virtual Server 的簡寫,Linux 虛擬伺服器的意思,是一個虛擬的伺服器集群系統,此項目由章文嵩博士於 1998 年 5 月成立,是中國最早出現的自由軟體項目之一。 LVS 負載均衡集群系統的優點: 1、提高吞吐量 想獲得更高的吞吐量,在 LVS 中只需 ...
簡介:
LVS 是 Linux Virtual Server 的簡寫,Linux 虛擬伺服器的意思,是一個虛擬的伺服器集群系統,此項目由章文嵩博士於 1998 年 5 月成立,是中國最早出現的自由軟體項目之一。
LVS 負載均衡集群系統的優點:
1、提高吞吐量
想獲得更高的吞吐量,在 LVS 中只需增加 Real-server 即可,其開銷只是線性增長。如選擇更換一臺更高性能的伺服器來獲得相當的吞吐量,開銷要大很多。
2、冗餘
如果 LVS 中某台 Real-server 由於需要升級或其它原因不能對外提供服務,其退出及恢復工作並不會對用戶造成服務中斷。
3、適應性
不管是需要吞吐量逐漸變化、還是快速變化,伺服器的增減對客戶都是透明的。
LVS 負載均衡集群系統的三種轉發機制:
1、Virtual Server via NAT ( VS/NAT )
VS/NAT 網路地址轉換模式,伺服器可以運行任何支持 TCP/IP 協議的操作系統,它只需要一個公網 IP 地址配置在 LVS 主機上,後端真實伺服器都可以使用私有地址。
它的缺點是擴充能力有限,當後端真實伺服器達到一定數量時,LVS 本機有可能成為集群瓶頸,因為整個集群中的客戶端請求和響應封包都要通過 LVS 負載均衡主機。
2、Virtual Server via IP Tunneling ( VS/TUN )
VS/TUN IP 隧道模式,負載均衡 LVS 主機只將請求分配到不同的真實伺服器,真實伺服器將結果直接返回給客戶端。這樣 LVS 可以處理海量的請求,而不會成為集群系統瓶頸。
並且 IP 隧道模式不限制真實伺服器位置,只要系統支持 IP 隧道協議並且網路可達就可以。多了一層 IP 隧道的開銷,且並不是所有系統都支持此協議。
3、Virtual Server via Direct Routing ( VS/DR )
VS/DR 直接路由模式,同樣 LVS 主機只處理客戶端到伺服器端的連接,響應信息由真實伺服器直接返回給客戶端。
DR 模式要求所有真實伺服器必須至少有一塊網卡與 LVS 主機在同一物理網段中,且真實伺服器網路設備或設備別名不作 ARP 響應。
Keepalived 起初是 LVS 設計的,專門用來監控集群系統中各個服務節點的狀態,後來又加入了 VRRP( 虛擬路由冗餘協議 )解決靜態路由出現的單點故障問題,
通過 VRRP 協議可以實現網路不間斷穩定運行。因此,Keepalived 不僅具有伺服器狀態檢測和故障隔離功能,還具有 HA Cluster 功能。
Keepalived 作為 LVS 的擴展項目,因此。Keepalived 可以與 LVS 無縫整合,輕鬆構建一套高性能的負載均衡集群系統。
環境描述:( CentOS 6.6_x86_64 minimal )
LVS VIP 192.168.214.50
LVS Master 192.168.214.20
LVS Backup 192.168.214.30
Real-Server-1 192.168.214.10
Real-Server-1 192.168.214.40
軟體包下載地址:
Ipvsadm http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
Keepalived http://www.keepalived.org/software/keepalived-1.2.10.tar.gz
一、安裝環境依賴包
shell > yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel popt-static
二、下載、安裝 ipvsadm 、keepalived
shell > wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz shell > tar zxf ipvsadm-1.26.tar.gz shell > cd ipvsadm-1.26 shell > make ; make install shell > ipvsadm -v ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)
## 安裝還是很簡單的
shell > wget http://www.keepalived.org/software/keepalived-1.2.10.tar.gz shell > tar zxf keepalived-1.2.10.tar.gz shell > cd keepalived-1.2.10 shell > ./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-504.23.4.el6.x86_64 ## --sysconf 指定 keepalived.conf 的存放位置 --with-kernel-dir 指定使用內核源碼中的頭文件,即 include 目錄 shell > make ; make install shell > ln -s /usr/local/sbin/keepalived /sbin/ shell > keepalived -v Keepalived v1.2.10 (07/01,2015)
## 安裝也是蠻簡單的
三、配置 keepalived.conf
shell > vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id MASTER ## keepalived 伺服器標識符,可以隨意設定( 貌似也是全局唯一 ) } vrrp_instance VI_1 { ## 定義一個名為 VI_1 的 VRRP 實例 state MASTER ## Keepalived 伺服器角色,MASTER 為主、BACKUP 為備 interface eth0 ## 指定 HA 監測網路介面 virtual_router_id 51 ## 虛擬路由標識,同一個 VRRP 實例使用唯一的標識,主備必須一樣 priority 100 ## 節點優先順序,同一 VRRP 實例中 MASTER 的優先順序必須大於 BACKUP advert_int 1 ## MASTER / BACKUP 之間同步檢查間隔時間,單位 秒 authentication { ## 節點之間通信驗證類型、密碼 ,同一 VRRP 實例中,MASTER / BACKUP 必須使用相同的密碼才可以通信 auth_type PASS auth_pass 888 } virtual_ipaddress { ## 虛擬 IP 地址,又稱漂移 IP 。可以通過 ip add 在 MASTER 上查看是否綁定 192.168.214.50 } } virtual_server 192.168.214.50 80 { ## 定義虛擬伺服器 delay_loop 6 ## 定義健康檢查時間間隔,單位 秒 lb_algo rr ## 負載均衡調度演算法,支持 rr 、wrr 、lc 、wlc 、lblc 、sh 、dh 等 lb_kind DR ## LVS 負載均衡機制,支持 NAT 、TUN 、DR nat_mask 255.255.255.0 ## 子網掩碼 persistence_timeout 120 ## 會話保持時間,單位 秒。提供動態頁面 session 保持功能,同一 IP 該值時間內被持續分配到同一臺節點伺服器上 protocol TCP ## 轉發協議類型,支持 TCP 、UDP real_server 192.168.214.10 80 { ## 定義節點伺服器 weight 1 ## 節點權重值,數字越大權重越高,分配到的連接越多。主要用於後端節點伺服器性能不統一 notify_down /etc/keepalived/real_down.sh ## 該節點伺服器處於 DOWN 狀態後執行的腳本 TCP_CHECK { ## 健康檢測方式,支持 HTTP_GET 、SSL_GET 、TCP_CHECK 、SMTP_CHECK 、MISC_CHECK connect_port 80 ## 檢測埠,不指定時預設為 real_server 指定的埠 connect_timeout 3 ## 無響應超時時間,單位 秒 nb_get_retry 3 ## 重試次數 delay_before_retry 3 ## 重試間隔,單位 秒 } } real_server 192.168.214.40 80 { ## 第二台節點伺服器 weight 1 notify_down /etc/keepalived/real_down.sh TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
shell > vim /etc/keepalived/real_down.sh #!/bin/bash Mail='[email protected]' echo "Real Server State is DOWN" | mail -s "Keepalived Mail" $Mail
## 當 real server 處於 DOWN 狀態時執行的腳本,LVS 要啟動 Sendmail 、Postfix 或其它郵件服務
四、啟動 Keepalived 並加入開機啟動、配置防火牆規則
shell > /etc/init.d/keepalived start shell > chkconfig --add keepalived shell > chkconfig --level 35 keepalived on shell > iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPT shell > service iptables save
## 現在使用 ip add 可以看到綁定了 VIP ,並且 /var/log/messages 日誌文件中也有關於 VIP 綁定、real server 的檢測結果
五、以上都是在 MASTER 主機的操作,下麵配置 BACKUP 主機
## 步驟一、二、四完全一樣,主要將步驟三的 keepalived.conf 中 router_id 、state 、priority 修改為 BACKUP 、BACKUP 、80 即可
## 同樣可以使用 ip add 查看 VIP 信息,不過它現在是 BACKUP 狀態,沒有綁定 VIP 為正常,通過 /var/log/messages 日誌文件可以看到處於 BACKUP 狀態。
六、配置 Real-server ,後端節點伺服器
Real-Server-1
shell > yum -y install httpd shell > echo "welcome to Real-Server-1" > /var/www/html/index.html shell > /etc/init.d/httpd start shell > iptables -I INPUT -p tcp --dport 80 -j ACCEPT
Real-Server-2
shell > yum -y install httpd shell > echo "welcome to Real-Server-2" > /var/www/html/index.html shell > /etc/init.d/httpd start shell > iptables -I INPUT -p tcp --dport 80 -j ACCEPT
shell > vim /etc/init.d/realserver.sh ## Real-Server-1 / Real-Server-2 都要建立此腳本,並設為開機啟動 #!/bin/bash VIP='192.168.214.50' . /etc/init.d/functions case "$1" in start) /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 echo " LVS Real-Server Start Success" ;; stop) /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 " LVS Real-Server Stop Success" ;; *) echo "Usage: $0 ( start | stop )" exit 1 esac shell > chmod a+x /etc/init.d/realserver.sh shell > /etc/init.d/realserver.sh start shell > echo "/etc/init.d/realserver.sh start" >> /etc/rc.local ## 加入開機啟動
## 此腳本用於節點伺服器綁定 VIP ,並抑制響應 VIP 的 ARP 請求。
## 這樣做的目的是為了不讓關於 VIP 的 ARP 廣播時,節點伺服器應答( 因為節點伺服器都綁定了 VIP ,如果不做設置它們會應答,就會亂套 )
七、測試
1、首先單獨測試節點伺服器能不能訪問
## 單獨訪問 192.168.214.10 192.168.214.40 ,如果可以看到頁面顯示 Welcome to Real-Server-1 和 Welcome to Real-Server-2 則節點伺服器正常
2、分別查看節點伺服器是否都綁定了 VIP
## 分別在節點伺服器上使用 ifconfig lo:0 ,如果可以看到 lo:0 虛擬網卡被綁定了 VIP 192.168.214.50 則節點伺服器正常
3、首先查看 MASTER 伺服器有沒有綁定 VIP ,狀態是不是 MASTER ,檢測後端節點伺服器是不是成功
## 使用 ip add 查看是否綁定 VIP ,tail /var/log/messages 查看伺服器狀態是不是 MASTER ,檢測節點伺服器有沒有連接成功信息:
Jul 2 17:38:44 localhost Keepalived_healthcheckers[1015]: TCP connection to [192.168.214.10]:80 success. Jul 2 17:38:44 localhost Keepalived_healthcheckers[1015]: Adding service [192.168.214.10]:80 to VS [192.168.214.50]:80 Jul 2 17:44:01 localhost Keepalived_healthcheckers[1015]: TCP connection to [192.168.214.40]:80 success. Jul 2 17:44:01 localhost Keepalived_healthcheckers[1015]: Adding service [192.168.214.40]:80 to VS [192.168.214.50]:80
## 伺服器狀態信息:
Jul 2 13:07:48 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Transition to MASTER STATE Jul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Entering MASTER STATE Jul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) setting protocol VIPs. Jul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.214.50 Jul 2 13:07:49 localhost Keepalived_healthcheckers[1015]: Netlink reflector reports IP 192.168.214.50 added
4、同樣查看 BACKUP 伺服器有沒有綁定 VIP ,狀態是不是 BACKUP ,檢測後端節點伺服器是不是成功
## 發現沒有綁定 VIP 為正常,狀態為 BACKUP 為正常,同樣能夠檢測到後端節點伺服器為正常,相關信息如下:
Jul 2 17:27:06 localhost Keepalived_vrrp[1017]: VRRP_Instance(VI_1) Entering BACKUP STATE Jul 2 17:27:06 localhost Keepalived_vrrp[1017]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(11,12)] Jul 2 17:27:06 localhost Keepalived_healthcheckers[1016]: Using LinkWatch kernel netlink reflector... Jul 2 17:38:40 localhost Keepalived_healthcheckers[1016]: TCP connection to [192.168.214.10]:80 success. Jul 2 17:38:40 localhost Keepalived_healthcheckers[1016]: Adding service [192.168.214.10]:80 to VS [192.168.214.50]:80 Jul 2 17:44:01 localhost Keepalived_healthcheckers[1016]: TCP connection to [192.168.214.40]:80 success. Jul 2 17:44:01 localhost Keepalived_healthcheckers[1016]: Adding service [192.168.214.40]:80 to VS [192.168.214.50]:80
5、客戶端訪問 VIP 測試負載均衡
## 直接訪問 192.168.214.50 ,如果可以訪問到頁面證明成功。
## 當多次訪問後發現,頁面並沒有發生變化,也就是說並沒有負載均衡。
## 在 MASTER 上使用 ipvsadm -Ln 命令看到的信息如下:
shell > ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.214.50:80 rr persistent 120 -> 192.168.214.10:80 Route 1 0 0 -> 192.168.214.40:80 Route 1 0 87
## 發現有 87 次訪問都被分配到了 192.168.214.40 這台節點伺服器上,這正常嗎 ?
## 不要著急,這是正常的!還記得大明湖畔的夏雨荷嗎?哦不,還記得 persistence_timeout 120 這個參數嗎?
## 正因為設置了 session 保持時間,所以持續的訪問被分配到了某一臺節點伺服器。
## 現在把此參數註釋掉,測試一次( 記得重啟 keepalived )。
shell > ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.214.50:80 rr -> 192.168.214.10:80 Route 1 0 26 -> 192.168.214.40:80 Route 1 0 26
## 可以看到請求被均衡的分配到了現台節點伺服器上( rr 輪詢調度演算法 ),並且頁面也在兩台節點伺服器上切換。
## 當節點伺服器宕機後會發生什麼 ?
shell > tail /var/log/messages Jul 2 18:38:36 localhost Keepalived_healthcheckers[1636]: TCP connection to [192.168.214.40]:80 failed !!! Jul 2 18:38:36 localhost Keepalived_healthcheckers[1636]: Removing service [192.168.214.40]:80 from VS [192.168.214.50]:80
## 檢測失敗,節點伺服器 192.168.214.40 被從 IPVS 中移除
shell > ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.214.50:80 rr -> 192.168.214.10:80 Route 1 0 17
## 宕機的節點伺服器被移除了
Jul 2 18:45:48 localhost Keepalived_healthcheckers[1705]: TCP connection to [192.168.214.40]:80 success. Jul 2 18:45:48 localhost Keepalived_healthcheckers[1705]: Adding service [192.168.214.40]:80 to VS [192.168.214.50]:80
## 當節點伺服器修複後,會自動將節點伺服器加入集群中。
6、客戶端訪問 VIP 測試高可用
## 當 MASTER 伺服器無法提供服務時,VIP 會在 MASTER 上自動移除,BACKUP 伺服器會提升為 MASTER 狀態,綁定 VIP 、接管服務。
## 當 MASTER 修複加入網路後,會自動搶回 VIP ,成為 MASTER 身份。這再繁忙的網路環境中是不理想的。
## 可以通過 nopreempt 參數來設置不搶占功能,設置此參數時需要註意,必須將之前修複的 MASTER 機器狀態設為 BACKUP ,優先順序還保持最高。