1、什麼是keepalived?
利用虛擬路由冗餘協議(vrrp)技術,實現lvs的高可用,也能夠對nginx和haproxy等輕量級帶有負載均衡的軟件進行高可用。由於keepalived很是輕量級,速度很是快,配置簡單,因此受到衆多企業運維人員青睞。 參考資料:http://outofmemory.cn/wiki/keepalived-configuration php 2、虛擬路由備份協議 VRRP(Virtual Router Redundancy Protocol,虛擬路由冗餘協議)是一種容錯協議,這個協議內的全部路由分爲主備,平時數據都是由主節點的IP接口接收轉發,一旦主節點故障,就自動啓動備用節點,奪取主節點的IP,接管主節點的全部轉發工做。 node |
3、案例:KeepAlived 實現高可用 LVS
一、環境準備
- 準備兩個http節點:172.16.113.13 172.16.113.14 vip:172.16.13.1
- 準備兩個lvs節點: 172.16.13.13 172.16.13.14 vip:172.16.13.1
- 測試兩個lvs節點可不能夠對後面兩個http節點進行負載均衡
- 配置keepalived:172.16.13.13 172.16.13.14 vip:172.16.13.1
- 測試keepalived對lvs的高可用性
二、網絡拓撲圖
nginx
三、兩個http節點上的配置
1)安裝並開啓http服務,確保80端口開啓可用;
2)配置lvs-RS
web
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
# vim chk-lvs.sh //寫個腳本配置方便多了,只要執行如下就能夠了 #!/bin/bash vip=172.16.13.1 interface="lo:0" case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig $interface $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip dev $interface ;; stop) echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig $interface down ;; status) if ifconfig lo:0 |grep $vip &> /dev/null; then echo "ipvs is running." else echo "ipvs is stopped." fi ;; *) echo "Usage: `basename $0` {start|stop|status}" exit 1 esac # service httpd start # bash chk-lvs start
|
3)瀏覽器分別輸入172.16.113.13和172.16.113.14測試http服務是否可用
四、準備兩個LVS節點並測試可用
1) 安裝ipvsadm
2) 配置ipvs規則
3) 測試lvs負載均衡是否是可用
算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
# yum install ipvsadm -y
# vim ipvs.sh #!/bin/bash vip=172.16.13.1 rip=('172.16.113.13' '172.16.113.14') weight=('1' '2') port=80 scheduler=rr ipvstype='-g' case $1 in start) iptables -F -t filter ipvsadm -C ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip dev eth0:0 echo 1 > /proc/sys/net/ipv4/ip_forward ipvsadm -A -t $vip:$port -s $scheduler [ $? -eq 0 ] && echo "ipvs service $vip:$port added." || exit 2 for i in `seq 0 $[${#rip[@]}-1]`; do ipvsadm -a -t $vip:$port -r ${rip[$i]} $ipvstype -w ${weight[$i]} [ $? -eq 0 ] && echo "RS ${rip[$i]} added." done touch /var/lock/subsys/ipvs ;; stop) echo 0 > /proc/sys/net/ipv4/ip_forward ipvsadm -C ifconfig eth0:0 down rm -f /var/lock/subsys/ipvs echo "ipvs stopped." ;; status) if [ -f /var/lock/subsys/ipvs ]; then echo "ipvs is running." ipvsadm -L -n else echo "ipvs is stopped." fi ;; *) echo "Usage: `basename $0` {start|stop|status}" exit 3 ;; esac # bash ipvs.sh start # ipvsadm -Ln
|
4)瀏覽器輸入172.16.13.1測試DR模型能不能負載
五、安裝配置keepalived
vim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
# yum install keepalived -y # vim /etc/keepalived/keepalived.conf global_defs { notification_email { admin@126.com //目標郵箱,能夠有多個 } notification_email_from root@node3.wuhf.com //發件人郵箱 smtp_server 127.0.0.1 //郵件服務器地址 smtp_connect_timeout 30 //郵件服務器鏈接超時時長 router_id LVS_DEVEL //運行Keepalived服務器的一個標識。發郵件時顯示在郵件標題中的信息 } vrrp_script chk_mt_down { //定義一個函數,檢測外部因素決定權重的增長或刪除 script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" //若是檢測到down文件,就自動減5個數值的權重 interval 1 //一秒檢測一次 weight -5 } vrrp_instance VI_1 { //定義一個vrrp實例 state BACKUP //裝態有兩個MASTER / BACKUP interface eth0 //指定網卡 virtual_router_id 52 //虛擬路由標識,這個標識是一個數字,而且同一個vrrp實例使用惟一的標識,即同一個vrrp_instance下,MASTER和BACKUP必須是一致的,範圍0-255 priority 95 //定義優先級,數字越大,優先級越高,在一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級。 advert_int 1 //設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { //設定認證機制 auth_type PASS //設置驗證類型,主要有PASS和AH兩種 auth_pass 21111 //主備密碼必須相同 } virtual_ipaddress { //虛擬ip能夠定義多個;格式:ip/16 dev eth2 label eth2:1 172.16.13.1 } track_script { //在這裏定義一個函數,追蹤上面定義的chk_mt_down函數 chk_mt_down } notify_master "/etc/keepalived/notify.sh master" //下面三行定義消息通知機制的,須要在/etc/keepalived/目錄下建立執行腳本notify.sh,腳本內容下面給出 notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } virtual_server 172.16.13.1 80 { //定義ipvs規則 delay_loop 6 //健康狀態檢查間隔 lb_algo rr //lvs的調度算法 lb_kind DR //lvs的工做模式有DR/NAT/TUN nat_mask 255.255.255.255 //掩碼netmask 255.255.255.255 # persistence_timeout 10 //這裏是定義會話保持的,單位是秒,由於要測試高可用,因此註釋掉了 protocol TCP //轉發協議的類型有tcp/udp兩種 real_server 172.16.113.13 80 { //定義後端http服務器的 weight 1 //權重 TCP_CHECK { //定義健康狀態檢測方式 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.113.14 80 { weight 1 TCP_CHECK { //定義TCP_CHECK方式 connect_timeout 3 //定義鏈接超時 nb_get_retry 3 //定義重試次數 delay_before_retry 3 //定義重試間隔 } } } # vim /etc/keepalived/notify.sh //郵件通知機制的運行腳本 vip=172.16.13.1 contact='kaadmin@localhost ' //必須有kaadmin這個用戶存在才能夠收到郵件;su - kaadmin 後使用mail查看郵件 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 //添加執行權限 # service keepalived start //啓動keepalived
|
六、測試高可用的LVS
1)瀏覽器輸入172.16.13.1查看負載均衡是否可用
2)將後端http服務器下線,測試健康狀態檢測是否可用
後端
1 2
|
# service httpd stop # ipvsadm -Ln //查看規則顯示113.13節點已經下線
|
3)建立down文件,測試keepalived是否是能夠自動轉變"主備"
1 2
|
# touch /etc/keepalived/down # tail -f /var/log/messages //日誌顯示節點轉變爲backup節點
|
1 2
|
# rm -f /etc/keepalived/down # tail /var/log/messages //日誌顯示當前節點轉變爲master節點
|
4)將主節點keepalived關閉,查看備節點能不能轉變爲主節點
1 2
|
# service keepalived stop # tail -6 /var/log/messages
|
5)最後檢查郵件通知能不能正常接收查看
1 2
|
# su - kaadmin # mail //我已經收到了6封郵件了
|