在Azure上實現Linux Server故障轉移


要充分利用公有雲的彈性擴展和高可用, 首先要在應用系統層面支持橫向擴展(scale out),這個說起來很容易,或者說對新開發的應用系統而言已經成為標配。但是對已有的、老舊的應用系統來說,這就比較困難了,不是每個應用系統都能實現/支持橫向擴展的。從客戶的角度來說,基本上很難接受為了把應用系統遷移到公有雲上而去額外投入修改應用系統代碼。雖然我們都心知肚明,本質上這是在“償還技術債”,修改應用系統代碼也是為了更好地利用公有雲的優勢...

對於應用系統的橫向擴展而言,“狀態”是最大的攔路虎,要支持橫向擴展,首先要實現stateless。最常見的“狀態”就是web應用中的session。此外還有一些tcp通訊,socket通訊之類的應用也是需要“有狀態”的。還有一些商業軟件這樣那樣的限制,總是就是不允許、也不能通過同時運行多個應用程序實例來實現橫向擴展和高可用。

上述現狀直接導致的后果就是:客戶將應用系統遷移到公有雲上之后,卻完全體驗不到公有雲應有的優勢,和本地部署沒有任何區別,甚至還不如本地部署方便、划算。

在傳統的IT環境(on-premises)中,Linux Server有很多成熟的高可用方案,例如:LVS,Heartbeat,Keepalived...但這些方案都需要一個虛擬的IP地址來對外提供服務。在公有雲上,無論是公網IP地址還是內網IP地址,都是被統一管理和分配的,憑空冒出來的一個IP地址是不會被識別和使用的。所以用戶千萬不要在虛擬機里面隨便修改網卡的IP地址,以免造成虛擬機無法連接。

Azure的Loadbalancer有一個“Direct Server Return”選項,新版的Portal中改名為:“EnableFloatingIP”。

一直以來,官方文檔中只是說這個選項只有在做SQL Server Always-on集群的時候才會用到。其實DSR並非是Azure Loadbalancer專屬的一個屬性,這個概念在硬件負載均衡設備中很常見。我們來看一段關於DSR的介紹:

Direct Routing aka. Direct Server Return (DSR) is a great load balancing method, the idea being that incoming traffic comes into the Virtual IP (VIP) on the load balancer.
Then all the load balancer does is change the destination MAC address of the packet (to one of the destination real servers in the pool) and flips it back to the switch which duefully delivers the packets to the selected real server.

這個DSR就可以支持我們需要的虛擬IP地址!無論是自動還是手工分配給啟用了DSR的Loadbalancer的IP地址,都相當於設置了一個虛擬IP地址,這個IP地址可以根據需要附加到位於Loadbalancer之后的虛擬機上。通過這個虛擬IP地址過來的請求會直接到達在Loadbalancer后面的、綁定了虛擬IP地址的虛擬機。

基本原理就是這樣了,原來我們一直都忽略了Azure的這一“獨門秘笈”,目前我暫時還沒有發現其他的公有雲提供DSR支持!

下面我們使用CentOS 6.7鏡像創建兩個虛擬機,在Azure中國版上配置一個Linux Server故障轉移集群。

前置准備工作:

1、把兩個虛擬機放在同一個雲服務中,而且必須使用standard類型的虛擬機。

2、為虛擬機分配固定的內網IP地址(DIP)和公網IP地址(Reserved VIP)。

3、創建一個新的負載均衡端點並啟用DSR。

安裝keepalived:

不要直接使用yum里面的Keepalived,那個版本太低,不能支持單播。還有就是一定要徹底關閉SELINUX(這個家伙到哪都不討人喜歡)。

wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz
sudo yum install make gcc openssl-devel
tar xvf keepalived-1.2.20.tar.gz 
cd keepalived-1.2.20
./configure --prefix=/usr/local/keepalived
sudo make install
sudo cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
sudo cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
sudo cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

配置Keepalived:

#創建配置文件目錄
mkdir /etc/keepalived
#創建配置文件
sudo vim keepalived.conf
#創建動作腳本
sudo vim keepalived-action.sh
#創建服務檢查腳本
sudo vim keepalived-check-appsvc.sh

#給上述三個文件添加讀取權限(chmod +r)
配置文件內容:

keepalived-check-appsvc.sh
--------------------------------
#!/bin/bash
exit 0

#這個腳本用於檢查本機的服務或者進程的運行狀態。為了簡化演示過程,我們臨時讓這個文件返回狀態碼“0”,即代表本地服務或者進程的運行狀態是正常的。
#在生產環境中,必須根據實際的業務需求對服務或進程的健康狀態進行檢查。
#返回非“0”表示檢查失敗,會觸發故障轉移。
#如果主機(MASTER)重啟或者操作系統崩潰,也會觸發故障轉移,即:BACKUP提升為MASTER。
#因此,這里我們直接返回“0”,若主機(MASTER)重啟或者操作系統崩潰,依然可以觸發故障轉移動作。

