Nginx+keepalived+tomcat高可用負載均衡方案

方案背景介紹

根據公司業務需求,需要保證對外提供服務的web服務具有高可用及負載均衡的特性。
此方案省略部署web服務相關步驟。

環境介紹

名稱 IP地址 操作系統
web1 192.168.1.231 CentOS 6.5
web2 192.168.1.239 CentOS 6.5
nginx1(主) 192.168.1.233 CentOS 6.5
nginx2(備) 192.168.1.241 CentOS 6.5

nginx版本:1.10.2
keepalived版本:1.2.20
VIP(虛擬IP):192.168.1.230

實施步驟

前期準備

每臺Nginx服務器安裝相關服務

yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

安裝并配置Nginx

安裝Nginx

兩臺Nginx服務器均安裝Nginx 1.10.2

[root@nginx1 ~]# mkdir /usr/local/nginx
[root@nginx1 ~]# cd /usr/local/src/
[root@nginx1 src]# ls
nginx-1.10.2.tar.gz
[root@nginx1 src]# tar zxvf nginx-1.10.2.tar.gz
[root@nginx1 src]# cd nginx-1.10.2
[root@nginx1 nginx-1.10.2]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
[root@nginx1 nginx-1.10.2]# make
[root@nginx1 nginx-1.10.2]# make install

配置Nginx負載均衡

兩臺Nginx均如下配置,進行負載均衡。
注:根據實際情況,可以不進行負載均衡,而僅進行反向代理。

[root@nginx1 ~]# cd /usr/local/nginx/conf/
[root@nginx1 conf]# vi nginx.conf

