一、環境:
主機名 |
鏡像 |
私有IP |
虛擬IP |
軟件 |
Nginx-serverA |
CentOS7.6--64位 |
192.168.0.72 |
192.168.0.100 |
Nginx+keepalived |
Nginx-serverB |
CentOS7.6--64位 |
192.168.0.160 |
192.168.0.100 |
Nginx+keepalived |
二、主機熱備架構
三、創建虛擬機安裝nginx,keepalived
1.創建虛擬機
NginxA 和 NginxB
2.安裝 Nginx 和 Keepalive 軟件(兩台機器一致)
# sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# sudo yum install -y nginx
# sudo systemctl start nginx.service
# sudo systemctl enable nginx.service
# sudo yum install keepalived -y
# sudo systemctl start keepalived.service
# sudo systemctl enable keepalived.service
3.編寫 nginx 服務存活檢測腳本(兩台機器一致)
腳本路徑:/usr/bin/check_nginx_alive.sh
# vim /usr/bin/check_nginx_alive.sh
內容:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
then
echo 'nginx server is died'
killall keepalived
fi
修改腳本權限:
#chmod +x /usr/bin/check_nginx_alive.sh
4.配置keepalive(兩台機器參數不同,根據實際修改參數)
先刪除原有配置文件:
#rm –rf /etc/keepalived/keepalived.conf
然后創建並編輯文件:
#vim /etc/keepalived/keepalived.conf
內容:NginxA
################################################
vrrp_script check_nginx_alive {
##腳本路徑
script "/usr/bin/check_nginx_alive.sh"
interval 3
weight -10
}
global_defs {
## 設置lvs的id,在一個網絡內唯一,可以自定義,保持唯一性
router_id LVS_DEVEL
}
##實例名,可修改
vrrp_instance VI_1 {
## 主機配置,從機為BACKUP
state MASTER
## 網卡名稱,虛擬機一般都是使用eth0
interface eth0
##虛擬路由ID,兩機器保持一致即可
virtual_router_id 51
## 權重值,值越大,優先級越高,backup設置比master小,這樣就能在master宕機后講backup變為master,而master回復后就可以恢復.
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
## 同一網段虛擬IP
192.168.0.100
}
##與檢測腳本一起使用
track_script {
check_nginx_alive
}
}
virtual_server 192.168.0.100 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.0.72 80 {
weight 1
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
#####################################
內容:NginxB
#####################################
vrrp_script check_nginx_alive {
##腳本路徑
script "/usr/bin/check_nginx_alive.sh"
interval 3
weight -10
}
global_defs {
## 設置lvs的id,在一個網絡內唯一,可以自定義,保持唯一性,且兩機器保持一致
router_id LVS_DEVEL
}
##實例名,可修改
vrrp_instance VI_1 {
## 主機配置MASTER,從機為BACKUP
state BACKUP
## 網卡名稱,虛擬機一般都是使用eth0
interface eth0
##虛擬路由ID,兩機器保持一致即可
virtual_router_id 51
## 權重值,值越大,優先級越高,backup設置比master小,這樣就能在master宕機后講backup變為master,而master回復后就可以恢復.
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
## 同一網段虛擬IP
192.168.0.100
}
##與檢測腳本一起使用
track_script {
check_nginx_alive
}
}
virtual_server 192.168.0.100 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.0.160 80 {
weight 1
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
###############################################3
注:虛擬機IP:192.168.0.100
NignxA-IP:192.168.0.72
NignxB-IP:192.168.0.160
NignxA為主master NignxA優先級priority 100
NignxB為備backup NignxB優先級priority 90
5.修改Nginx主頁信息,便於觀察虛擬IP的漂移
# vim /usr/share/nginx/html/index.html
內容:NginxA
#########################
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx! @Node A </h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#########################################
內容:NginxB
##############################
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx! @Node B </h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
############################################
6.重啟keepalive服務(兩機器一致)
#systemctl restart keepalived
本別查看兩機器的ip address
#ip address
內容nginxA:
內容nginxB:
可以看到虛擬IP:192.168.0.100/32已經綁定到了NginxA上
7.申請虛擬IP,並綁定虛擬機
四、驗證
在同一子網內創建一台windows虛擬機,並通過游覽器訪問Nginx服務器,來驗證訪問虛擬IP時是訪問的哪個主機。
1.初始情況虛擬IP分配到master主節點---NginxA
訪問私有IP:192.168.0.72
訪問私有IP:192.168.0.160
訪問虛擬IP:192.168.0.100
結論:實驗成功,游覽器訪問虛擬IP:192.168.0.100時,能夠訪問到Master主節點NginxA。
2.關閉NginxA的nginx服務,觀察虛擬IP是否漂移到NginxB
在NginxA操作:
#systemctl stop nginx
查看NginxA的ip address
Eth0下已無虛擬IP(對比 5.重啟keepalived 中之前的圖片)
產看NginxB的ip address
#ip address
Eth0下除了原私有IP,還有虛擬機IP。
訪問虛擬IP地址:
發現跳轉到了NginxB節點,驗證成功。
結論:master節點NginxA主機的nginx服務down掉時,虛擬機ip地址漂移到backup節點NginxB。
3.當Master主節點NginxA的nginx服務恢復時,由於NginxA的優先級高,搶占回主節點,虛擬ip又漂移回NginxA。
啟動NginxA的nginx服務:
#systemctl start nginx
產看NginxA的ip address
發現虛擬IP:192.168.0.100並沒有漂移回來。
原因:需要重啟keepalived服務,因為當nginx服務down掉后,keepalived進程被腳本給殺死了,所以需要手動重啟keepalived服務,才能和備節點通信,搶回虛擬IP。
重啟NginxA的keepalived服務並產看ip address
發現虛擬ip漂移回NginxA節點。
訪問虛擬IP:192.168.0.100
虛擬IP指向了主節點NginxA,驗證成功。
結論:當主節點服務恢復時,由於主節點的優先級高,所以搶占回虛擬IP。
五、大坑小坑
1.必須要在控制台申請虛擬IP並綁定服務器,否則虛擬IP無法訪問!
2.華為官網上有手動給虛擬機綁定虛擬IP的操作指導,但是不適用於Keepalived的場景,適用keepalived來實現熱備,不需要手動綁定,如果手動綁定了,那么keepalived功能不會實現自動漂移虛擬ip,虛擬IP地址只能在一台虛擬機重啟后者關機的情況下,被另外一台搶占。
https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0067802474.html(為虛擬機綁定虛擬IP,不適用於keepalived場景)
3.虛擬IP創建后,即使解綁服務器或者刪除虛擬IP,不影響后台虛擬機keepalived功能(無感知),仍可以使用,目測是個產品bug。當其他虛擬機使用了此虛擬IP地址作為私網地址時,源Nginx服務不可用。
問題1.虛擬IP在console上解綁了服務器,但是服務器后端沒有手動在虛擬機上解綁虛擬IP,則仍然能夠通過虛擬IP訪問!(兩端服務器沒有配置keepalived)
重啟虛擬機,ip address沒有變化,仍然可以訪問,需要手動解綁虛擬IP
# nmcli connection modify "System eth0" ipv4.addresses 192.168.0.10/24
重啟生效
一、環境:
主機名 |
鏡像 |
私有IP |
虛擬IP |
軟件 |
Nginx-serverA |
CentOS7.6--64位 |
192.168.0.72 |
192.168.0.100 |
Nginx+keepalived |
Nginx-serverB |
CentOS7.6--64位 |
192.168.0.160 |
192.168.0.100 |
Nginx+keepalived |
二、主機熱備架構
三、創建虛擬機安裝nginx,keepalived
1.創建虛擬機
2.安裝 Nginx 和 Keepalive 軟件(兩台機器一致)
# sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# sudo yum install -y nginx
# sudo systemctl start nginx.service
# sudo systemctl enable nginx.service
# sudo yum install keepalived -y
# sudo systemctl start keepalived.service
# sudo systemctl enable keepalived.service
3.編寫 nginx 服務存活檢測腳本(兩台機器一致)
腳本路徑:/usr/bin/check_nginx_alive.sh
# vim /usr/bin/check_nginx_alive.sh
內容:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
then
echo 'nginx server is died'
killall keepalived
fi
修改腳本權限:
#chmod +x /usr/bin/check_nginx_alive.sh
4.配置keepalive(兩台機器參數不同,根據實際修改參數)
先刪除原有配置文件:
#rm –rf /etc/keepalived/keepalived.conf
然后創建並編輯文件:
#vim /etc/keepalived/keepalived.conf
內容:NginxA
################################################
vrrp_script check_nginx_alive {
##腳本路徑
script "/usr/bin/check_nginx_alive.sh"
interval 3
weight -10
}
global_defs {
## 設置lvs的id,在一個網絡內唯一,可以自定義,保持唯一性
router_id LVS_DEVEL
}
##實例名,可修改
vrrp_instance VI_1 {
## 主機配置,從機為BACKUP
state MASTER
## 網卡名稱,虛擬機一般都是使用eth0
interface eth0
##虛擬路由ID,兩機器保持一致即可
virtual_router_id 51
## 權重值,值越大,優先級越高,backup設置比master小,這樣就能在master宕機后講backup變為master,而master回復后就可以恢復.
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
## 同一網段虛擬IP
192.168.0.100
}
##與檢測腳本一起使用
track_script {
check_nginx_alive
}
}
virtual_server 192.168.0.100 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.0.72 80 {
weight 1
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
#####################################
內容:NginxB
#####################################
vrrp_script check_nginx_alive {
##腳本路徑
script "/usr/bin/check_nginx_alive.sh"
interval 3
weight -10
}
global_defs {
## 設置lvs的id,在一個網絡內唯一,可以自定義,保持唯一性,且兩機器保持一致
router_id LVS_DEVEL
}
##實例名,可修改
vrrp_instance VI_1 {
## 主機配置MASTER,從機為BACKUP
state BACKUP
## 網卡名稱,虛擬機一般都是使用eth0
interface eth0
##虛擬路由ID,兩機器保持一致即可
virtual_router_id 51
## 權重值,值越大,優先級越高,backup設置比master小,這樣就能在master宕機后講backup變為master,而master回復后就可以恢復.
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
## 同一網段虛擬IP
192.168.0.100
}
##與檢測腳本一起使用
track_script {
check_nginx_alive
}
}
virtual_server 192.168.0.100 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.0.160 80 {
weight 1
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
###############################################3
注:虛擬機IP:192.168.0.100
NignxA-IP:192.168.0.72
NignxB-IP:192.168.0.160
NignxA為主master NignxA優先級priority 100
NignxB為備backup NignxB優先級priority 90
5.修改Nginx主頁信息,便於觀察虛擬IP的漂移
# vim /usr/share/nginx/html/index.html
內容:NginxA
#########################
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx! @Node A </h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#########################################
內容:NginxB
##############################
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx! @Node B </h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
############################################
6.重啟keepalive服務(兩機器一致)
#systemctl restart keepalived
本別查看兩機器的ip address
#ip address
內容nginxA:
內容nginxB:
可以看到虛擬IP:192.168.0.100/32已經綁定到了NginxA上
7.申請虛擬IP,並綁定虛擬機
四、驗證
在同一子網內創建一台windows虛擬機,並通過游覽器訪問Nginx服務器,來驗證訪問虛擬IP時是訪問的哪個主機。
1.初始情況虛擬IP分配到master主節點---NginxA
訪問私有IP:192.168.0.72
訪問私有IP:192.168.0.160
訪問虛擬IP:192.168.0.100
結論:實驗成功,游覽器訪問虛擬IP:192.168.0.100時,能夠訪問到Master主節點NginxA。
2.關閉NginxA的nginx服務,觀察虛擬IP是否漂移到NginxB
在NginxA操作:
#systemctl stop nginx
查看NginxA的ip address
Eth0下已無虛擬機IP(對比 5.重啟keepalived 中之前的圖片)
產看NginxB的ip address
#ip address
Eth0下除了原私有IP,還有虛擬機IP。
訪問虛擬IP地址:
發現跳轉到了NginxB節點,驗證成功。
結論:master節點NginxA主機的nginx服務down掉時,虛擬機ip地址漂移到backup節點NginxB。
3.當Master主節點NginxA的nginx服務恢復時,由於NginxA的優先級高,搶占回主節點,虛擬ip又漂移回NginxA。
啟動NginxA的nginx服務:
#systemctl start nginx
產看NginxA的ip address
發現虛擬IP:192.168.0.100並沒有漂移回來。
原因:需要重啟keepalived服務,因為當nginx服務down掉后,keepalived進程被腳本給殺死了,所以需要手動重啟keepalived服務,才能和備節點通信,搶回虛擬IP。
重啟NginxA的keepalived服務並產看ip address
發現虛擬ip漂移回NginxA節點。
訪問虛擬IP:192.168.0.100
虛擬IP指向了主節點NginxA,驗證成功。
結論:當主節點服務恢復時,由於主節點的優先級高,所以搶占回虛擬IP。
五、大坑小坑
1.必須要在控制台申請虛擬IP並綁定服務器,否則虛擬IP無法訪問!
2.華為官網上有手動給虛擬機綁定虛擬IP的操作指導,但是不適用於Keepalived的場景,適用keepalived來實現熱備,不需要手動綁定,如果手動綁定了,那么keepalived功能不會實現自動漂移虛擬ip,虛擬IP地址只能在一台虛擬機重啟后者關機的情況下,被另外一台搶占。
https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0067802474.html(為虛擬機綁定虛擬IP,不適用於keepalived場景)
3.虛擬IP創建后,即使解綁服務器或者刪除虛擬IP,不影響后台虛擬機keepalived功能(無感知),仍可以使用,目測是個產品bug。當其他虛擬機使用了此虛擬IP地址作為私網地址時,源Nginx服務不可用。
問題1.虛擬IP在console上解綁了服務器,但是服務器后端沒有手動在虛擬機上解綁虛擬IP,則仍然能夠通過虛擬IP訪問!(兩端服務器沒有配置keepalived)
重啟虛擬機,ip address沒有變化,仍然可以訪問,需要手動解綁虛擬IP
# nmcli connection modify "System eth0" ipv4.addresses 192.168.0.10/24
重啟生效