keepalived是專門針對LVS設計的一款強大的輔助工具,主要用來提供故障切換和健康檢查功能——判斷LVS負載調度器,節點服務器的可用性,及時隔離並替換爲新的服務器,當故障主機恢復後將其從新加入羣集。算法
Keepalived的熱備方式vim
Keepalived採用VRRP(虛擬路由冗餘協議)熱備份協議,以軟件的方式實現Linux服務器的多機熱備功能。VRRP是針對路由器的一種備份解決方案——有多臺路由組成一個熱備組,經過共用的虛擬IP地址對外提供服務;每一個熱備組內同一時刻只有一臺主路由器提供服務 ,其餘路由器處於冗餘狀態,若當前在線路由器失敗,則其餘路由器會自動接替(優先級決定接替順序)虛擬IP地址,以繼續提供服務。以下圖所示:bash
熱備組內的每臺路由器都有可能成爲主路由器,虛擬路由器的IP地址能夠在熱備組內的路由器之間進行轉移,因此也稱爲漂移IP地址。使用keepalived時,漂移地址的實現不須要手動創建虛接口配置文件,而是由keepalived根據配置文件自動管理。服務器
LVS+Keepalived高可用羣集
負載均衡
Keepalived的設計目標是構建可用的LVS負載均衡羣集,能夠調用ipvsadm工具來建立虛擬服務器,管理服務器池,而不單單用來作雙機熱備。使用keepalived構建LVS羣集更加簡便易用,主要優點體如今:對LVS負載調度器實現熱備切換,提升可用性,對服務器池中的節點進行健康檢查,自動移除失效節點,恢復後再從新加入。less
在基於LVS-Keepalived實現的LVS羣集結構中,至少包括兩臺熱備的負載調度器,兩臺以上的節點服務器,本例將以DR模式的LVS羣集爲基礎,增長一臺從負載調度器,使用Keepalived來實現主、從調度器的熱備,從而構建建有負載均衡、高可用兩種能力的LVS網站羣集平臺。以下面案例圖所示:dom
使用Keepalived構建LVS羣集時,也須要用到ipvsadm管理工具,但大部分工做會由Keepalived自動完成,不須要手動執行ipvsadm。ide
實驗案例:工具
公司的Web平臺已採用LVS-DR負載均衡結構,但只有一個負載均衡器。爲了提升Web服務的持續可用性,要求增長一臺負載調度器,與原有的調度器實現雙擊熱備,並要求能自動管理服務器池,而不是由管理員手動添加、移除節點,以下圖所示:oop
需求描述:
1. 將現有的LVS羣集改造爲LVS+Keepalived高可用負載均衡羣集
2. 主調度器負則分配客戶機請求,若出現故障則由從調度器自動接替服務
3. 啓用郵件通知功能,以便及時瞭解各Web節點服務器的健康情況
實驗步驟以下:
此實驗是在上篇博客的LVS-DR基礎上新增一個從調度器,參考文檔https://blog.51cto.com/yangshufan/2065686
1. 配置主調度器
[root@localhost ~]# service ipvsadm stop //清除原有的ipvsadm策略 ipvsadm: Clearing the current IPVS table: [肯定] ipvsadm: Unloading modules: [肯定] [root@localhost ~]# ipvsadm -ln //確認清空 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@localhost ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:0 //刪除網卡eth0:0 [root@localhost ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:1C:B4:FB inet addr:172.16.16.173 Bcast:172.16.16.255 Mask:255.255.255.0 eth1 Link encap:Ethernet HWaddr 00:0C:29:1C:B4:05 inet addr:192.168.7.173 Bcast:192.168.7.255 Mask:255.255.255.0 [root@localhost ~]# yum -y install kernel-devel openssl-devel popt-devel //安裝支持軟件 [root@localhost ~]# tar zxf keepalived-1.2.13.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/keepalived-1.2.13/ [root@localhost keepalived-1.2.13]# ./configure --prefix=/ //安裝路徑指定爲根目錄,這樣就無需額外建立連接文件 --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64 //只有在使用LVS時,才須要指定此參數 [root@localhost keepalived-1.2.13]# make && make install [root@localhost keepalived-1.2.13]# chkconfig --add keepalived //添加爲系統服務 [root@localhost keepalived-1.2.13]# chkconfig keepalived on //設置爲開機自啓動 [root@localhost keepalived-1.2.13]# cd /etc/keepalived/ [root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak //備份配置文件 [root@localhost keepalived]# vim keepalived.conf //修改配置文件 global_defs { //此區域指定全局參數 notification_email { //郵件服務 root@firewall.loc //收件人地址 } notification_email_from ysf localhost.localdomain //發件人姓名、地址 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS-1 //本服務器的名稱 } vrrp_instance VI_1 { //此區域指定VRRP熱備參數 state MASTER //熱備狀態,MASTER表示爲主服務器 interface eth0 //承載VIP地址的物理接口 virtual_router_id 51 //虛擬路由器的ID號,每一個熱備組必須保持一致 priority 100 //優先級,數值越大,優先級越高 advert_int 1 //通告間隔秒數(心跳頻率) authentication { //認證信息,每一個熱備組必須保持一致 auth_type PASS //認證類型 auth_pass 1111 //密碼字串 } virtual_ipaddress { 172.16.16.172 //指定漂移地址(VIP),能夠有多個 } }
#下面區域用來配置虛擬服務器 virtual_server 172.16.16.172 80 { //虛擬服務器地址(VIP)、端口 delay_loop 6 //健康檢查的間隔秒數(秒) lb_algo rr //輪詢(rr)調度算法 lb_kind DR //直接路由(DR)集羣工做模式 nat_mask 255.255.255.0 persistence_timeout 50 //鏈接保持秒數 protocol TCP //應用服務採用TCP協議 real_server 172.16.16.177 80 { //第一個Web節點的地址、端口 weight 1 //節點的權重 TCP_CHECK { //健康檢查方式 connect_port 80 //檢查的目標端口 connect_timeout 3 //鏈接超時(秒) nb_get_retry 3 //重試次數 delay_before_retry 3 //重試間隔(秒) } } real_server 172.16.16.178 80 { //第二個Web節點的地址、端口 …… //和第一個的配置相同,省略 } real_server 172.16.16.179 80 { //第三個Web節點的地址、端口 …… } real_server 172.16.16.180 80 { //第四個Web節點的地址、端口 …… } } [root@localhost keepalived]# /etc/init.d/keepalived start 正在啓動 keepalived: [肯定] [root@localhost keepalived]# ip addr show dev eth0 //查看自動添加的VIP地址 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:1c:b4:fb brd ff:ff:ff:ff:ff:ff inet 172.16.16.173/24 brd 172.16.16.255 scope global eth0 inet 172.16.16.172/32 scope global eth0 //自動設置的VIP地址 inet6 fe80::20c:29ff:fe1c:b4fb/64 scope link valid_lft forever preferred_lft forever [root@localhost keepalived]# ipvsadm -ln //自動建立虛擬服務器,添加服務器節點 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.16.172:80 rr -> 172.16.16.178:80 Route 1 0 0 -> 172.16.16.179:80 Route 1 0 0 -> 172.16.16.180:80 Route 1 0 0
2. 配置從調度器
[root@localhost ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:1C:B4:4D inet addr:172.16.16.174 Bcast:172.16.16.255 Mask:255.255.255.0 eth1 Link encap:Ethernet HWaddr 00:0C:29:1C:B4:05 inet addr:192.168.7.174 Bcast:192.168.7.255 Mask:255.255.255.0 [root@localhost ~]# modprobe ip_vs [root@localhost ~]# yum -y install kernel-devel openssl-devel popt-devel [root@localhost ~]# yum -y install ipvsadm [root@localhost ~]# tar zxf keepalived-1.2.13.tar.gz -C /usr/src/ [root@localhost ~]# cd /usr/src/keepalived-1.2.13/ [root@localhost keepalived-1.2.13]# ./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64 [root@localhost keepalived-1.2.13]# make && make install [root@localhost keepalived-1.2.13]# chkconfig --add keepalived [root@localhost keepalived-1.2.13]# chkconfig keepalived on [root@localhost ~]# cd ~ //從服務器的配置文件可從主服務器中複製 [root@localhost ~]# scp root@172.16.16.173:/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf root@172.16.16.173's password: keepalived.conf 100% 1378 1.4KB/s 00:00 [root@localhost ~]# vim /etc/keepalived/keepalived.conf //修改其中的三項 router_id LVS-2 //從調度器的名稱 state BACKUP //從調度器的熱備狀態 priority 50 //從調度器的優先級 [root@localhost keepalived]# /etc/init.d/keepalived start 正在啓動 keepalived: [肯定]
3. 配置Web節點服務器
本實驗是基於上篇實驗配置的,Web節點服務器的配置不用修改,參考文檔https://blog.51cto.com/yangshufan/2065686
4. LVS+Keepalived集成測試
(1)禁用主調度器的eth0網卡,3分鐘後從新啓用,確認主從熱備正常
(2)禁用Web服務器池的一部分節點,確認對Web羣集的訪問仍然正常
(3)查閱通知郵件內容
[root@localhost ~]# less /var/spool/mail/root From ysf@localhost.localdomain Wed Jan 31 05:51:02 2018 Return-Path: <ysf@localhost.localdomain> X-Original-To: root@localhost.localdomain Delivered-To: root@localhost.localdomain Received: from localhost (localhost [127.0.0.1]) by localhost.localdomain (Postfix) with SMTP id 05C61422BA for <root@localhost.localdomain>; Wed, 31 Jan 2018 05:51:01 +0800 (CST) Date: Tue, 30 Jan 2018 21:51:02 +0000 From: ysf@localhost.localdomain Subject: [LVS-1] Realserver [172.16.16.177]:80 - DOWN X-Mailer: Keepalived To: root@localhost.localdomain Message-Id: <20180130215102.05C61422BA@localhost.localdomain> => TCP CHECK failed on service <= ...skipping... From ysf@localhost.localdomain Wed Jan 31 05:51:02 2018 Return-Path: <ysf@localhost.localdomain> X-Original-To: root@localhost.localdomain Delivered-To: root@localhost.localdomain Received: from localhost (localhost [127.0.0.1]) by localhost.localdomain (Postfix) with SMTP id 05C61422BA for <root@localhost.localdomain>; Wed, 31 Jan 2018 05:51:01 +0800 (CST) Date: Tue, 30 Jan 2018 21:51:02 +0000 From: ysf@localhost.localdomain Subject: [LVS-1] Realserver [172.16.16.177]:80 - DOWN X-Mailer: Keepalived To: root@localhost.localdomain Message-Id: <20180130215102.05C61422BA@localhost.localdomain> => TCP CHECK failed on service <=