FastDFS蛋疼的集群和負(fù)載均衡(十六)之LVS+Keepalived主備模式

diary_report.jpg

Interesting things

接著上一篇繼續(xù)延伸
準(zhǔn)備環(huán)境
vip 192.168.12.100
lvs_director_master 192.168.12.4
lvs_director_slave 192.168.12.8
nginx1 192.168.12.2
nginx2 192.168.12.3
tomcat1 192.168.12.6
tomcat2 192.168.12.7

What did you do today

什么是高可用?

lvs作為負(fù)載均衡器,所有請(qǐng)求都先到達(dá)lvs,可見lvs處于非常重要的位置,如果lvs服務(wù)器宕機(jī),后端web服務(wù)器將無法提供服務(wù),影響嚴(yán)重。

為了防止負(fù)載均衡服務(wù)器的宕機(jī),需要建立一個(gè)備份機(jī)。主服務(wù)器和備份機(jī)上都運(yùn)行高可用監(jiān)控程序,通過傳送諸如"i am alive"這樣的信息來監(jiān)控對(duì)方的運(yùn)行狀況。當(dāng)備份機(jī)不能再一定的時(shí)間內(nèi)收到這樣的信息,它就接管主服務(wù)器的服務(wù)ip并繼續(xù)提供負(fù)載均衡服務(wù),當(dāng)備用服務(wù)器又從主服務(wù)器收到"i am alive"這樣的信息時(shí),它就釋放服務(wù)ip地址,這樣主服務(wù)器就開始再次提供負(fù)載均衡服務(wù)。

什么是keepalived?

keepalived是集群管理中保證集群高可用的一個(gè)服務(wù)軟件,用于防止單點(diǎn)故障。

keepalived的作用是檢測(cè)web服務(wù)器的狀態(tài),如果有一臺(tái)web服務(wù)器司機(jī)或者工作出現(xiàn)故障,keepalived將檢測(cè)到,并且將有故障的web服務(wù)器從系統(tǒng)中剔除,當(dāng)web服務(wù)器工作正常后keepalived自動(dòng)將web服務(wù)器加入到服務(wù)器群中 ,這些工作全部自動(dòng)完成,不需要人工干涉,需要人工做的只是修復(fù)故障的web服務(wù)器。

keepalived工作原理

keepalived是以VRRP協(xié)議為實(shí)現(xiàn)基礎(chǔ)的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協(xié)議。

虛擬路由冗余協(xié)議,可以認(rèn)為是實(shí)現(xiàn)路由器高可用的協(xié)議,即將N臺(tái)提供相同功能的路由器組成一個(gè)路由器組,這個(gè)組里面有一個(gè)master和多個(gè)backup。master上面有一個(gè)對(duì)外提供服務(wù)的vip(該路由器所在局域網(wǎng)內(nèi)其他機(jī)器的默認(rèn)路由為該vip),master會(huì)發(fā)組播,當(dāng)backup收不到VRRP包時(shí)就認(rèn)為master宕掉了,這時(shí)就需要根據(jù)VRRP的優(yōu)先級(jí)來選舉一個(gè)backup當(dāng)master,這樣的話就可以保證路由器的高可用了。

keepalived主要有3個(gè)模塊,分別是core、check和VRRP。core模塊為keepalived的核心,負(fù)責(zé)主進(jìn)程的啟動(dòng)、維護(hù)以及全局配置文件的加載和解析。check負(fù)責(zé)健康檢查,包括常見的各種檢查方式。VRRP模式是來實(shí)現(xiàn)VRRP協(xié)議的。

LVS+Keepalived實(shí)現(xiàn)主備過程

初始狀態(tài)


image.png

主機(jī)宕機(jī),備用機(jī)提供服務(wù)


image.png

主機(jī)恢復(fù)


image.png

keepalived基礎(chǔ)配置完畢后,查詢系統(tǒng)服務(wù)是否存在

chkconfig --list


image.png

配置日志文件

1.將keepalived日志輸出到local0
vim /etc/sysconfig/keepalived,KEEPALIVED_OPTIONS="-D -d -S 0"


image.png

2.在/etc/rsyslog.conf添加:
local0.* /var/log/keepalived.log


image.png

3.重啟啟動(dòng)keepalived和rsyslog服務(wù):
service rsyslog restart
service keepalived restart
  1. 進(jìn)入/var/log/下面,找到keepalived.log


    image.png

    5.查看keepalived.log。tail -f keepalived.log


    image.png

    6.差一點(diǎn)忘記說了,添加可執(zhí)行權(quán)限:chmod +x /etc/init.d/keepalived

配置keepalived

  • 修改/etc/keepalived/keepalived.conf之前,我們看看里面寫了什么東西。
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
  • 我們參考官方的配置,把主lvs的keepalived.conf進(jìn)行相應(yīng)的修改,具體如下:
! Configuration File for keepalived

