包括阿裡雲在内的很多雲環境,因為不支援浮動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内容以及解釋如下:
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
! 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
到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來實作雙主。或者兩台伺服器同時為兩個業務服務,避免資源浪費。同時能夠做到主備