一、背景
- 在一般的系統(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
三大脉、安裝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ū)別,)
- 在/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頁面垫释,我的效果如下。
四撑瞧、配置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。
七菩掏、啟動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
- 查看keepalived日志
tail -f /var/log/messages
八、試驗
1.正常情況
-
正常情況下智绸,lvs會把請求轉(zhuǎn)發(fā)到兩個nginx服務(wù)上野揪,如下圖
2.關(guān)閉一臺keepalived,模擬一臺keepalived主機(jī)掛掉瞧栗。
- 關(guān)閉master
systemctl stop keepalived
-
可以看到master192.168.1.124解綁vip斯稳,backup接管了vip
-
頁面可以正常訪問
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
-
訪問頁面挣惰,也只有一臺機(jī)器的頁面了
- 如果此時把192.168.1.127上面的nginx開啟,那么又會自動恢復(fù)集群正常的情況了殴边。