實現基於Keepalived高可用集群網站架構 環境:隨著業務的發展,網站的訪問量越來越大,網站訪問量已經從原來的1000QPS,變為3000QPS,目前業務已經通過集群LVS架構可做到隨時拓展,後端節點已經通過集群技術保障了可用性,但對於前端負載均衡器來說,是個比較大的安全隱患,因為當前端負載均衡 ...
實現基於Keepalived高可用集群網站架構
環境:隨著業務的發展,網站的訪問量越來越大,網站訪問量已經從原來的1000QPS,變為3000QPS,目前業務已經通過集群LVS架構可做到隨時拓展,後端節點已經通過集群技術保障了可用性,但對於前端負載均衡器來說,是個比較大的安全隱患,因為當前端負載均衡器出現故障時,整個集群就處於癱瘓狀態,因此,負載均衡器的可用性也顯得至關重要,那麼怎麼來解決負載均衡器的可用性問題呢?
總項目流程圖,詳見http://www.cnblogs.com/along21/p/7435612.html
① 兩台伺服器都使用yum 方式安裝keepalived 服務
② iptables -F && setenforing 清空防火牆策略,關閉selinux
實驗一:實現keepalived主從方式高可用基於LVS-DR模式的應用實戰:
實驗原理:
主從:一主一從,主的在工作,從的在休息;主的宕機了,VIP漂移到從上,由從提供服務
1、環境準備:
兩台centos系統做DR、一主一從,兩台實現過基於LNMP的電子商務網站
機器名稱 |
IP配置 |
服務角色 |
備註 |
lvs-server-master |
VIP:172.17.100.100 DIP:172.17.1.6 |
負載均衡器 主伺服器 |
開啟路由功能 配置keepalived |
lvs-server-backup |
VIP:172.17.100.100 DIP:172.17.11.11 |
後端伺服器 從伺服器 |
開啟路由功能 配置keepalived |
rs01 |
RIP:172.17.1.7 |
後端伺服器 |
|
rs02 |
RIP:172.17.22.22 |
後端伺服器 |
|
2、在lvs-server-master 主上
修改keepalived主(lvs-server-master)配置文件實現 virtual_instance 實例
(1)vim /etc/keepalived/keepalived.conf 修改三段
① 全局段,故障通知郵件配置 global_defs { notification_email { root@localhost } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id keepalived_lvs } ② 配置虛擬路由器的實例段,VI_1是自定義的實例名稱,可以有多個實例段 vrrp_instance VI_1 { #VI_1是自定義的實例名稱 state MASTER #初始狀態,MASTER|BACKUP interface eth1 #通告選舉所用埠 virtual_router_id 51 #虛擬路由的ID號(一般不可大於255) priority 100 #優先順序信息 #備節點必須更低 advert_int 1 #VRRP通告間隔,秒 authentication { auth_type PASS #認證機制 auth_pass along #密碼(儘量使用隨機) } virtual_ipaddress { 172.17.100.100 #vip } } ③ 設置一個virtual server段 virtual_server 172.17.100.100 80 { #設置一個virtual server: delay_loop 6 # service polling的delay時間,即服務輪詢的時間間隔 lb_algo wrr #LVS調度演算法:rr|wrr|lc|wlc|lblc|sh|dh lb_kind DR #LVS集群模式:NAT|DR|TUN nat_mask 255.255.255.255 persistence_timeout 600 #會話保持時間(持久連接,秒),即以用戶在600秒內被分配到同一個後端realserver protocol TCP #健康檢查用的是TCP還是UDP
④ real server設置段 real_server 172.17.1.7 80 { #後端真實節點主機的權重等設置 weight 1 #給每台的權重,rr無效 HTTP_GET { #http服務 url { path / } connect_timeout 3 #連接超時時間 nb_get_retry 3 #重連次數 delay_before_retry 3 #重連間隔 } } real_server 172.17.22.22 80 { weight 2 HTTP_GET { url { path / } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
(3)因為是主從方式,所以從上的配置和主只有一點差別;所以可以把這個配置文件拷過去
scp /etc/keepalived/keepalived.conf @172.17.11.11:
3、在lvs-server-backup 從上
vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass along }
負載均衡策略已經設置好了,註意:主director沒有宕機,從上就不會有VIP
4、在real server 上
ifconfig lo:0 172.17.100.100 broadcast 172.17.100.100 netmask 255.255.255.255 up
route add -host 172.17.100.100 lo:0
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
1:僅在請求的目標IP配置在本地主機的接收到請求報文的介面上時,才給予響應
net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
5、測試
③ 網頁訪問http://172.17.100.100/test.html 發現有real server 1也有real server 2
③ 使keepalive 的主重新開啟服務,因為主的優先順序高,所以VIP又重新漂移到了主上
實驗二:實現keepalived雙主方式高可用基於LVS-DR模式的應用實戰:
實驗原理:
互為主從:主從都在工作;其中一個宕機了,VIP漂移到另一個上,提供服務
1、實驗環境,基本同上
機器名稱 |
IP配置 |
服務角色 |
備註 |
lvs-server-1 |
VIP:172.17.100.100 DIP:172.17.1.6 |
負載均衡器 主伺服器 |
開啟路由功能 配置keepalived |
lvs-server2 |
VIP:172.17.100.101 DIP:172.17.11.11 |
後端伺服器 從伺服器 |
開啟路由功能 配置keepalived |
rs01 |
RIP:172.17.1.7 |
後端伺服器 |
|
rs02 |
RIP:172.17.22.22 |
後端伺服器 |
|
2、在lvs-server1 上,基本同上,就是加了一個實例段
修改keepalived主(lvs-server-master)配置文件實現 virtual_instance 實例
(1)vim /etc/keepalived/keepalived.conf
① 主的設置 VI_1
vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass along } virtual_ipaddress { 172.17.100.100 } } virtual_server 172.17.100.100 80 { delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.255 persistence_timeout 600 protocol TCP real_server 172.17.1.7 80 { weight 1 HTTP_GET { url { path / } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.17.22.22 80 { weight 1 HTTP_GET { url { path / } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
vrrp_instance VI_2 { state BACKUP interface eth1 virtual_router_id 52 priority 98 advert_int 1 authentication { auth_type PASS auth_pass along } virtual_ipaddress { 172.17.100.101 } } virtual_server 172.17.100.101 443 { delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.255 persistence_timeout 600 protocol TCP real_server 172.17.1.7 443 { weight 1 HTTP_GET { url { path / } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.17.22.22 443 { weight 1 HTTP_GET { url { path / } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
(3)因為是主從方式,所以從上的配置和主只有一點差別;所以可以把這個配置文件拷過去
scp /etc/keepalived/keepalived.conf @172.17.11.11:
3、在lvs-server2 上,基本同1,就是把實例的主從調換一下
(1)vim /etc/keepalived/keepalived.conf
① vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 51 priority 98 advert_int 1 authentication { auth_type PASS auth_pass along } virtual_ipaddress { 172.17.100.100 } } ② vrrp_instance VI_2 { state MASTER interface eth1 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass along } virtual_ipaddress { 172.17.100.101 } }
能看到網卡別名 和 負載均衡策略已經設置好了,顯示結果會等段時間再顯示
4、在real server 上
ifconfig lo:0 172.17.100.100 broadcast 172.17.100.100 netmask 255.255.255.255 up
ifconfig lo:1 172.17.100.101 broadcast 172.17.100.101 netmask 255.255.255.255 up
route add -host 172.17.100.100 lo:0
route add -host 172.17.100.101 lo:1
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
1:僅在請求的目標IP配置在本地主機的接收到請求報文的介面上時,才給予響應
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
5、測試
客戶端訪問http://172.17.100.100/ 公網172.17.100.100只能訪問80
https://172.17.100.101/ 公網172.17.100.101只能訪問443
③ 網頁訪問http://172.17.100.100/test.html或https://172.17.100.101/test.html 發現有real server 1也有real server 2
會發現服務能照常訪問,另一個機器80、443都能訪問,且宕機的VIP漂移到了另一個伺服器上
實驗三:實現keepalived主從方式高可用基於LVS-NAT模式的應用實戰:
主從:一主一從,主的在工作,從的在休息;主的宕機了,VIP和DIP都漂移到從上,由從提供服務,因為DIP需被rs作為網關,所以也需漂移
1、環境準備
機器名稱 |
IP配置 |
服務角色 |
備註 |
vs-server-master |
VIP:172.17.100.100 DIP:192.168.30.100 |
負載均衡器 主伺服器 |
開啟路由功能 配置keepalived |
lvs-server-backup |
VIP:172.17.100.100 DIP:192.168.30.100 |
後端伺服器 從伺服器 |
開啟路由功能 配置keepalived |
rs01 |
RIP:192.168.30.107 |
後端伺服器 |
網關指向DIP |
rs02 |
RIP:192.168.30.7 |
後端伺服器 |
網關指向DIP |
2、在lvs-server-master 主上
global_defs { notification_email { root@localhost } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id keepalived_lvs } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass along } virtual_ipaddress { 172.17.100.100 192.168.30.100 } } virtual_server 172.17.100.100 80 { delay_loop 6 lb_algo wrr lb_kind NAT nat_mask 255.255.255.255 persistence_timeout 100 protocol TCP real_server 192.168.30.107 80 { weight 1 HTTP_GET { url { path / } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.30.7 80 { weight 2 HTTP_GET { url { path / } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
(4)因為是主從方式,所以從上的配置和主只有一點差別;所以可以把這個配置文件拷過去
scp /etc/keepalived/keepalived.conf @172.17.11.11:
vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass along }
負載均衡策略已經設置好了,註意:主director沒有宕機,從上就不會有VIP
4、在real server 上
route add default gw 192.168.30.100
5、測試
③ 網頁訪問http://172.17.100.100/test.html 發現有real server 1也有real server 2
③ 使keepalive 的主重新開啟服務,因為主的優先順序高,所以VIP和DIP又重新漂移到了主上
實驗四:實現keeaplived 故障通知機制
1、編寫好腳本
腳本主要內容:檢測到主從發生變化,或錯誤,給誰發郵件;郵件內容是:在什麼時間,誰發生了什麼變化
#!/bin/bash # Author: www.magedu.com contact='root@localhost' notify() { mailsubject="$(hostname) to be $1: vip floating" mailbody="$(date +'%F %H:%M:%S'): vrrp transition, $(hostname) changed to be $1" echo $mailbody | mail -s "$mailsubject" $contact } case $1 in master) notify master exit 0 ;; backup) notify backup exit 0 ;; fault) notify fault exit 0 ;; *) echo "Usage: $(basename $0) {master|backup|fault}" exit 1 ;; esac
腳本加許可權 chmod +x /etc/keepalived/notify.sh
2、在keepalived 的配置文件調用腳本
notify_backup "/etc/keepalived/notify.sh backup" notify_master "/etc/keepalived/notify.sh master" notify_fault "/etc/keepalived/notify.sh fault"
實驗五:實現keepaplived自定義腳本檢測功能
原理:在keepalived的配置文件中能直接定義腳本,且能在instance 實例段直接調用生效
方案一:檢測是否存在down文件,來實現主從的調整
vrrp_script chk_down { #定義一個腳本,腳本名稱為chk_down script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" #檢查這個down文件,若存在返回值為1,keepalived會停止;不存在返回值為0,服務正常運行;這裡的exit和bash腳本里的return很相似 interval 2 #每2秒檢查一次
}
track_script {
chk_down
}
在主上,創建一個/etc/keepalived/down 文件,主的keepalived服務立刻停止,VIP漂到從上,從接上服務;
down文件一旦刪除,主的keepalived服務會立即啟動,若優先順序高或優先順序低但設置的搶占,VIP會重漂回來,接上服務。
方案二:檢測nginx服務是否開啟,來實現調整主從
vrrp_script chk_nginx { script "killall -0 nginx" #killall -0 檢測這個進程是否還活著,不存在就減權重 interval 2 #每2秒檢查一次 fall 2 #失敗2次就打上ko的標記 rise 2 #成功2次就打上ok的標記 weight -4 #權重,優先順序-4,若為ko }
track_script {
chk_nginx
}
若主的nginx服務沒有開啟,則每2秒-4的權重,當優先順序小於從,VIP漂到從上,從接上服務;
若主的nginx服務開啟,重讀配置文件,優先順序恢復,VIP回到主上,主恢復服務;