注:這篇文章參考網絡,有些稱呼都變了,好比阿里雲上的如今是彈性ipnginx
包括阿里雲在內的不少雲環境,由於不支持浮動IP廣受詬病。目前阿里雲在VPC網絡下發布了HAVIP,可以實現arp宣告IP。這樣也就讓本身搭建HA成爲了可能,有幸拿到了內測權限體驗了一下。(classical網絡依然不支持) 測試環境: 1 2 3 4 5 6 VPC:192.168.1.0/24 ECS: nginx1:192.168.1.1 nginx2:192.168.1.2 HAVIP:192.168.1.3 綁定到havip的公網EIP:121.43.187.37 配置完畢後的拓撲以下: 環境搭建完畢後,登錄主備ECS服務器,分別配置nginx+keepalived [root@Nginx1 ~]# yum install nginx keepalived –y MASTER服務器(nginx1)配置文件/etc/keepalived/keepalived.conf內容以及解釋以下: ! Configuration File for keepalived #配置global_defs,主要用於標示機器,以及故障時通知 global_defs { router_id Nginx1 } #配置vrrp_script,主要用於健康檢查,以及檢查失敗後執行的動做。 vrrp_script chk_nginx { #健康檢查腳本,當腳本返回值不爲0時認爲失敗 script "/etc/keepalived/ck_ng.sh" #檢查頻率,如下配置每2秒檢查1次 interval 2 #當檢查失敗後,將vrrp_instance的priority減少5 weight -5 #連續監測失敗3次,才認爲真的健康檢查失敗。並調整優先級 fall 3 #連續監測2次成功,就認爲成功。但不調整優先級 rise 2 } #定義對外提供服務的VIP vrrp_instance配置 vrrp_instance VI_1 { #指定vrrp_instance的初始狀態,是MASTER仍是BackUP主要仍是看優先級。 state MASTER #指定vrrp_instance綁定的網卡,最終會經過指定的網卡宣告VIP interface eth0 #發送心跳包的源IP,可以使用綁定的網卡IP,也能夠使用本服務器上的其餘IP unicast_src_ip 192.168.1.1 #至關於VRID,用於在一個網內區分組播,須要組播域內內惟一。 virtual_router_id 55 #本機的優先級,VRID相同的機器中,優先級最高的會被選舉爲MASTER priority 101 #心跳間隔,下面配置,MASTER會每隔1秒發送一個報文高職組內其餘機器,本身還活着。 advert_int 1 #定義主從的驗證方式以及密碼,通常使用PASS(最長8位,超過了只會識別前8位做爲密碼) authentication { auth_type PASS auth_pass aliyun } #VIP,在阿里雲下就是剛纔建立的HAVIP virtual_ipaddress { 192.168.1.3 } #本vrrp_instance所引用的腳本配置,名稱就是vrrp_script 定義的容器名 track_script { chk_nginx } } BACKUP服務器(nginx2)的配置須要修改: state MASTER改成 state BACKUP unicast_src_ip 192.168.1.1改成backup服務器實際的IP unicast_src_ip 192.168.1.2 priority 101改小一些,好比 priority 100 其它保持一致便可 爲了實現nginx服務異常的時候可以自動切換,須要本身寫一個腳本,腳本沒有硬性的要求,可以實現目標便可,這裏 監控nginx進程數爲例: vim /etc/keepalived/ck_ng.sh #!/bin/bash #檢查nginx進程是否存在 count=$(ps -C nginx --no-heading|wc -l) #進程數等於0的時候 if [ "${count}" = "0" ]; then #嘗試啓動一次nginx,中止2秒後再次檢測 service nginx start sleep 2 count=$(ps -C nginx --no-heading|wc -l) if [ "${count}" = "0" ]; then #若是啓動沒成功,就殺掉keepalive觸發主備切換 /etc/init.d/keepalived stop fi fi #增長腳本的執行權限 chmod +x vim /etc/keepalived/ck_ng.sh #分別啓動nginx1和nginx2的nginx&keepalived服務: [root@Nginx1 ~]# /etc/init.d/nginx start;/etc/init.d/keepalived start Starting nginx: [ OK ] Starting keepalived: [ OK ] 測試: NGINX1/192.168.1.1的priority 爲101,NGINX2/192.168.1.2的priority爲100,這時候訪問HAVIP綁定的EIP:http://121.43.187.37/能夠看到訪問到了服務器NGINX1, 到HAVIP控制檯查看,192.168.1.1的服務器爲主服務器 這時候咱們KILL掉nginx1服務器的nginx服務 查看日誌,發送了移除VIP的報文: Oct 23 17:20:01 iZ239aqzdi7Z Keepalived_vrrp[25019]: VRRP_Instance(VI_1) sending 0 priority Oct 23 17:20:01 iZ239aqzdi7Z Keepalived_vrrp[25019]: VRRP_Instance(VI_1) removing protocol VIPs. Oct 23 17:20:01 iZ239aqzdi7Z Keepalived_healthcheckers[25018]: Netlink reflector reports IP 192.168.1.3 removed 這時候訪問http://121.43.187.37/,能夠看到訪問自動切換到了NGINX2 到HAVIP控制檯查看,192.168.1.2的服務器爲主服務器 從新啓動nginx1的nginx和keepalive服務 查看日誌能夠看到keepalive從新發送了IP宣告的報文 Oct 23 17:22:14 iZ239aqzdi7Z Keepalived_vrrp[25610]: VRRP_Instance(VI_1) Entering MASTER STATE Oct 23 17:22:14 iZ239aqzdi7Z Keepalived_vrrp[25610]: VRRP_Instance(VI_1) setting protocol VIPs. Oct 23 17:22:14 iZ239aqzdi7Z Keepalived_vrrp[25610]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.3 Oct 23 17:22:14 iZ239aqzdi7Z Keepalived_healthcheckers[25609]: Netlink reflector reports IP 192.168.1.3 added Oct 23 17:22:19 iZ239aqzdi7Z Keepalived_vrrp[25610]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.3 從新訪問http://121.43.187.37/測試,從新訪問到了服務器NGINX1,到HAVIP控制檯查看,192.168.1.1的服務器從新奪回了控制權,成爲了爲主服務器 這樣就實現了阿里雲環境下的HA切換。 實際測試,阿里雲的多個HAVIP能夠綁定到一樣的兩臺機器,能夠配置多組vrrp_instance來實現雙主。或者兩臺服務器同時爲兩個業務服務,避免資源浪費。同時可以作到主備