nginx與keepalived的那些事

1.含義

keepalived是一個類似於layer3, 4 & 5交換機制的軟件,也就是我們平時說的第3層、第4層和第5層交換。Keepalived是自動完成,不需人工干涉。
Keepalived的作用是檢測服務器的狀態,如果有一臺web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常後Keepalived自動將服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。

2.工作原理

Layer3,4,5工作在IP/TCP協議棧的IP層,TCP層,及應用層,原理分別如下:
Layer3:Keepalived使用Layer3的方式工作式時,Keepalived會定期向服務器羣中的服務器發送一個ICMP的數據包(既我們平時用的Ping程序),如果發現某臺服務的IP地址沒有激活,Keepalived便報告這臺服務器失效,並將它從服務器羣中剔除,這種情況的典型例子是某臺服務器被非法關機。Layer3的方式是以服務器的IP地址是否有效作爲服務器工作正常與否的標準。
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的狀態來決定服務器工作正常與否。如web server的服務端口一般是80,如果Keepalived檢測到80端口沒有啓動,則Keepalived將把這臺服務器從服務器羣中剔除。
Layer5:Layer5對指定的URL執行HTTP GET。然後使用MD5算法對HTTP GET結果進行求和。如果這個總數與預期值不符,那麼測試是錯誤的,服務器將從服務器池中移除。該模塊對同一服務實施多URL獲取檢查。如果您使用承載多個應用程序服務器的服務器,則此功能很有用。此功能使您能夠檢查應用程序服務器是否正常工作。MD5摘要是使用genhash實用程序(包含在keepalived軟件包中)生成的。
SSL_GET與HTTP_GET相同,但使用SSL連接到遠程Web服務器。
MISC_CHECK:此檢查允許用戶定義的腳本作爲運行狀況檢查程序運行。結果必須是0或1.該腳本在導演盒上運行,這是測試內部應用程序的理想方式。可以使用完整路徑(即/path_to_script/script.sh)調用可以不帶參數運行的腳本。那些需要參數的需要用雙引號括起來(即“/path_to_script/script.sh arg 1 … arg n”)

3.環境準備

在這裏插入圖片描述

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)

服務器詳情

IP 作用
192.168.180.131 keepalived+nginx(主)
192.168.180.132 keepalived+nginx(從)
192.168.180.133 web站點(tomcat)
192.168.180.134 web站點(tomcat)

4.配置過程

在LB01和LB02上安裝keepalived(yum安裝)

yum install keepalived -y

修改配置文件

vim /etc/keepalived/keepalived.conf

配置如下
LB01:

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LB01
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.110.200/24 dev ens33 label ens33:1
    }
}

LB02

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LB02
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.110.200/24 dev ens33 label ens33:1
    }
}

主要配置註釋

  • router_id 是路由標識,在一個局域網裏面應該是唯一的;
  • vrrp_instance VI_1{…}這是一個VRRP實例,裏面定義了keepalived的主備狀態、接口、優先級、 認證和IP信息;
  • state 定義了VRRP的角色;
  • interface定義使用的接口,這裏我的服務器用的網卡都是eth1,根據實際來填寫
  • virtual_router_id是虛擬路由ID標識,一組的keepalived配置中主備都是設置一致
  • priority是優先級,數字越大,優先級越大
  • auth_type是認證方式
  • auth_pass是認證的密碼
  • virtual_ipaddress{…}定義虛擬IP地址,可以配置多個IP地址,這裏我定義爲192.168.101.200,綁定了ens33的網絡接口,虛擬接口ens33:1
    啓動keepalived
systemctl start keepalived.service

寫入開機自啓動

echo "systemctl start keepalived.service" >> /etc/rc.local

查看進程(3個進程)

ps -ef|grep keepalived

在這裏插入圖片描述
過幾分鐘,可以看到LB01(MASTER)上生成了一個虛擬IP,我們稱之爲VIP

ifconfig ens33:1

