Lvs+keepalived+Nginx雙機(jī)熱備實現(xiàn)Nginx高可用

一、背景

  • 在一般的系統(tǒng)架構(gòu)中账磺,往往是采用一臺Nginx做負(fù)載均衡购披,這臺Nginx可能負(fù)責(zé)著轉(zhuǎn)發(fā)多臺Tomcat的請求杖挣。這就有一個問題,如果這臺Nginx服務(wù)器掛了刚陡,那就等于整個系統(tǒng)都掛了惩妇。
  • 所以就需要引入一種機(jī)制,將Nginx集群化筐乳,同時保證有多臺Nginx在運(yùn)行歌殃,一臺掛了,另外一臺還能繼續(xù)提供服務(wù)蝙云。要實現(xiàn)Nginx的高可用氓皱,就不得不提LVS+Keepalived。
  • Lvs+Keepalived:Lvs負(fù)責(zé)將外網(wǎng)請求交由集群中的Nginx進(jìn)行處理勃刨;keepalived則監(jiān)控lvs群組波材,根據(jù)監(jiān)控情況,若lvs群組中的master出現(xiàn)宕機(jī)情況身隐,則將宕機(jī)服務(wù)器從ipvsadm移除掉廷区,即將VIP漂移到backup機(jī)上。實現(xiàn)了分布式系統(tǒng)高可用贾铝。

二隙轻、環(huán)境準(zhǔn)備

系統(tǒng):Centos7
MASTER 192.168.1.124:安裝Lvs+Keepalived
BACKUP 192.168.1.126:安裝Lvs+Keepalived
192.168.1.127:安裝Nginx
192.168.1.128:安裝Nginx
虛擬ip(VIP):192.168.1.110,對外提供服務(wù)的ip垢揩,也可稱作浮動ip

image.png

三大脉、安裝Nginx

1、參考安裝教程:

http://www.reibang.com/p/b58b2767a92d
分別為192.168.1.127水孩、192.168.1.128安裝Nginx

2、Nginx配置
  • 假設(shè)我們現(xiàn)在的項目是前后端分離的項目琐驴,Nginx負(fù)責(zé)轉(zhuǎn)發(fā)到前端項目上》郑現(xiàn)在我新建一個簡單的前端html頁面秤标,放在下面的文件位置,然后由Nginx去訪問(兩臺Nginx文件位置一樣宙刘,只是為了驗證訪問的是哪臺Nginx苍姜,html內(nèi)容有些許區(qū)別,)


    image.png
  • 在/etc/nginx/conf.d目錄下悬包,修改default.conf衙猪,加入以下內(nèi)容
location /demo {
      root /root/server/vue/demo/;             #項目路徑
      index /demo.html;                        
    }
  • 配置完后,重啟Nginx即可
systemctl restart nginx      #重啟Nginx
  • 如果安裝配置成功布近,運(yùn)行后應(yīng)該能訪問到新建的demo.html頁面垫释,我的效果如下。


    image.png

四撑瞧、配置Master主機(jī)(此處我的主機(jī)是:192.168.1.124)

1棵譬、前提配置
  • 開放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent  
firewall-cmd --reload 
  • 關(guān)閉SELINUX,修改/etc/sysconfig/selinux预伺,永久生效
SELINUX=enforcing 改為 SELINUX=disabled
  • 修改文件關(guān)閉SELINUX需要重啟機(jī)器才能生效订咸,如果不方便重啟,可以臨時用命令修改酬诀,立即生效脏嚷,但是重啟后就會失效。所以我們可以先修改文件(但是不立即重啟)瞒御,然后再用命令執(zhí)行立即生效父叙,這樣等下次有其他需求重啟的時候,SELINUX關(guān)閉也就永久生效了葵腹。
setenforce 0
  • 防火墻開啟vrrp 協(xié)議支持
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
2高每、安裝Keepalived
  • 執(zhí)行命令安裝
