注:這篇文章參考網絡,有些稱呼都變了,比如阿里雲上的現在是彈性ip
包括阿里雲在內的很多雲環境,因為不支持浮動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來實現雙主。或者兩台服務器同時為兩個業務服務,避免資源浪費。同時能夠做到主備
