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