global_defs {
   notification_email {
    # 發(fā)生故障時(shí)發(fā)送的郵箱
    #xxxx@163.com                                   
   }
   # 使用哪個(gè)郵箱發(fā)送
   #notification_email_from xxxx@163.com
   # 發(fā)件服務(wù)器
   #smtp_server xxx.com                                  
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script check_lvs {
    script "/etc/keepalived/lvs_check.sh"         ##監(jiān)控腳本
    interval 2                                      ##時(shí)間間隔,2秒
    weight -20                                        ##權(quán)重
}

vrrp_instance VI_1 {
    state MASTER             # 標(biāo)示為主lvs
    interface eth0           # HA檢測(cè)端口
    virtual_router_id 51     # 主備的virtual_router_id 必須相同
    priority 100             # 優(yōu)先級(jí),備lvs要比主lvs稍小
    advert_int 1             # VRRP Multicast 廣播周期秒數(shù)
    authentication {         # 定義認(rèn)證
        auth_type PASS       # 認(rèn)證方式為口令認(rèn)證
        auth_pass 1111       # 定義口令
    }

   track_script {
        check_lvs        #監(jiān)控腳本
   }

    virtual_ipaddress {      # 定義vip
        192.168.12.100        # 多個(gè)vip可換行添加
    }
}

virtual_server 192.168.12.100 80 {
    delay_loop 6       # 每隔6秒查看realserver狀態(tài)
    lb_algo wlc        # 調(diào)度算法為加權(quán)最小連接數(shù)
    lb_kind DR         # lvs工作模式為DR(直接路由)模式
    nat_mask 255.255.255.0
    persistence_timeout 50  # 同一IP 的連接50秒內(nèi)被分配到同一臺(tái)realserver(測(cè)試時(shí)建議改為0)
    protocol TCP            # 用TCP監(jiān)測(cè)realserver的狀態(tài)

    real_server 192.168.12.2 80 {       # 定義realserver
        weight 3                       # 定義權(quán)重
        TCP_CHECK {  # 注意TCP_CHECK和{之間的空格,如果沒有的話只會(huì)添加第一個(gè)realserver
            connect_timeout 3          # 三秒無響應(yīng)超時(shí)
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.12.3 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
  • 修改備用lvs下/etc/keepalived/keepalived.conf文件。配置內(nèi)容基本和主lvs保持一致,需要注意的地方:修改state為BACKUP,priority比MASTER低,virtual_router_id和master保持一致。

  • 在主備lvs中/etc/keepalived/目錄下,創(chuàng)建lvs_check.sh腳本,內(nèi)容如下:

#!/bin/sh    
aa=`ipvsadm -ln`  
str="Route"  
bb=`echo $aa|grep $str|wc -l`  
if [ $bb = 0 ];then  
    service lvsdr start  
    sleep 3  
    aa=`ipvsadm -ln`  
    bb=`echo $aa|grep $str|wc -l`  
    if [ $bb = 0 ];then  
        killall keepalived  
    fi  
fi 
  • 先關(guān)閉主備lvs中的keepalived和lvsdr服務(wù)。

service lvsdr stop
service keepalived stop


image.png

image.png
  • 然后開啟主備lvs中的keepalived服務(wù)。

我們接著通過ipvsadm查看lvs是否處于啟動(dòng)狀態(tài),發(fā)現(xiàn)lvs啟動(dòng)了!


image.png

image.png
  • 開啟192.168.12.2和192.16812.3的nginx服務(wù)和lvsdr服務(wù)。

  • 開啟192.168.12.6和192.168.12.7的tomcat

  • 接著我們通過ip a 命令查看虛擬ip

主lvs設(shè)備的虛擬ip信息


image.png

備lvs設(shè)備的虛擬ip信息


image.png
  • 出現(xiàn)這種情況似乎和我們想象的不太一樣。我們可以先關(guān)閉防火墻。我們先關(guān)閉主lvs的keepalived服務(wù),然后再關(guān)閉備lvs的keepalived服務(wù)。然后重新啟動(dòng)主lvs、備用lvs的keepalived服務(wù)即可。重啟之后,我們發(fā)現(xiàn)備用lvs的eth0節(jié)點(diǎn)沒有虛擬ip192.168.12.100了,如我所愿!


    image.png

    image.png
  • 主備lvs啟動(dòng)成功后,第一次訪問192.168.12.100。


    image.png
  • 第二次訪問192.168.12.100


    image.png
  • 當(dāng)我們停掉主lvs,發(fā)現(xiàn)192.168.12.100還可以訪問。此時(shí)我們?cè)趥鋖vs,通過ip a 查看發(fā)現(xiàn)eth0節(jié)點(diǎn)多了虛擬ip 192.168.12.100


    image.png
image.png
  • 接著開啟主lvs,主導(dǎo)權(quán)又到了主lvs。

Summary

明天進(jìn)行問題總結(jié),然后實(shí)現(xiàn)LVS+Keepalived雙主模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容