1. 程式人生 > >架構系列三:使用Keepalived+Nginx+tomcat實現叢集部署

架構系列三:使用Keepalived+Nginx+tomcat實現叢集部署

在前面的一篇文章《架構系列二:使用Nginx+tomcat實現叢集部署》,介紹了通過Nginx配置Tomct叢集,當其中一個Tomcat服務停止後,Nginx可自動識別並選擇另一個伺服器響應使用者請求,達到了Tomcat叢集的效果,那如果Nginx伺服器停掉後,就會導致整個應用不可用,因此引入了keepalived,通過keepalived配置Nginx叢集,保證Nginx的高可用性。

一、環境介紹
VM1:Ubuntu-S100 IP:192.168.130.128
VM2:Ubuntu-S101 IP:192.168.130.129
物理機:192.168.1.101 用於作客戶端
JDK:1.8.0_171
Tomcat:apache-tomcat-7.0.62
Keepalived:

二、叢集架構圖
先看下引入keepalived後的叢集架構圖
這裡寫圖片描述
我在兩臺VM上都安裝了Nginx及Keepalived,一臺作Master,另一臺作Backup,同時在VM上還部署了Web應用,要實現的場景是,當Master不工作後,作為Backup的這臺Nginx接替原來Master的工作,繼續提供服務,保證應用的高可用

安裝完成後,進入到nginx安裝目錄/usr/local/nginx/sbin,進行sudo ./nginx -t檢查nginx是否安裝成功,如果出現如下結果,說明nginx已經安裝成功

[email protected]:/usr/local/nginx/sbin$ sudo ./nginx -t
nginx: the
configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

啟動Nginx服務並校驗

#啟動nginx服務
[email protected]:/usr/local/nginx/sbin$ sudo ./nginx 
#檢查nginx啟動程序,發現啟動了兩個程序,一個master,一個worker
[email protected]:/usr/local/nginx/sbin$ ps -ef | grep nginx
root     109164
8174 0 16:27 ? 00:00:00 nginx: master process ./nginx nobody 109165 109164 0 16:27 ? 00:00:00 nginx: worker process ubuntu 109245 101144 0 16:34 pts/4 00:00:00 grep --color=auto nginx

在瀏覽器中輸入IP地址,校檢nginx服務是否成功啟動,如下結果說明Nginx服務已經啟動成功
這裡寫圖片描述

四、配置VM2上的Nginx+Tomcat叢集
進入安裝路徑/usr/local/nginx/conf編輯nginx.conf檔案,內容如下