yum -y install keepalived
  • 配置/etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   #notification_email {    #email 通知
     #acassen@firewall.loc   #設(shè)置報警郵件地址,可以設(shè)置多個践宴,每行一個鲸匿。
     #failover@firewall.loc
     #sysadmin@firewall.loc
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc  #設(shè)置郵件的發(fā)送地址
   #smtp_server 192.168.200.1     #設(shè)置smtp server地址
   #smtp_connect_timeout 30    #設(shè)置連接smtp server的超時時間
   router_id LVS_DEVEL       #表示運(yùn)行keepalived服務(wù)器的一個標(biāo)識。發(fā)郵件時顯示在郵件主題的信息
   #vrrp_skip_check_adv_addr
   #vrrp_strict
   #vrrp_garp_interval 0
   #vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER           #指定keepalived的角色阻肩,MASTER表示此主機(jī)是主服務(wù)器带欢,BACKUP表示此主機(jī)是備用服務(wù)器
    interface ens33      #網(wǎng)卡名,用ip a命令可以查看
    virtual_router_id 51      #虛擬路由標(biāo)識,主備兩個節(jié)點的設(shè)置必須一樣烤惊,以指明各個節(jié)點屬于同一VRRP組 
    priority 100          #定義優(yōu)先級乔煞,數(shù)字越大,優(yōu)先級越高柒室,在同一個vrrp_instance下渡贾,MASTER的優(yōu)先級必須大于BACKUP的優(yōu)先級
    advert_int 1            ##設(shè)定MASTER與BACKUP負(fù)載均衡器之間同步檢查的時間間隔,單位是秒
    authentication {     #設(shè)置驗證類型和密碼
        auth_type PASS   #設(shè)置驗證類型雄右,主要有PASS和AH兩種
        auth_pass 1111   #設(shè)置驗證密碼空骚,在同一個vrrp_instance下纺讲,MASTER與BACKUP必須使用相同的密碼才能正常通信
    }
    virtual_ipaddress {   #設(shè)置vip
        192.168.1.110    #可以多個虛擬IP,換行即可
    }
}

virtual_server 192.168.1.110 80 {   #設(shè)置虛擬服務(wù)器囤屹,需要指定虛擬IP地址和服務(wù)端口熬甚,IP與端口之間用空格隔開
    delay_loop 6     ##健康時間檢查,單位秒
    lb_algo rr  #負(fù)載均衡調(diào)度算法wlc|rr肋坚,和您將使用的LVS的調(diào)度算法保持原則一致
    lb_kind DR  #設(shè)置LVS實現(xiàn)負(fù)載均衡的機(jī)制乡括,有NAT、TUN智厌、DR三個模式可選
    persistence_timeout 50   #會話保持時間诲泌,單位是秒。這個選項對動態(tài)網(wǎng)頁是非常有用的峦剔,為集群系統(tǒng)中的session共享提供了一個很好的解決方案档礁。
                                        #有了這個會話保持功能,用戶的請求會被一直分發(fā)到某個服務(wù)節(jié)點吝沫,直到超過這個會話的保持時間呻澜。
                                        #需要注意的是,這個會話保持時間是最大無響應(yīng)超時時間惨险,也就是說羹幸,用戶在操作動態(tài)頁面時,如果50秒內(nèi)沒有執(zhí)行任何操作
                                        #那么接下來的操作會被分發(fā)到另外的節(jié)點辫愉,但是如果用戶一直在操作動態(tài)頁面栅受,則不受50秒的時間限制
    protocol TCP  #指定轉(zhuǎn)發(fā)協(xié)議類型,有TCP和UDP兩種

    real_server 192.168.1.127 80 {  #真實服務(wù)器恭朗,此處為Nginx服務(wù)器
        weight 1  #設(shè)置權(quán)重屏镊,數(shù)字越大權(quán)重越高
        TCP_CHECK {   #設(shè)置檢查方式,可以設(shè)置HTTP_GET | SSL_GET
            connect_timeout 3   #超時時間痰腮,秒而芥。如果在這個時間內(nèi)沒有返回,則說明一次監(jiān)測失敗
            nb_get_retry 3   #設(shè)置多少次監(jiān)測失敗膀值,就認(rèn)為這個真實節(jié)點死掉了
            delay_before_retry 3   #重試間隔
        }
    }

    real_server 192.168.1.128 80 {  #真實服務(wù)器棍丐,此處為Nginx服務(wù)器
        weight 1  #設(shè)置權(quán)重,數(shù)字越大權(quán)重越高
        TCP_CHECK {   #設(shè)置檢查方式沧踏,可以設(shè)置HTTP_GET | SSL_GET | TCP_CHECK
            connect_timeout 3   #超時時間歌逢,秒。如果在這個時間內(nèi)沒有返回翘狱,則說明一次監(jiān)測失敗
            nb_get_retry 3   #設(shè)置多少次監(jiān)測失敗秘案,就認(rèn)為這個真實節(jié)點死掉了
            delay_before_retry 3   #重試間隔
        }
    }
}

3、安裝ipvsadm
  • 執(zhí)行命令安裝。安裝ipvsadm在此處只是為了查看LVS的轉(zhuǎn)發(fā)情況
yum -y install ipvsadm
  • 查看lvs狀態(tài)
ipsvadm

五踏烙、配置Slave主機(jī)(此處我的主機(jī)是:192.168.1.126)

1师骗、安裝Keepalived
  • 安裝同上Master
  • 配置有些許改變
state MASTER 改為:state BACKUP
priority 100   改小為:priority 99   

六、配置兩臺真實主機(jī)(此處為兩臺Nginx)