keepalived-action.sh
--------------------------------
#!/bin/bash

TYPE=$1
NAME=$2
STATE=$3

case $STATE in
  "MASTER")
  service httpd start
  exit 0
  ;;
"BACKUP"|"STOP")
  exit 0
  ;;
"FAULT")
  exit 0
  ;;
*)
  exit 1
  ;;
esac

#當某個服務器成為MASTER的時候,啟動httpd服務。(本例中我們用Apache服務進行演示)

keepalived.conf -- 主機(MASTER)
-------------------------------
vrrp_script chk_appsvc {
    script /etc/keepalived/keepalived-check-appsvc.sh
    interval 1
    fall 2
    rise 2
}

vrrp_instance VI_1 {

    interface eth0
 
    authentication {
        auth_type PASS
        auth_pass secr3t
    }

    virtual_router_id 51

    virtual_ipaddress {
        42.159.241.126 #Azure Loadbalancer的公網IP地址(VIP)
    }

    track_script {
        chk_appsvc
    }

    state MASTER
    priority 101

    unicast_src_ip 10.11.12.4 #本機地址,Azure虛擬機的內網IP地址(DIP)
    unicast_peer {
        10.11.12.5 #對端地址,Azure虛擬機的內網IP地址(DIP)
    }

    notify /etc/keepalived/keepalived-action.sh
}

keepalived.conf -- 備機(BACKUP)
------------------------------- vrrp_script chk_appsvc { script /etc/keepalived/keepalived-check-appsvc.sh interval 1 fall 2 rise 2 } vrrp_instance VI_1 { interface eth0 authentication { auth_type PASS auth_pass secr3t } virtual_router_id 51 virtual_ipaddress { 42.159.241.126 #Azure Loadbalancer的公網IP地址(VIP) } track_script { chk_appsvc } state BACKUP priority 100 unicast_src_ip 10.11.12.5 #本機地址,Azure虛擬機的內網IP地址(DIP) unicast_peer { 10.11.12.4 #對端地址,Azure虛擬機的內網IP地址(DIP) } notify /etc/keepalived/keepalived-action.sh }

除了keepalived.conf文件之外,其他的操作和配置文件在兩個服務器上(MASTER和BACKUP)都是一樣的。

最后一項設置是修改Linux操作系統的一個網絡配置參數

vim /etc/sysctl.conf 
#在末尾追加一行:net.ipv4.ip_nonlocal_bind=1

#保存后使更改生效
sudo sysctl -p

因為本例中使用Apache來作為故障轉移演示,因此我們需要同時在兩個服務器上安裝Apache服務,並修改Apache的Listen端口與Azure Loadbalancer端口保持一致。

sudo yum install httpd
sudo vim /etc/httpd/conf/httpd.conf 

Apache安裝配置完成后,先不要啟動httpd服務,因為即便啟動httpd服務,也沒法通過Azure Loadbalancer訪問到,原因就是Azure Loadbalancer已經啟用了DSR,而在Azure Loadbalancer之后的虛擬機上卻沒有綁定相應的虛擬機IP地址。

至此,所有的配置都已經完成了。我們來測試一下效果:

在MASTER上啟動Keepalived服務,隨后使用:"ps -el | grep httpd"命令可以看到Apache服務已經啟動了。這時通過Azure Loadbalancer的公網IP地址就能訪問到MASTER上的web界面了。虛擬IP地址已經成功的綁定到MASTER上,並且已經生效。

sudo service keepalived start

在MASTER上執行重啟命令:“sudo reboot”,模擬MASTER故障。然后到BACKUP上執行"ps -el | grep httpd",可以看到BACKUP上的Apache已經被啟動了。這時依然可以通過Azure Loadbalancer的公網IP地址訪問到web頁面,但此時訪問到的web頁面已經是由BACKUP在提供服務了。因為MASTER重啟后,位於MASTER上的Apache並沒有被隨之啟動。

在Azure上使用Keepalived創建Linux Server故障轉移集群已經成功!

不過這僅僅是一個開始,在正式的生產環境中,還有很多需要調整和優化的配置。特別是服務狀態檢測腳本(track script)和故障轉移動作腳本(notify script),有很大的發揮和想象空間,例如:我們可以在腳本中通過調用Azure CLI來動態創建或者銷毀Azure資源...

BTW:Windows Server Failover Cluster其實也是通過虛擬IP對外提供服務的,因此在Azure上也同樣可以部署WSFC,這樣在Azure上部署類似SAP ECC的應用就可以實現高可用了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM