Keepalived 是運行在 lvs 之上,它的主要功能是實現真實機的故障隔離及負載均衡器間的失敗切換 FailOver.lvs 結合 keepalived,就實現了 3 層、4 層、5/7 層交換的功能。下面進行LVS第二種用法,LVS+keepalived。其中ipvsadm的安裝及驗證同本文第4.2章節(這種方式不須要配置Director Server),Real Server的配置及驗證同本文第4.4章節html
*全部Director Server須要安裝keepalived(已經安裝了ipvsadm的主機)ios
地址規劃:與第一種方式相似。算法
服務器名服務器 |
IP地址網絡 |
網關負載均衡 |
虛擬設備名框架 |
虛擬IPtcp |
Director Server:主oop |
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 |
… |
… |
.. |
.. |
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
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 |
首先開啓路由轉發功能:
[root@ localhost ~]#echo "1">/proc/sys/net/ipv4/ip_forward
主服務器的配置文件:
/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。
[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
啓動服務後,使用如下命令,在主備服務器上查看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 |
本例規劃中使用了4臺主機,其實Director Server和Real Server能夠是同一臺主機。作法中須要注意的是,Director Server:主做爲其中之一的Real Server時沒必要要作Real Server配置,即不須要執行lvsRS*.sh。
一、 vip(virtual ip)。直接路由模式的 vip 必須跟服務器對外提供服務的 ip 地址在同一個網段,而且 lvs 負載均衡器和其餘全部提供相同功能的服務器都使用這個 vip.
二、 vip 被綁定在環回接口 lo0:0 上,其廣播地址是其自己,子網掩碼是 255.255.255.255。這與標準的網絡地址設置有很大的不一樣。採用這種可變長掩碼方式把網段劃分紅只含一個主機地址的目的是避免 ip 地址衝突。
三、 echo 「1」,echo 「2」 這段的做用是抑制 arp 廣播。若是不作 arp 抑制,將會有衆多的機器向其餘發arp包宣稱本身是真的,這樣就亂套了。
說明:一個功能比較完整的 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 } |
能夠添加經過郵件通知故障,本例中沒有配置
一、 email 通知。做用:有故障,發郵件報警。這是可選項目,建議不用,用 nagios 全面監控代替之。
二、 花括號「{}」。用來分隔定義塊,所以必須成對出現。若是寫漏了,keepalived 運行時,不會獲得預期的結果。因爲定義塊內存在嵌套關係,所以很容易遺漏結尾處的花括號,這點要特別注意。
● VRRP 定義塊
一、 同步 vrrp 組 vrrp_sync_group。做用:肯定失敗切換(FailOver)包含的路由實例個數。即在有 2 個負載均衡器的場景,一旦某個負載均衡器失效,須要自動切換到另一個負載均衡器的實例是哪些?
二、 實例組 group.至少包含一個 vrrp 實例。
三、 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 使用相同的密碼才能正常通訊。
四、 虛擬 ip 地址 virtual_ipaddress . 能夠有多個地址,每一個地址佔一行,不須要指定子網掩碼。注意:這個 ip 必須與咱們在 lvs 客戶端(real server)設定的 vip 相一致!
● 虛擬服務器 virtual_server 定義塊
虛擬服務器定義是 keepalived 框架最重要的項目了,是 keepalived.conf 必不可少的部分。
一、 虛擬服務器 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 兩種。
二、 真實服務器 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