架構系列三:使用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叢集中》