1习寸、使用Keepalived程序讓nginx高可用
下載:https://www.keepalived.org/download.html
上傳到服務(wù)器
解壓:tar -zxvf keepalived-2.0.18.tar.gz
然后就安裝三部曲页响,./configure碗脊、make屡久、make install
打開配置文件
vim keepalived.conf
global_defs {
# 路由id:當(dāng)前安裝keepalived的節(jié)點(diǎn)主機(jī)標(biāo)識符滨攻,保證全局唯一
router_id keep_171
}
vrrp_instance VI_1 {
# 表示狀態(tài)是MASTER主機(jī)還是備用機(jī)BACKUP
state MASTER
# 該實(shí)例綁定的網(wǎng)卡 #查看網(wǎng)卡名稱 ip addr
interface ens33
# 保證主備節(jié)點(diǎn)一致即可
virtual_router_id 51
# 權(quán)重钧舌,master權(quán)重一般高于backup禁熏,如果有多個垦巴,那就是選舉媳搪,誰的權(quán)重高,誰就當(dāng)選
priority 100
# 主備之間同步檢查時間間隔骤宣,單位秒
advert_int 2
# 認(rèn)證權(quán)限密碼秦爆,防止非法節(jié)點(diǎn)進(jìn)入
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬出來的ip,可以有多個(vip)
virtual_ipaddress {
192.168.1.161
}
}
啟動
./keepalived
注冊為系統(tǒng)服務(wù)
在keepalived下有個etc目錄的憔披,進(jìn)入去
cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
systemctl start keepalived.service
2等限、keepalived也可能崩的,也需要主備
配置備
global_defs {
router_id keep_172
}
vrrp_instance VI_1 {
# 備用機(jī)設(shè)置為BACKUP
state BACKUP
interface ens33
virtual_router_id 51
# 權(quán)重低于MASTER
priority 80
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# 注意:主備兩臺的vip都是一樣的活逆,綁定到同一個vip
192.168.1.161
}
}
增加Nginx重啟檢測腳本
vim /etc/keepalived/check_nginx_alive_or_not.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
# 判斷nginx是否宕機(jī)精刷,如果宕機(jī)了,嘗試重啟
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
# 等待一小會再次檢查nginx蔗候,如果沒有啟動成功怒允,則停止keepalived,使其啟動備用機(jī)
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
增加運(yùn)行權(quán)限
chmod +x /etc/keepalived/check_nginx_alive_or_not.sh
配置keepalived監(jiān)聽nginx腳本
vrrp_script check_nginx_alive {
script "/etc/keepalived/check_nginx_alive_or_not.sh"
interval 2 # 每隔兩秒運(yùn)行上一行腳本
weight 10 # 如果腳本運(yùn)行失敗锈遥,則升級權(quán)重+10
}
在 vrrp_instance 中新增監(jiān)控的腳本
track_script {
check_nginx_alive # 追蹤 nginx 腳本
}
重啟Keepalived使得配置文件生效
systemctl restart keepalived
3纫事、雙主熱備
規(guī)則:以一個虛擬ip分組歸為同一個路由
主節(jié)點(diǎn)配置:
global_defs {
router_id keep_171
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
備節(jié)點(diǎn)配置
global_defs {
router_id keep_172
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.161
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.162
}
}
4、LVS
一般不會直接使用keepalived直接作用在nginx上所灸,而是keepalived+LVS+Nginx實(shí)現(xiàn)高可用丽惶。
LVS 基于四層,工作效率高
單個Nginx承受不了壓力爬立,需要集群
LVS 充當(dāng)Nginx集群的調(diào)度者
Nqinx 接受請求來回钾唬,LVS可以只接受不響應(yīng)
5、前期準(zhǔn)備:
服務(wù)器與ip規(guī)劃:
LVS - 1臺
VIP(虛擬IP):192.168.1.150
DIP(轉(zhuǎn)發(fā)者IP/內(nèi)網(wǎng)IP):192.168.1.151
Nginx - 2臺(RealServer)
RIP(真實(shí)IP/內(nèi)網(wǎng)IP):192.168.1.171
RIP(真實(shí)IP/內(nèi)網(wǎng)IP):192.168.1.172
所有計(jì)算機(jī)節(jié)點(diǎn)關(guān)閉網(wǎng)絡(luò)配置管理器侠驯,因?yàn)橛锌赡軙途W(wǎng)絡(luò)接口沖突:
systemctl stop NetworkManager
systemctl disable NetworkManager
創(chuàng)建子接口
cd /etc/sysconfig/network-scripts/
#數(shù)字可以是其他抡秆,只是隨便起個別名
cp ifcfg-ens33 ifcfg-ens33:1
修改子接口配置: vim ifcfg-ens33:1,保留這些即可
BOOTPROTO="static"
DEVICE="ens33:1"
ONBOOT="yes"
IPADDR=192.168.1.150 #虛擬IP
NETMASK=255.255.255.0
service network restart
安裝集群管理工具
yum install ipvsadm
6吟策、搭建LVS-DR模式- 為兩臺RS配置虛擬IP
#這個文件上網(wǎng)查一查
cp ifcfg-lo ifcfg-lo:1
修改為
DEVICE=lo:1
IPADDR=192.168.1.150
NETMASK=255.255.255.255
NETWORK=127.0.0.1
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
service network restart
另一臺
cp ifcfg-lo ifcfg-lo:1
修改為
DEVICE=lo:1
IPADDR=192.168.1.150
NETMASK=255.255.255.255
NETWORK=127.0.0.1
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
這樣兩臺虛擬ip都構(gòu)建好了
7儒士、搭建LVS-DR模式- 為兩臺RS配置arp
ARP響應(yīng)級別與通告行為的概念
- arp-ignore:ARP響應(yīng)級別(處理請求)
只要本機(jī)配置了ip,就能響應(yīng)請求
請求的目標(biāo)地址到達(dá)對應(yīng)的網(wǎng)絡(luò)接口檩坚,才會響應(yīng)請求 - arp-announce:ARP通告行為(返回響應(yīng))
本機(jī)上任何網(wǎng)絡(luò)接口都向外通告着撩,所有的網(wǎng)卡都能接受到通告
盡可能避免本網(wǎng)卡與不匹配的目標(biāo)進(jìn)行通告
只在本網(wǎng)卡通告
打開sysctl.conf:
vim /etc/sysctl.conf
配置 所有網(wǎng)卡 诅福、 默認(rèn)網(wǎng)卡 以及 虛擬網(wǎng)卡 的arp響應(yīng)級別和通告行為,分別對應(yīng): all 拖叙, default 氓润, lo :
兩臺都是相同配置
# configration for lvs
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
刷新配置文件:
sysctl -p
增加一個網(wǎng)關(guān),用于接收數(shù)據(jù)報(bào)文薯鳍,當(dāng)有請求到本機(jī)后旺芽,會交給lo去處理:
兩臺都是相同配置
route add -host 192.168.1.150 dev lo:1
route -n
開機(jī)自啟
echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local
8、搭建LVS-DR模式- 使用ipvsadm配置集群規(guī)則
創(chuàng)建LVS節(jié)點(diǎn)辐啄,用戶訪問的集群調(diào)度者
ipvsadm -A -t 192.168.1.150:80 -s rr -p 5
-A:添加集群
-t:tcp協(xié)議
ip地址:設(shè)定集群的訪問ip,也就是LVS的虛擬ip
-s:設(shè)置負(fù)載均衡的算法运嗜,rr表示輪詢
-p:設(shè)置連接持久化的時間
創(chuàng)建2臺RS真實(shí)服務(wù)器
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.172:80 -g
-a:添加真實(shí)服務(wù)器
-t:tcp協(xié)議
-r:真實(shí)服務(wù)器的ip地址
-g:設(shè)定DR模式
保存到規(guī)則庫壶辜,否則重啟失效
ipvsadm -S
檢查集群
查看集群列表
ipvsadm -Ln
查看集群狀態(tài)
ipvsadm -Ln --stats
其他命令:
# 重啟ipvsadm,重啟后需要重新配置
service ipvsadm restart
# 查看持久化連接
ipvsadm -Ln --persistent-conn
# 查看連接請求過期時間以及請求源ip和目標(biāo)ip
ipvsadm -Lnc
# 設(shè)置tcp tcpfin udp 的過期時間(一般保持默認(rèn))
ipvsadm --set 1 1 1
# 查看過期時間
ipvsadm -Ln --timeout
#更詳細(xì)的幫助文檔
ipvsadm -h
man ipvsadm
至此担租,已經(jīng)實(shí)現(xiàn)單個LVS+兩個Nginx砸民,但這樣LVS還是有可能崩的,所以LVS要配置主備
9奋救、Keepalived+LVS岭参,主配置
修改Keepalived的配置文件
global_defs {
router_id LVS_151
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 41
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.150
}
}
#配置集群地址訪問的IP+端口,端口和nginx保持一致尝艘,都是80
virtual server 192.168.1.150 80 {
# 健康檢查的時問演侯,單位:秒
delay_loop 6
#配置負(fù)載均衡的算法,默認(rèn)是輪詢
lb_algo rr
# 設(shè)置LVS的模式 NAT | TUN | DR
lb_kind DR
# 設(shè)置會話持久化的事件
persistence_timeout 5
#協(xié)議 -t
protocol TCP
#負(fù)載均衡的真實(shí)服務(wù)器背亥,也就是nginx節(jié)點(diǎn)的具體的真實(shí)ip地址
real_server 192.168.1.171 80 {
#輪詢的默認(rèn)權(quán)重配比設(shè)置為1
weight 1
#設(shè)置健康檢查
TCP_CHECK {
#檢查的80端口
connect_port 80
#超時時間
connect_timeout 2
# 重試次數(shù) 2次
nb_get_retry 2
# 間隔時間 3秒
delay_before_retry 3
}
}
real_server 192.168.1.172 80 {
weight 1
#設(shè)置健康檢查
TCP_CHECK {
#檢查的80端口
connect_port 80
#超時時間
connect_timeout 2
# 重試次數(shù) 2次
nb_get_retry 2
# 間隔時間 3秒
delay_before_retry 3
}
}
}
清空規(guī)則
ipvsadm -C
重啟
systemctl restart keepalived
10秒际、Keepalived+LVS,備配置
修改Keepalived的配置文件
global_defs {
router_id LVS_152
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 41
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.150
}
}
#配置集群地址訪問的IP+端口狡汉,端口和nginx保持一致娄徊,都是80
virtual server 192.168.1.150 80 {
# 健康檢查的時問,單位:秒
delay_loop 6
#配置負(fù)載均衡的算法盾戴,默認(rèn)是輪詢
lb_algo rr
# 設(shè)置LVS的模式 NAT | TUN | DR
lb_kind DR
# 設(shè)置會話持久化的事件
persistence_timeout 5
#協(xié)議 -t
protocol TCP
#負(fù)載均衡的真實(shí)服務(wù)器寄锐,也就是nginx節(jié)點(diǎn)的具體的真實(shí)ip地址
real_server 192.168.1.171 80 {
#輪詢的默認(rèn)權(quán)重配比設(shè)置為1
weight 1
#設(shè)置健康檢查
TCP_CHECK {
#檢查的80端口
connect_port 80
#超時時間
connect_timeout 2
# 重試次數(shù) 2次
nb_get_retry 2
# 間隔時間 3秒
delay_before_retry 3
}
}
real_server 192.168.1.172 80 {
weight 1
#設(shè)置健康檢查
TCP_CHECK {
#檢查的80端口
connect_port 80
#超時時間
connect_timeout 2
# 重試次數(shù) 2次
nb_get_retry 2
# 間隔時間 3秒
delay_before_retry 3
}
}
}
清空規(guī)則
ipvsadm -C
重啟
systemctl restart keepalived