http {

    ... ...

    # 將需要負載均衡服務放入域中
    upstream zone_test {
        ip_hash;
        server 192.168.1.231:8888;
        server 192.168.1.239:7777;
    }

    server {
        listen       80;
        server_name  localhost;

        ... ...

        # 此處'http://'后需跟之前創建的域
        location / {
            proxy_pass  http://zone_test;
        }

    ... ...

}

安裝并配置keepalived

安裝keepalived

兩臺Nginx服務器均安裝keepalived 1.2.20

[root@nginx1 ~]# mkdir /usr/local/keepalived
[root@nginx1 ~]# cd /usr/local/src/
[root@nginx1 src]# tar zxvf keepalived-1.2.20.tar.gz
[root@nginx1 src]# cd keepalived-1.2.20
[root@nginx1 keepalived-1.2.20]# ./configure --prefix=/usr/local/keepalived/
[root@nginx1 keepalived-1.2.20]# make && make install

做成服務模式,方便啟動和關閉

將相應文件拷貝至系統目錄,做成服務模式;并將keepalived設置成開機自啟

# 源碼安裝
[root@nginx1 ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@nginx1 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
[root@nginx1 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/
[root@nginx1 ~]# cp -r /usr/local/keepalived/etc/keepalived/ /etc/

# 設置開機自啟
[root@nginx1 ~]# chkconfig --add keepalived
[root@nginx1 ~]# chkconfig keepalived on    
[root@nginx1 ~]# chkconfig --list keepalived
keepalived      0:off   1:off   2:on    3:on    4:on    5:on    6:off

編寫檢查Nginx是否存活腳本

兩臺Nginx服務器上均需編寫

[root@nginx1 ~]# mkdir /root/bin
[root@nginx1 ~]# cd /root/bin/
[root@nginx1 bin]# vi check_nginx.sh

以下是腳本內容

#!/bin/sh
# Filename: check_nginx.sh
# Edited By Yiji Kong
# This script checks nginx process which is alived or not

# 定義別名
alias PS='ps aux | grep nginx | grep -v grep | grep -v check_nginx | wc -l'

# 將nginx的絕對路徑定義為NGINX
NGINX=/usr/local/nginx/sbin/nginx

if [ `PS` -gt 0 ]; then # 如果命令執行結果大于0,說明Nginx正在運行,則返回正常(0)
    exit 0
# 否則重啟一次Nginx后再次檢測,還啟動不了則關閉keepalived
else
    ${NGINX}
    sleep 3
    if [ `PS` -eq 0 ]; then
        killall -9 keepalived
    fi
fi

為腳本添加執行權限

[root@nginx1 bin]# chmod +x check_nginx.sh

修改兩臺Nginx服務器上keepalived的配置文件

配置文件位置:
/etc/keepalived/keepalived.conf

  • 主Nginx服務器的keepalived配置文件如下:
! Configuration File for keepalived

global_defs {
   notification_email {
     #acassen@firewall.loc
     #failover@firewall.loc
     #sysadmin@firewall.loc
   }
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_DEVEL # router_id可以不同
   #vrrp_skip_check_adv_addr
   #vrrp_strict
}

# 定義檢測腳本
vrrp_script check_nginx {
    script "/root/bin/check_nginx.sh" # 腳本位置
    interval 2 # 間隔,單位為秒
    weight -2 # 權重-2
}

vrrp_instance VI_1 {
    state MASTER # 實例的初始狀態
    interface eth0 # 監控VIP綁定的實際網卡
    virtual_router_id 51 # 相同組的VRID需相同
    priority 100 # 初始權重值
    advert_int 1 # 組播信息發送間隔,單位為秒
    authentication {
        auth_type PASS # 啟用密碼驗證
        auth_pass 1111 # 密碼,相同組的需要一致
    }
    # 執行檢測腳本
    track_script {
        check_nginx
    }
    # 設置VIP地址,可以多個
    virtual_ipaddress {
        192.168.1.230
    }
}
  • 備Nginx服務器的keepalived配置文件如下:
! Configuration File for keepalived

global_defs {
   notification_email {
     #acassen@firewall.loc
     #failover@firewall.loc
     #sysadmin@firewall.loc
   }
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_DEVEL # router_id可以不同
   #vrrp_skip_check_adv_addr
   #vrrp_strict
}

# 定義檢測腳本
vrrp_script check_nginx {
    script "/root/bin/check_nginx.sh" # 腳本位置
    interval 2 # 間隔,單位為秒
    weight -2 # 權重-2
}

vrrp_instance VI_1 {
    state BACKUP # 實例的初始狀態
    interface eth0 # 監控VIP綁定的實際網卡
    virtual_router_id 51 # 相同組的VRID需相同
    priority 99 # 初始權重值
    advert_int 1 # 組播信息發送間隔,單位為秒
    authentication {
        auth_type PASS # 啟用密碼驗證
        auth_pass 1111 # 密碼,相同組的需要一致
    }
    # 執行檢測腳本
    track_script {
        check_nginx
    }
    # 設置VIP地址,可以多個
    virtual_ipaddress {
        192.168.1.230
    }
}

至此,Nginx和keepalived的部署已經完成

綁定虛擬IP(VIP)

在啟動keepalived前,需先在兩臺Nginx服務器上綁定VIP,否則無法對外提供服務。

有兩種方法可以綁定,分別為臨時和永久

  • 第一種方法(臨時):
[root@nginx1 ~]# ifconfig eth0:1 192.168.1.230 broadcast 192.168.1.255 netmask 255.255.255.0 up  
[root@nginx1 ~]# route add -host 192.168.1.230 dev eth0:1
  • 第二種方法(永久):
[root@nginx1 ~]# cd /etc/sysconfig/network-scripts/
[root@nginx1 network-scripts]# vi ifcfg-eth0:0

# 以下是"ifcfg-eth0:0"的詳細配置
DEVICE=eth0:0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.230
NETMASK=255.255.255.0
GATEWAY=192.168.1.1

# 重啟網絡服務
[root@nginx1 network-scripts]# service network restart
Shutting down interface eth0:  Device state: 3 (disconnected)
                                                           [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  Active connection state: activated
Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/2
                                                           [  OK  ]

# 查看VIP是否生效
[root@nginx1 network-scripts]# ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:15:5D:01:CA:11  
          inet addr:192.168.1.233  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::215:5dff:fe01:ca11/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4025628 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4960923 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4762501119 (4.4 GiB)  TX bytes:4820676229 (4.4 GiB)

eth0:0    Link encap:Ethernet  HWaddr 00:15:5D:01:CA:11  
          inet addr:192.168.1.230  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3554 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3554 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:285168 (278.4 KiB)  TX bytes:285168 (278.4 KiB)

啟動keepalived

至此,可以啟動keepalived了。
另外,無需事先啟動Nginx,因為檢查Nginx的腳本已經自帶拉起的功能

[root@nginx2 sbin]# service keepalived start
Starting keepalived:                                       [  OK  ]

驗證

  • 模擬其中一臺的Nginx突然關閉,看是否能自動拉起
  • 模擬其中一臺的keepalived突然關閉,看是否能自動切換
  • 模擬其中一臺網卡突然失效,看是否能夠自動切換
  • 模擬其中一臺突然宕機,看是否能自動切換

具體步驟略

參考資料

  1. 使用Nginx+Keepalived組建高可用負載平衡Web server集群
  2. keepalived+nginx雙機熱備+負載均衡
  3. keepalived實踐
  4. keepalived之vrrp_script總結
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容