高可用,少不了影子節(jié)點(diǎn)!
本文轉(zhuǎn)載自微信公眾號(hào)「小姐姐味道」,作者小姐姐養(yǎng)的狗。轉(zhuǎn)載本文請(qǐng)聯(lián)系小姐姐味道公眾號(hào)。
現(xiàn)在的服務(wù),都要求7x24小時(shí)不間斷運(yùn)行。就憑這一點(diǎn),就可以看出機(jī)器,比大多數(shù)996社畜能熬。
無論你后端的服務(wù)部署的多么復(fù)雜,最后都會(huì)聚焦到網(wǎng)關(guān)和負(fù)載均衡上。比如nginx、HAProxy,更有甚者用上了LVS。但這些負(fù)載均衡組件,又是如何能保證它的高可用呢?
這不得不提一下Keepalived這個(gè)組件。使用它,你可以為你的服務(wù),做一個(gè)影子節(jié)點(diǎn)。使用虛IP漂移的方式,你的服務(wù)宕機(jī)的時(shí)候,影子節(jié)點(diǎn)就能夠瞬間頂上去,能為原服務(wù)的替身。
但大多數(shù)時(shí)候,它就靜靜的呆在哪里,什么都不做。真的像一個(gè)影子一樣。
1. 小小體驗(yàn)一把!
在開始之前,可以使用yum一鍵安裝。keepalived雖然古老但是一直保持更新,最新的版本是2.2.2,讓人用起來非常放心。
- yum install keepalived -y
首先,看一下自己機(jī)器的網(wǎng)卡。由于我這里用的是虛擬機(jī),然后有多塊的網(wǎng)卡,我們選用的是名字叫做enp0s8的一塊網(wǎng)卡去做接下來的操作。在命令行輸入ip addr就可以找到它。
為了避免額外信息的干擾,我們做了一個(gè)干干凈凈的配置文件,它的位置在/etc/keepalived/keepalived.conf。這個(gè)配置文件的意思是,我們將對(duì)enp0s8這塊網(wǎng)卡,再分配一個(gè)192.168.56.128的地址。使得后端的服務(wù),能夠通過這個(gè)ip地址訪問,也能夠通過原來的ip地址訪問。
- global_defs {
- vrrp_version 3
- }
- vrrp_instance VI_1 {
- interface enp0s8
- priority 101
- virtual_router_id 51
- advert_int 1
- accept
- garp_master_refresh 5
- garp_master_refresh_repeat 1
- virtual_ipaddress {
- 192.168.56.128
- }
- }
為了模擬后端的服務(wù),我們使用python命令簡單的啟動(dòng)了一個(gè)小服務(wù)。
- python -m SimpleHTTPServer
然后,把keepalived啟動(dòng)。
- systemctl start keepalived
此時(shí),通過這個(gè)新加的ip地址,我們能夠訪問后端的服務(wù)了。
同時(shí),我們?cè)俅尾榭捶?wù)器的網(wǎng)卡,發(fā)現(xiàn)被綁定的網(wǎng)卡上,已經(jīng)多了一個(gè)虛擬地址。這很好啊,證明了我們第一步操作非常的棒。
2. 讓vip做一下漂移!
事實(shí)證明,每塊網(wǎng)卡上,是可以綁定多個(gè)ip地址的。只不過我們平常使用的方式就是綁定一個(gè),所以養(yǎng)成了一個(gè)不正確的直觀印象。
我們成功的通過keepalived,讓網(wǎng)卡多了一個(gè)地址。但漂移體現(xiàn)在何方呢?又該如何去做?
為了達(dá)到這個(gè)目的,我們對(duì)剛才的8000端口,做一個(gè)高可用的判定。
- n=`netstat -ltpn | grep 8000 | wc -l`
- if [ $n -eq '0' ]; then
- echo "start up server"
- nohup python -m SimpleHTTPServer &
- fi
把上面的腳本,保存成check.sh,然后放在root目錄下。它將在8000端口不再監(jiān)聽的時(shí)候,重新把它啟動(dòng)。
我們對(duì)keepalived的配置文件,進(jìn)行一點(diǎn)點(diǎn)微小的改造。
- global_defs {
- vrrp_version 3
- }
- vrrp_script check_server {
- script "/root/check.sh"
- interval 2
- weight -20
- }
- vrrp_instance VI_1 {
- state BACKUP
- nopreempt
- interface enp0s8
- priority 101
- virtual_router_id 51
- advert_int 1
- accept
- garp_master_refresh 5
- garp_master_refresh_repeat 1
- track_script {
- check_server
- }
- virtual_ipaddress {
- 192.168.56.128
- }
- }
在配置文件中,我們加入了剛才的檢查腳本,它將每2秒鐘檢查一次,如果進(jìn)程死亡了,那就扶它起來。如果啟動(dòng)失敗了,則將權(quán)重降低20。
接下來,我們?cè)趖rack_script上,正式掛載上這個(gè)腳本。然后,使用非搶占模式nopreempt來啟動(dòng)keepalived。
做好這一切之后,我們?cè)贉?zhǔn)備一臺(tái)虛擬機(jī),然后做相同的配置。除了ip的不同,其他的都是一樣的。這次是一臺(tái)102的機(jī)器。
接下來,就可以試驗(yàn)vip的漂移了??梢宰鋈缦聹y試。
殺掉機(jī)器A的python進(jìn)程,vip:8000依然能夠訪問,python進(jìn)程會(huì)再次被拉起
殺掉機(jī)器A的keepalived進(jìn)程,vip:8000依然能訪問,此時(shí)虛擬ip能夠在B機(jī)器上查看。此所謂漂移。
重復(fù)這個(gè)過程,會(huì)發(fā)現(xiàn),除非機(jī)器A和B的keepalived同時(shí)死掉了,服務(wù)才無法訪問。這就很好的完成了高可用。
3. VRRP
當(dāng)然,弊端也是有的。
keepalived是基于vrrp實(shí)現(xiàn)的。它能夠做到高可用,但無法做到負(fù)載均衡(需要結(jié)合lvs等其他應(yīng)用)。同一時(shí)刻,只會(huì)有同一臺(tái)機(jī)器對(duì)外提供服務(wù),另外一臺(tái)會(huì)空跑,也叫做影子節(jié)點(diǎn),這是一種比較大的浪費(fèi)。
雖然如此,keepalived的應(yīng)用也非常廣泛,因?yàn)樗鼘?shí)在是太簡單了。典型的使用場景如下,但也有土豪公司會(huì)啟用多于1個(gè)的備份節(jié)點(diǎn)。所以keepalived通常會(huì)作為負(fù)載均衡器的高可用方案。
VRRP全稱Vritrual Router Redundancy Protocol(虛擬路由冗余協(xié)議)。從上面的示例可以看出,健康檢查和失敗切換是keepalived的兩大核心功能。它的一大特性,就是虛擬,虛擬就是邏輯概念的意思,這個(gè)路由器并不存在,而是分散在各個(gè)機(jī)器上的軟路由。
路由又分為主路由(master)和備份路由(backup),正常運(yùn)行時(shí),master會(huì)一直發(fā)送vrrp的廣播包,告訴別人自己還活著。在發(fā)生問題的時(shí)候,會(huì)通過選舉機(jī)制進(jìn)行選舉。一般情況下,只有一個(gè)backup則選無可選。
它的定期ICMP數(shù)據(jù)包,是工作在Layer3,也就是IP層的,使用tcpdump可以抓取到它的廣播數(shù)據(jù)。
End
Keepalived應(yīng)用非常廣泛,尤其對(duì)于入口端的高可用建設(shè),可以說是必備的。如果你喜歡這樣的影子如影隨從,或者想要體驗(yàn)替身的感覺,那么Keepalived正好適合你。
作者簡介:小姐姐味道 (xjjdog),一個(gè)不允許程序員走彎路的公眾號(hào)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個(gè)人微信xjjdog0,歡迎添加好友,進(jìn)一步交流。