#user  nobody;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream myserver{
       server 192.168.130.129:8080 weight=5 max_fails=2;
       server 192.168.130.128:8080 weight=1 max_fails=2;
    }
    server {
        listen       80;#監聽80埠
        server_name  myserver;

        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://myserver; #這裡的myserver必須要和upstream中指定的一致
            #proxy_redirect on;
            proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

重新檢查並載入配置檔案

[email protected]-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx -t
[email protected]-virtual-machine:/usr/local/nginx/sbin$ sudo ./nginx -s reload

由於我用的域名訪問,因此還需要修改hosts檔案,在/etc/hosts中增加如下記錄

#192.168.130.129是當前VM2的IP
192.168.130.129 myserver

五、在VM1、VM2上安裝Keepalived
登入http://www.keepalived.org/download.html,下載keepalived安裝包,這裡下載的是keepalived-1.4.5.tar.gz,先在VM1上安裝keepalived
解壓keepalived-1.4.5.tar.gz,得到keepalived-1.4.5目錄

tar -xf keepalived-1.4.5.tar.gz

進入到keepalived-1.4.5目錄下,執行如下命令安裝keepalived

cd keepalived-1.4.5/
# 配置,指定安裝目錄
./configure --prefix=/usr/local/keepalived-1.4.5
# 編譯nginx
sudo make
# 安裝nginx
sudo make install

為了將keepalived做成系統服務,需要拷貝一些檔案到指定的路徑下,如下:

sudo mkdir /etc/sysconfig

sudo cp /usr/local/keepalived-1.4.5/etc/sysconfig/keepalived  /etc/sysconfig/

sudo cp /usr/local/keepalived-1.4.5/sbin/keepalived /usr/sbin/

#注意這裡是copy原始碼包中的檔案,不是在安裝目錄的,這是一個啟動keepalived服務的指令碼,以守護程序方式執行
#Startup script for the Keepalived daemon
sudo cp /home/ubuntu/dev_tools/keepalived-1.4.5/keepalived/etc/init.d/keepalived  /etc/init.d/

sudo mkdir /etc/keepalived

sudo cp /usr/local/keepalived-1.4.5/etc/keepalived/keepalived.conf /etc/keepalived/

注意,經過以上步驟後,keepalived的配置檔案是/etc/keepalived/keepalived.conf,keepalived啟動時,預設會讀這個配置檔案

在/usr/local/keepalived-1.4.5/bin目錄下建立check_nginx.sh指令碼檔案,用於檢測nginx的狀態,指令碼內容如下

#!/bin/sh
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
    /usr/local/nginx/sbin/nginx
fi

sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
    service keepalived stop
fi

解釋下上面指令碼
1.統計nginx的程序,如果數量為0,則認為nginx沒有啟動,就啟動nginx服務
2.等待2秒,再次統計nginx程序,如果數量還是0,則停止keepalived服務

配置VM1為Master
先看下VM1上的網絡卡資訊

[email protected]-virtual-machine:~$ ifconfig
ens33     Link encap:乙太網  硬體地址 00:0c:29:88:a0:46  
          inet 地址:192.168.130.128  廣播:192.168.130.255  掩碼:255.255.255.0
          inet6 地址: fe80::414b:266b:ba4f:57e9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  躍點數:1
          接收資料包:519535 錯誤:0 丟棄:0 過載:0 幀數:0
          傳送資料包:128982 錯誤:0 丟棄:0 過載:0 載波:0
          碰撞:0 傳送佇列長度:1000 
          接收位元組:752557831 (752.5 MB)  傳送位元組:9951982 (9.9 MB)

發現VM的網絡卡裝置是ens33,這個引數在配置keepalived.conf檔案時要用到,下面開始修改配置檔案/etc/keepalived/keepalived.conf,最終配置如下

! Configuration File for keepalived
# global setting , notify email setting
global_defs {
   #存在於同一個網段中,一組keepalived的各個節點都有不同的名字
   #在全域性設定中,我們還可以設定管理員的email資訊等。
   router_id LVS_V1
}

#這個上面介紹的檢查指令碼,我們儲存在這個檔案中(注意檔案許可權)
vrrp_script chknginx {
    script "/usr/local/keepalived-1.4.5/bin/check_nginx.sh"
    #每2秒鐘,檢查一次
    interval 2
}

#keepalived例項設定,是最重要的設定資訊
vrrp_instance VI_1 {
    #state狀態MASTER表示是主要工作節點。
    #一個keepalived組中,最多隻有一個MASTER節點,當然也可以沒有
    state MASTER
    #例項所繫結的網絡卡裝置
    interface ens33
    #同一個keepalived組,節點的設定必須一樣,這樣才會被識別
    virtual_router_id 52
    #節點優先順序,BACKUP的優先順序一定要比MASTER的優先順序低
    priority 100
    #組播資訊傳送間隔,兩個節點設定必須一樣
    advert_int 1
    #實際的ens33上的固定ip地址
    mcast_src_ip=192.168.130.128
    #驗證資訊,只有驗證資訊相同,才能被加入到一個組中。
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虛擬地址和繫結的埠,如果有多個,就繫結多個
    #dev 是指定浮動IP要繫結的網絡卡裝置號
    virtual_ipaddress {
        192.168.130.100 dev ens33
    }

    #設定的檢查指令碼
    #關聯上方的“vrrp_script chknginx”
    track_script {
        chknginx
    }
}

按以上步驟,在VM2上安裝keepalived,安裝完成後配置VM2為backup
配置VM2為BACKUP
先看下VM2上的網絡卡資訊

[email protected]-virtual-machine:/usr/local/keepalived-1.4.5/bin$ ifconfig
ens33     Link encap:乙太網  硬體地址 00:0c:29:40:cf:6a  
          inet 地址:192.168.130.129  廣播:192.168.130.255  掩碼:255.255.255.0
          inet6 地址: fe80::37cf:3643:3082:32e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  躍點數:1
          接收資料包:509261 錯誤:0 丟棄:0 過載:0 幀數:0
          傳送資料包:152992 錯誤:0 丟棄:0 過載:0 載波:0
          碰撞:0 傳送佇列長度:1000 
          接收位元組:747391907 (747.3 MB)  傳送位元組:10269294 (10.2 MB)

發現VM的網絡卡裝置是ens33,這個引數在配置keepalived.conf檔案時要用到,下面開始修改配置檔案/etc/keepalived/keepalived.conf(這裡將keepalived.conf檔案作了下備份keepalived.conf.back),最終配置如下

! Configuration File for keepalived
# global setting , notify email setting
global_defs {
   #存在於同一個網段中,一組keepalived的各個節點都有不同的名字
   #在全域性設定中,我們還可以設定管理員的email資訊等。
   router_id LVS_V1
}

#這個上面介紹的檢查指令碼,我們儲存在這個檔案中(注意檔案許可權)
vrrp_script chknginx {
    script "/usr/local/keepalived-1.4.5/bin/check_nginx.sh"
    #每2秒鐘,檢查一次
    interval 2
}

#keepalived例項設定,是最重要的設定資訊
vrrp_instance VI_1 {
    #這裡和Master不一樣
    state BACKUP
    #例項所繫結的網絡卡裝置
    interface ens33
    #同一個keepalived組,節點的設定必須一樣,這樣才會被識別
    virtual_router_id 52
    #節點優先順序,BACKUP的優先順序一定要比MASTER的優先順序低
    priority 99
    #組播資訊傳送間隔,兩個節點設定必須一樣
    advert_int 1
    #這裡和Master不一樣,是VM2的IP
    mcast_src_ip=192.168.130.129
    #驗證資訊,只有驗證資訊相同,才能被加入到一個組中。
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虛擬地址和繫結的埠,如果有多個,就繫結多個
    #dev 是指定浮動IP要繫結的網絡卡裝置號
    virtual_ipaddress {
        192.168.130.100 dev ens33
    }

    #設定的檢查指令碼
    #關聯上方的“vrrp_script chknginx”
    track_script {
        chknginx
    }
}

啟動VM1,VM2上的keepalived服務

#啟動
service keepalived start
#停止
service keepalived stop

我們配置的繫結在VM1上的浮動IP:192.168.130.100,通過ifconfig是檢視不到的,要通過ip addr 命令才能檢視到
這裡寫圖片描述
到此,keepalived配置nginx叢集就已經配置完成

配置集群后,怎麼快速部署我們的應用呢?如果還一臺一臺機器部署,效率就太低了,能否實現一鍵部署的功能呢,請看:《架構系列四:一鍵部署應用到Tomcat叢集中》