實現基於Keepalived高可用集羣網站架構php
環境:隨着業務的發展,網站的訪問量愈來愈大,網站訪問量已經從原來的1000QPS,變爲3000QPS,目前業務已經經過集羣LVS架構可作到隨時拓展,後端節點已經經過集羣技術保障了可用性,但對於前端負載均衡器來講,是個比較大的安全隱患,由於當前端負載均衡器出現故障時,整個集羣就處於癱瘓狀態,所以,負載均衡器的可用性也顯得相當重要,那麼怎麼來解決負載均衡器的可用性問題呢?html
總項目流程圖,詳見 http://www.cnblogs.com/along21/p/8000812.html前端
實驗前準備:linux
① 兩臺服務器都使用yum 方式安裝keepalived 服務nginx
② iptables -F && setenforing 清空防火牆策略,關閉selinux算法
實驗原理:vim
主從:一主一從,主的在工做,從的在休息;主的宕機了,VIP漂移到從上,由從提供服務後端
兩臺centos系統作DR、一主一從,兩臺實現過基於LNMP的電子商務網站centos
機器名稱 |
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 |
後端服務器 |
|
修改keepalived主(lvs-server-master)配置文件實現 virtual_instance 實例
(1)vim /etc/keepalived/keepalived.conf 修改三段
① 全局段,故障通知郵件配置 global_defs { notification_email { root@localhost } notification_email_from root@along.com 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:
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
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
③ 網頁訪問http://172.17.100.100/test.html 發現有real server 1也有real server 2
③ 使keepalive 的主從新開啓服務,由於主的優先級高,因此VIP又從新漂移到了主上
實驗原理:
互爲主從:主從都在工做;其中一個宕機了,VIP漂移到另外一個上,提供服務
機器名稱 |
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 |
後端服務器 |
|
修改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:
(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 } }
能看到網卡別名 和 負載均衡策略已經設置好了,顯示結果會等段時間再顯示
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
客戶端訪問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漂移到了另外一個服務器上
主從:一主一從,主的在工做,從的在休息;主的宕機了,VIP和DIP都漂移到從上,由從提供服務,由於DIP需被rs做爲網關,因此也需漂移
機器名稱 |
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 |
global_defs { notification_email { root@localhost } notification_email_from root@along.com 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
route add default gw 192.168.30.100
③ 網頁訪問http://172.17.100.100/test.html 發現有real server 1也有real server 2
③ 使keepalive 的主從新開啓服務,由於主的優先級高,因此VIP和DIP又從新漂移到了主上
腳本主要內容:檢測到主從發生變化,或錯誤,給誰發郵件;郵件內容是:在什麼時間,誰發生了什麼變化
#!/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
notify_backup "/etc/keepalived/notify.sh backup" notify_master "/etc/keepalived/notify.sh master" notify_fault "/etc/keepalived/notify.sh fault"
原理:在keepalived的配置文件中能直接定義腳本,且能在instance 實例段直接調用生效
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會重漂回來,接上服務。
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回到主上,主恢復服務;