5.安裝配置keepalived
Keepalived 是運行在 lvs 之上,它的主要功能是實現真實機的故障隔離及負載均衡器間的失敗切換 FailOver.lvs 結合 keepalived,就實現了 3 層、4 層、5/7 層交換的功能。下面進行LVS第二種用法,LVS+keepalived。其中ipvsadm的安裝及驗證同本文第4.2章節(這種方式不需要配置Director Server),Real Server的配置及驗證同本文第4.4章節
*所有Director Server需要安裝keepalived(已經安裝了ipvsadm的主機)
5.1 准備工作
地址規划:與第一種方式類似。
服務器名 |
IP地址 |
網關 |
虛擬設備名 |
虛擬IP |
Director Server:主 |
192.168.98.75 |
192.168.98.1 |
eth0 |
192.168.98.77 |
Director Server:備 |
192.168.98.118 |
192.168.98.1 |
eth0 |
192.168.98.77 |
Real Server 1 |
192.168.98.74 |
192.168.98.1 |
lo:0 |
192.168.98.77 |
Real Server 2 |
192.168.98.117 |
192.168.98.1 |
lo:0 |
192.168.98.77 |
Real Server n |
… |
… |
.. |
.. |
5.2 安裝keepalived
1. 解壓keepalived-1.1.17.tar.gz軟件包:
[root@localhost ~]# tar zxvf keepalived-1.1.17.tar.gz
2. 切換目錄:
[root@localhost ~]# cd keepalived-1.1.17
3. 配置configure
[root@localhost ~]# ./configure –prefix=/usr/local/keepalived
因為 keepalived 運行在 ipvs 之上,因此這兩個軟件一定要安裝在一個系統里面。如果 configure 操作能正常進行,運行完畢后將有如下的匯總輸出:
Keepalived configuration ------------------------ Keepalived version : 1.1.17 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 : No |
4. 編譯安裝
[root@localhost ~]# make
[root@localhost ~]# make install
5.2.1 安裝keepalived驗證
Keepalived 安裝完成后,會在安裝目錄/usr/local/keepalived 生成 bin,etc,sbin,share 這 4 個目錄。其中 etc 為配置文件所在的目錄,進入這個目錄,看看里面都有些什么?
[root@ localhost ~]# cd /usr/local/keepalived/etc/ [root@ localhost etc]# ll total 24 drwxr-xr-x 3 root root 4096 May 30 15:24 keepalived drwxr-xr-x 3 root root 4096 May 30 15:24 rc.d drwxr-xr-x 2 root root 4096 May 30 15:24 sysconfig |
還有子目錄,這里着重關注一下 keepalived 目錄,它的下面包含一個完整的配置文件keepalived.conf(實際上是一個樣例)以及一些單獨的配置樣例文件。
[root@ localhost etc]# cd keepalived/ [root@ localhost keepalived]# ll total 16 -rw-r--r-- 1 root root 3562 May 30 15:24 keepalived.conf drwxr-xr-x 2 root root 4096 May 30 15:24 samples [root@ localhost keepalived]# tree -l . |-- keepalived.conf `-- samples |-- client.pem |-- dh1024.pem |-- keepalived.conf.HTTP_GET.port |-- keepalived.conf.SMTP_CHECK |-- keepalived.conf.SSL_GET |-- keepalived.conf.fwmark |-- keepalived.conf.inhibit |-- keepalived.conf.misc_check |-- keepalived.conf.misc_check_arg |-- keepalived.conf.quorum |-- keepalived.conf.sample |-- keepalived.conf.status_code |-- keepalived.conf.track_interface |-- keepalived.conf.virtual_server_group |-- keepalived.conf.virtualhost |-- keepalived.conf.vrrp |-- keepalived.conf.vrrp.localcheck |-- keepalived.conf.vrrp.lvs_syncd |-- keepalived.conf.vrrp.routes |-- keepalived.conf.vrrp.scripts |-- keepalived.conf.vrrp.static_ipaddress |-- keepalived.conf.vrrp.sync |-- root.pem `-- sample.misccheck.smbcheck.sh 1 directory, 25 files |
5.3 配置keepalived
5.3.1 開啟路由轉發功能
首先開啟路由轉發功能:
[root@ localhost ~]#echo "1">/proc/sys/net/ipv4/ip_forward
5.3.2 keepalived.conf配置
主服務器的配置文件:
/usr/local/keepalive/etc/keepalived/keepalived.conf
#global define global_defs { router_id LVS_TEST_1 #本服務器的名稱,備份組內唯一 } ############################################ # vvrp_instance define # ############################################ vrrp_instance DR_CACHE { #VRRP熱備實例名 state MASTER #熱備狀態,MASTER(主);BACKUP(備份) interface eth0 #承載VIP地址的物理接口 lvs_sync_daemon_inteface eth0 #負載均衡器之間的監控接口(DR模式中同interface) virtual_router_id 51 #虛擬路由器的ID號,組內保存一致 priority 180 #優先級,數值越大優先級越高,MASTER應該高於BACKUP advert_int 5 #主備之間的通告間隔秒數(心跳頻率) authentication { #認證信息,每個熱備組保持一致 auth_type PASS #認證類型,主備切換時的驗證 auth_pass 123 #密碼字串 } virtual_ipaddress { #指定虛擬地址(VIP),可以有多個 192.168.98.77 } } ############################################# # virtual machine setting # ############################################# # setting port 2200 forward virtual_server 192.168.98.77 2200 { #虛擬服務器地址(VIP)、端口,中間用空格隔開 delay_loop 6 #健康檢查的間隔時間(秒) lb_algo wlc #lvs 調度算法,這里使用加權最少鏈接 lb_kind DR #lvs 負載均衡機制,這里使用直連路由 persistence_timeout 20 #同一IP連接20秒內被分配到同一台服務器(會話保持時間) protocol TCP #用 TCP 協議檢查 realserver 狀態 real_server 192.168.98.74 2200 { #第一個real server節點的地址、端口 weight 100 #權重 TCP_CHECK { #健康檢查方式 connect_timeout 3 #故障重試秒數(即連接超時) nb_get_retry 3 #重試延遲(即重試次數) delay_before_retry 3 #重試間隔(秒) connect_port 2200 #檢查的目標端口 } } real_server 192.168.98.117 2200 { weight 100 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 2200 } } } |
備用服務器配置文件:
/usr/local/keepalive/etc/keepalived/keepalived.conf
#global define global_defs { router_id LVS_TEST_2 } ################################################################ # vvrp_instance define # ################################################################ vrrp_instance DR_CACHE { state BACKUP interface eth0 lvs_sync_daemon_inteface eth0 virtual_router_id 51 priority 150 advert_int 5 authentication { auth_type PASS auth_pass 123 } virtual_ipaddress { 192.168.98.77 } } ############################################################## # virtual machine setting # ############################################################## # setting port 2200 forward virtual_server 192.168.98.77 2200 { delay_loop 6 lb_algo wlc lb_kind DR persistence_timeout 20 protocol TCP real_server 192.168.98.74 2200 { weight 100 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 2200 } } real_server 192.168.98.117 2200 { weight 100 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 2200 } } } |
主負載均衡器(MASTER) 與備份負載均衡器(BACKUP)配置文件的差異一共只有 3 處: 全局定義的 route_id、vrrp_instance的state 以及vrrp_instance 的優先級 priority。
5.3.3 將keepalived配置成系統服務
[root@localhost ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ [root@localhost ~]# cp /usr/local/keepalived /etc/sysconfig/keepalived /etc/sysconfig/ [root@localhost ~]# mkdir /etc/keepalived/ [root@localhost ~]# cp /usr/local/keepalived /etc/keepalived/keepalived.conf /etc/keepalived/ [root@localhost ~]# cp /usr/local/keepalived /sbin/keepalived /usr/sbin/ |
[root@localhost ~]# service keepalived start | stop
啟動或者停止keepalived服務。
通過以下命令將keepalived配置成隨系統啟動的服務(兩個運行級別)
[root@localhost ~]# ln -s /etc/init.d/keepalived /etc/rc.d/rc3.d/S98keepalived
[root@localhost ~]# ln -s /etc/init.d/keepalived /etc/rc.d/rc5.d/S98keepalived
5.3.4 配置驗證
啟動服務后,使用以下命令,在主備服務器上查看ip地址情況
[root@ localhost ~]# ip addr
可以看到主服務器的eth0網卡多了個ip,就是我們剛才配置的虛擬ip,而備用服務器上的還沒有,因為他是備用的嘛。
主 |
備 |
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:50:56:91:43:e4 brd ff:ff:ff:ff:ff:ff inet 192.168.98.75/24 brd 192.168.98.255 scope global eth0 inet 192.168.98.77/32 scope global eth0 |
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:50:56:91:14:81 brd ff:ff:ff:ff:ff:ff inet 192.168.98.118/24 brd 192.168.98.255 scope global eth0 inet6 fe80::250:56ff:fe91:1481/64 scope link |
在主服務器上執行命令
[root@ localhost ~]# service keepalived stop
再次查看ip地址情況。就可以看到主服務器上的虛擬ip沒了,而備用服務器上多個了虛擬ip。
然后訪問192.168.98.77的2200端口(可以telnet),
然后使用以下命令查看
[root@ localhost ~]# ipvsadm
查看tcp連接情況。
[root@localhosst etc]# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.98.77:2200 wlc persistent 20 -> 192.168.98.117: 2200 Route 100 0 6 -> 192.168.98.74: 2200 Route 100 0 0 |
[root@ localhost ~]# ipvsadm –lcn
查看測試機的請求被轉發到哪個服務器。
[root@localhost etc]# ipvsadm -lcn IPVS connection entries pro expire state source virtual destination TCP 14:16 ESTABLISHED 192.168.10.176:53564 192.168.98.77:2200 192.168.98.117:2200 TCP 14:16 ESTABLISHED 192.168.10.176:53563 192.168.98.77:2200 192.168.98.117:2200 TCP 00:36 NONE 192.168.10.176:0 192.168.98.77:2200 192.168.98.117:2200 TCP 14:16 ESTABLISHED 192.168.10.176:53562 192.168.98.77:2200 192.168.98.117:2200 TCP 14:16 ESTABLISHED 192.168.10.176:53559 192.168.98.77:2200 192.168.98.117:2200 TCP 14:16 ESTABLISHED 192.168.10.176:53561 192.168.98.77:2200 192.168.98.117:2200 TCP 14:16 ESTABLISHED 192.168.10.176:53560 192.168.98.77:2200 192.168.98.117:2200 |
[root@ localhost ~]# ipvsadm –lcn|grep 192.168.98.117
查看某真實服務器被轉方法情況
[root@netscan etc]# ipvsadm -lcn |grep 192.168.98.117 TCP 14:56 ESTABLISHED 192.168.10.176:53564 192.168.98.77:2200 192.168.98.117:2200 TCP 14:56 ESTABLISHED 192.168.10.176:53563 192.168.98.77:2200 192.168.98.117:2200 TCP 00:16 NONE 192.168.10.176:0 192.168.98.77:2200 192.168.98.117:2200 TCP 14:56 ESTABLISHED 192.168.10.176:53562 192.168.98.77:2200 192.168.98.117:2200 TCP 14:56 ESTABLISHED 192.168.10.176:53559 192.168.98.77:2200 192.168.98.117:2200 TCP 14:56 ESTABLISHED 192.168.10.176:53561 192.168.98.77:2200 192.168.98.117:2200 TCP 14:56 ESTABLISHED 192.168.10.176:53560 192.168.98.77:2200 192.168.98.117:2200 |
6 附錄:配置說明
6.1 主機規划說明
本例規划中使用了4台主機,其實Director Server和Real Server可以是同一台主機。做法中需要注意的是,Director Server:主作為其中之一的Real Server時不必要做Real Server配置,即不需要執行lvsRS*.sh。
6.2 Real server 配置說明
1、 vip(virtual ip)。直接路由模式的 vip 必須跟服務器對外提供服務的 ip 地址在同一個網段,並且 lvs 負載均衡器和其他所有提供相同功能的服務器都使用這個 vip.
2、 vip 被綁定在環回接口 lo0:0 上,其廣播地址是其本身,子網掩碼是 255.255.255.255。這與標准的網絡地址設置有很大的不同。采用這種可變長掩碼方式把網段划分成只含一個主機地址的目的是避免 ip 地址沖突。
3、 echo “1”,echo “2” 這段的作用是抑制 arp 廣播。如果不做 arp 抑制,將會有眾多的機器向其他發arp包宣稱自己是真的,這樣就亂套了。
6.3 Keepalived.conf 配置說明
說明:一個功能比較完整的 keepalived 的配置文件,其配置文件 keepalived.conf 可以包含三個文本塊:全局定義塊、 VRRP 實例定義塊及虛擬服務器定義塊。全局定義塊和虛擬服務器定義塊是必須的,如果在只有一個負載均衡器的場合,就不須 VRRP 實例定義塊。主服務器和備用服務器上安裝ipvsadm和keepalived的方法都一樣,主要的差別在於配置文件keepalived.conf上。
● 全局定義塊
global_defs { notification_email { test@sina.com #故障接受聯系人 } notification_email_from admin@test.com #故障發送人 smtp_server 127.0.0.1 #本機發送郵件 smtp_connect_timeout 30 router_id LVS_MASTER #BACKUP上修改為LVS_BACKUP } |
可以添加通過郵件通知故障,本例中沒有配置
1、 email 通知。作用:有故障,發郵件報警。這是可選項目,建議不用,用 nagios 全面監控代替之。
2、 花括號“{}”。用來分隔定義塊,因此必須成對出現。如果寫漏了,keepalived 運行時,不會得到預期的結果。由於定義塊內存在嵌套關系,因此很容易遺漏結尾處的花括號,這點要特別注意。
● VRRP 定義塊
1、 同步 vrrp 組 vrrp_sync_group。作用:確定失敗切換(FailOver)包含的路由實例個數。即在有 2 個負載均衡器的場景,一旦某個負載均衡器失效,需要自動切換到另外一個負載均衡器的實例是哪些?
2、 實例組 group.至少包含一個 vrrp 實例。
3、 vrrp 實例 vrrp_instance.實例名出自實例組 group 所包含的那些名字。
(1) 實例狀態 state.只有 MASTER 和 BACKUP 兩種狀態,並且需要大寫這些單詞。其中MASTER 為工作狀態,BACKUP 為備用狀態。當 MASTER 所在的服務器失效時,BACKUP 所在的系統會自動把它的狀態有 BACKUP 變換成 MASTER;當失效的MASTER 所在的系統恢復時,BACKUP 從 MASTER 恢復到 BACKUP 狀態。
(2) 通信接口 interface。對外提供服務的網絡接口,如 eth0,eth1.當前主流的服務器都有2 個或 2 個以上的接口,在選擇服務接口時,一定要核實清楚。
(3) lvs_sync_daemon_inteface。負載均衡器之間的監控接口。在 DR 模式中,lvs_sync_daemon_inteface 與服務接口 interface 使用同一個網絡接口。
(4) 虛擬路由標識 virtual_router_id.這個標識是一個數字,並且同一個 vrrp 實例使用唯一的標識。即同一個 vrrp_stance,MASTER 和 BACKUP 的 virtual_router_id 是一致的,同時在整個 vrrp 內是唯一的。
(5) 優先級 priority.這是一個數字,數值愈大,優先級越高。在同一個 vrrp_instance里,MASTER 的優先級高於 BACKUP。若 MASTER 的 priority 值為 150,那么 BACKUP的 priority 只能是 140 或更小的數值。
(6) 同步通知間隔 advert_int.MASTER 與 BACKUP 負載均衡器之間同步檢查的時間間隔,單位為秒。
(7) 驗證 authentication。包含驗證類型和驗證密碼。類型主要有 PASS、AH 兩種,通常使用的類型為 PASS,據說 AH 使用時有問題。驗證密碼為明文,同一 vrrp 實例MASTER 與 BACKUP 使用相同的密碼才能正常通信。
4、 虛擬 ip 地址 virtual_ipaddress . 可以有多個地址,每個地址占一行,不需要指定子網掩碼。注意:這個 ip 必須與我們在 lvs 客戶端(real server)設定的 vip 相一致!
● 虛擬服務器 virtual_server 定義塊
虛擬服務器定義是 keepalived 框架最重要的項目了,是 keepalived.conf 必不可少的部分。
1、 虛擬服務器 virtual_server. 這個 ip 來自於 vrrp 定義塊的第“4”步,后面一個空格,然后加上端口號。定義一個 vip,可以實現多個 tcp 端口的負載均衡功能。
(1) delay_loop。健康檢查時間間隔,單位是秒。
(2) lb_algo. 負載均衡調度算法,互聯網應用常使用 wlc 或 rr。
(3) lb_kind. 負載均衡轉發規則。一般包括 DR,NAT,TUN3 種,此處使用DR 的方式。
(4) persistence_timeout.會話保持時間,單位是秒。這個選項對動態網站很有用處:當用戶從遠程用帳號進行登陸網站時,有了這個會話保持功能,就能把用戶的請求轉發給同一個應用服務器。在這里,我們來做一個假設,假定現在有一個 lvs 環境,使用 DR 轉發模式,真實服務器有 3 個,負載均衡器不啟用會話保持功能。當用戶第一次訪問的時候,他的訪問請求被負載均衡器轉給某個真實服務器,這樣他看到一個登陸頁面,第一次訪問完畢;接着他在登陸框填寫用戶名和密碼,然后提交;這時候,問題就可能出現了—登陸不能成功。因為沒有會話保持,負載均衡器可能會把第 2 次的請求轉發到其他的服務器。
(5) 轉發協議 protocol.一般有 tcp 和 udp 兩種。
2、 真實服務器 real_server.也即服務器池。 Real_server 的值包括 ip 地址和端口號。
(1) 權重 weight.權重值是一個數字,數值越大,權重越高。使用不同的權重值的目的在於為不同性能的機器分配不同的負載,性能較好的機器,負載分擔大些;反之,性能差的機器,則分擔較少的負載,這樣就可以合理的利用不同性能的機器資源。
(2) Tcp 檢查 tcp_check。
參考資料:
http://www.keepalived.org/pdf/sery-lvs-cluster.pdf
http://www.cnblogs.com/mchina/archive/2012/08/27/2644391.html
http://blog.51cto.com/tag-lvs%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE.html