在這裏插入圖片描述

VIP即爲虛擬IP
正常情況下只會在主節點上生產VIP,當主節點發生故障時,自動漂移到備節點,當兩個節點同時出現VIP時,此時服務不可用,我們稱之爲"腦裂".

5.高可用切換試驗

停掉LB01主節點服務,查看備節點狀態

systemctl stop keepalived.service

在這裏插入圖片描述
可以看到VIP已經漂移到了備節點,現在我們將主節點起來,此時主節點會再將VIP奪回來
在這裏插入圖片描述
而備節點VIP消失
在這裏插入圖片描述
此時基本可以斷定keepalived配置正確
nginx安裝
LB01與LB02上,獲取nginx源地址

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

執行yum安裝

yum install -y nginx

啓動Nginx

systemctl start nginx

在/root下新建nginx狀態監測腳本

#vim /root/check_ng.sh
nginx_num=` ps -ef|grep nginx|grep -v grep|wc -l`
if [ $nginx_num -eq 0 ]
   then
     systemctl stop  keepalived
fi

在keepalived配置監測腳本路徑(此腳本需要先啓動nginx在啓動keepalived)

vim /etc/keepalived/keepalived.conf 

新加入以下一段

vrrp_script check_nginx {
    script "/root/check_ng.sh"
    interval 2
    weight -20
}
#當檢查心跳的時候,發現當前的nginx或keepalived停止了,權重值就減少20,這樣的話就會比另一臺服務器的權重小

在這裏插入圖片描述
重啓keepalived

systemctl restart keepalived.service

在這裏插入圖片描述
此時正常
測試nginx頁面,瀏覽器訪問http://192.168.110.131/http://192.168.110.132,可以看到歡迎界面
在這裏插入圖片描述

6.配置WEB站點

在WEB01與WEB02上安裝jdk與tomcat
安裝jdk1.7

#yum安裝
yum install java-1.7.0-openjdk -y
#配置環境變量
vim /etc/profile
#在末位加上以下參數
JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64 #該位置對應你的實際路徑
JRE_HOME=$JAVA_HOME
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
 #:wq保存後
 source /etc/profile

驗證是否成功

[root@192 ~]# java -version
java version "1.7.0_261"
OpenJDK Runtime Environment (rhel-2.6.22.2.el7_8-x86_64 u261-b02)
OpenJDK 64-Bit Server VM (build 24.261-b02, mixed mode)
[root@192 ~]# vim /etc/profile

tomcat站點安裝就不一一描述了,我這裏使用的apache-tomcat-7.0.103,官網下載後直接傳上去即可
修改默認歡迎頁面
apache-tomcat-7.0.103/webapps/ROOT下的index.jsp換成我們的測試文件,我的效果是這樣的
在這裏插入圖片描述
在這裏插入圖片描述
接下來配置NGINX反向代理,轉發到後端的兩臺tomcat上
LB01與LB02

vim /etc/nginx/conf.d/tomcat.conf

upstream tomcat {
  server 192.168.110.133:8080;
  server 192.168.110.134:8080;
}

server{
  listen 80;
  server_name localhost;
  location / {
        proxy_pass http://tomcat;
 }
}

配置完後校驗一下語法

[root@192 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重新加載nginx

nginx -s reload

完成

7測試集羣情況

瀏覽器訪問http://192.168.110.200/
在這裏插入圖片描述
瀏覽器無法加載,且ping不通VIP,出現此問題的原因是keepalived.conf配置中默認vrrp_strict打開了,需要把它註釋掉。

vim /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LB01
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
#重啓keepalived
systemctl restart keepalived.service

此時在ping
在這裏插入圖片描述
再次訪問
在這裏插入圖片描述
在這裏插入圖片描述
停掉主節點的keepalived試驗,此時VIP在備機上
在這裏插入圖片描述
再次訪問
在這裏插入圖片描述
*

碼字不易,希望多多點贊,謝謝!`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章