1讨惩、 兩臺真實Nginx服務(wù)器上為回環(huán)地址lo:0綁定VIP地址、ARP廣播
  • 新建腳本文件realserver.sh寒屯,分別在兩臺真實服務(wù)器(192.168.1.127荐捻、192.168.1.128)上執(zhí)行
#!/bin/bash
#description: Config realserver

VIP=192.168.1.110

/etc/rc.d/init.d/functions

case "$1" in
start)
       /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
       /sbin/route add -host $VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       /sbin/ifconfig lo:0 down
       /sbin/route del $VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

exit 0
  • 執(zhí)行
chmod +x realserver.sh   #賦予權(quán)限
chmod +x /etc/rc.d/init.d/functions
./realserver.sh  start        #執(zhí)行
  • 另外這個腳本的修改重啟后就會失效,所以我們需要將這個腳本設(shè)置為開機(jī)自啟動寡夹。
chmod +x /etc/rc.d/rc.local
  • 修改rc.local
vi /etc/rc.d/rc.local
  • 加入以下文件最后追加以下內(nèi)容即可
/etc/rc.d/init.d/realserver.sh start
  • realserver.sh啟動成功后处面,可以看到192.168.1.127主機(jī)上的回環(huán)地址已經(jīng)綁定上了VIP。


    image.png

七菩掏、啟動keepalived

  • 啟動192.168.1.124魂角、192.168.1.126的keepalived
#啟動Keepalived
systemctl start keepalived
  • 設(shè)置開機(jī)自啟動
#keepalived設(shè)置開機(jī)啟動
systemctl enable keepalived
  • 其他參考命令
#Keepalived 相關(guān)操作命令
#關(guān)閉Keepalived
systemctl stop keepalived

#重啟Keepalived
systemctl restart keepalived

#查看狀態(tài)Keepalived
systemctl status keepalived
  • 在Master主機(jī)上查看vip是否綁定上
ip addr

可以看到Marster:192.168.1.127的ens33網(wǎng)卡上已經(jīng)綁定了Vip


image.png
  • 查看keepalived日志
tail -f  /var/log/messages

八、試驗

1.正常情況
  • 正常情況下智绸,lvs會把請求轉(zhuǎn)發(fā)到兩個nginx服務(wù)上野揪,如下圖


    image.png

    image.png
2.關(guān)閉一臺keepalived,模擬一臺keepalived主機(jī)掛掉瞧栗。
  • 關(guān)閉master
systemctl stop keepalived 
  • 可以看到master192.168.1.124解綁vip斯稳,backup接管了vip


    Master

    BackUp
  • 頁面可以正常訪問


    image.png
image.png
3.關(guān)閉一臺Nginx
  • 我們先把上面剛剛關(guān)閉的一臺keepalived開啟,然后再試驗關(guān)閉Nginx
systemctl start keepalived 
  • 開啟后正常情況應(yīng)該是vip重新回到master迹恐。
  • 接著關(guān)閉192.168.1.127上面的nginx
systemctl stop nginx
  • 可以看到lvs只有一臺機(jī)器可以轉(zhuǎn)發(fā)了
ipvsadm
image.png
  • 訪問頁面挣惰,也只有一臺機(jī)器的頁面了


    image.png
  • 如果此時把192.168.1.127上面的nginx開啟,那么又會自動恢復(fù)集群正常的情況了殴边。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末憎茂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锤岸,更是在濱河造成了極大的恐慌竖幔,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件能耻,死亡現(xiàn)場離奇詭異赏枚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晓猛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門饿幅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人戒职,你說我怎么就攤上這事栗恩。” “怎么了洪燥?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵磕秤,是天一觀的道長乳乌。 經(jīng)常有香客問我,道長市咆,這世上最難降的妖魔是什么汉操? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蒙兰,結(jié)果婚禮上磷瘤,老公的妹妹穿的比我還像新娘。我一直安慰自己搜变,他們只是感情好采缚,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挠他,像睡著了一般扳抽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殖侵,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天贸呢,我揣著相機(jī)與錄音,去河邊找鬼愉耙。 笑死贮尉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朴沿。 我是一名探鬼主播猜谚,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赌渣!你這毒婦竟也來了魏铅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤坚芜,失蹤者是張志新(化名)和其女友劉穎览芳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸿竖,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沧竟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缚忧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悟泵。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闪水,靈堂內(nèi)的尸體忽然破棺而出糕非,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布朽肥,位于F島的核電站禁筏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衡招。R本人自食惡果不足惜篱昔,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望始腾。 院中可真熱鬧旱爆,春花似錦、人聲如沸窘茁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽山林。三九已至,卻和暖如春邢羔,著一層夾襖步出監(jiān)牢的瞬間驼抹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工拜鹤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留框冀,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓敏簿,卻偏偏與公主長得像明也,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惯裕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容