Keepalived
1、概述
keepalived是為lvs設(shè)計(jì)的,用于管理和監(jiān)控lvs集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài),后面又加入了VRRP虛擬路由冗余協(xié)議,可以實(shí)現(xiàn)路由器高可用,原理是多臺(tái)提供路由功能的服務(wù)器組成一個(gè)路由組,一個(gè)master和多個(gè)backup,master有vip,可以發(fā)組播,當(dāng)backup收不到就認(rèn)為master掛了,這時(shí)候需要優(yōu)先級(jí)確認(rèn)下一位master這樣就可以保證路由的高可用(lvs是通過(guò)ip公網(wǎng)訪問(wèn),lvs調(diào)度私網(wǎng)web服務(wù)器。DR模式有vip,web壞掉一臺(tái),另一臺(tái)還是可以訪問(wèn)的,lvs調(diào)度服務(wù)器掛了就不行了,lvs加上keepalived的話,keepalived就相當(dāng)于配置了lvs的多個(gè)備份,壞掉一臺(tái),另一臺(tái)頂上去)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-733560.html
Keepalived除了能夠管理LVS軟件外,還可以作為其他服務(wù)(例如:Nginx、Haproxy、MySQL、vsnfsd等)的高可用解決方案軟件文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-733560.html
2、配置文件說(shuō)明
! Configuration File for keepalived
#發(fā)送郵件的配置
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
}
#vrrp協(xié)議的配置
vrrp_instance VI_1 {
#工作模式
state MASTER
#監(jiān)聽的網(wǎng)卡
interface ens33
#虛擬路由id 需要和備服務(wù)器一致
virtual_router_id 51
#權(quán)重 優(yōu)先級(jí)
priority 100
#vrrp包的發(fā)送周期 1s
advert_int 1
#權(quán)限驗(yàn)證
authentication {
auth_type PASS
auth_pass 1111
}
#需要綁定切換的VIP
virtual_ipaddress {
192.168.1.200
}
}
3、簡(jiǎn)潔版配置過(guò)程
keepalived 用于管理和監(jiān)控lvs集群,并具有vrrp虛擬路由冗余協(xié)議,可以實(shí)現(xiàn)路由器的高可用
主配置文件 /etc/keepalived/keepalived.conf
VRRP出現(xiàn)的目的就是為了解決靜態(tài)路由單點(diǎn)故障問(wèn)題的,它能夠保證當(dāng)個(gè)別節(jié)點(diǎn)宕機(jī)時(shí),整個(gè)網(wǎng)絡(luò)可以不間斷地運(yùn)行。
keepalived+lvs(DR模式)配置過(guò)程
1.lvs服務(wù)器配置
安裝ipvsadm,開啟ip_vs模塊
配置vip(虛擬ip)地址
配置bl命令,完成lvs的調(diào)度功能
關(guān)閉重定向
安裝keepalived,配置/etc/keepalived/keepalived.conf文件
2.lvs備份服務(wù)器配置
安裝ipvsadm,開啟ip_vs模塊
配置vip(虛擬ip)地址
配置bl命令,完成lvs的調(diào)度功能
關(guān)閉重定向
安裝keepalived,配置/etc/keepalived/keepalived.conf文件
3.多臺(tái)web服務(wù)器配置
安裝httpd服務(wù),并配置網(wǎng)頁(yè)
關(guān)閉重定向
配置vip(虛擬ip)地址
4. 啟動(dòng)兩臺(tái)lvs服務(wù)器 (主lvs先啟動(dòng))
5.測(cè)試
[root@hd1 ~]# ip addr|grep 1.113
inet 192.168.1.113/32 scope global ens33
[root@hd8 ~]# curl 192.168.1.113
this is 192.168.1.13
6.驗(yàn)證keepalived的高可用性
停掉192.168.1.11的keepalived的服務(wù)
[root@hd1 ~]# systemctl stop keepalived(keepalived.server)
查看vip地址現(xiàn)在在哪里?(應(yīng)該在192.168.1.12上)
[root@hd2 ~]# ip addr |grep 1.113
inet 192.168.1.113/32 scope global ens33
通過(guò)客戶端繼續(xù)訪問(wèn)192.168.1.113 還是可以正常訪問(wèn) 后臺(tái)的1.13和1.14的
高可用配置
4、keepalived+lvs配置
Keepalived軟件起初是專為L(zhǎng)VS負(fù)載均衡軟件設(shè)計(jì)的,用來(lái)管理并監(jiān)控LVS集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài),后來(lái)又加入了可以實(shí)現(xiàn)高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作為其他服務(wù)(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件
keepalived是以VRRP協(xié)議為基礎(chǔ)實(shí)現(xiàn)的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗余協(xié)議 (冗余:多個(gè))
虛擬路由冗余協(xié)議,
可以認(rèn)為是實(shí)現(xiàn)路由器高可用的協(xié)議,即將N臺(tái)提供相同功能的路由器組成一個(gè)路由器組,這個(gè)組里面有一個(gè)master和多個(gè)backup,master上面有一個(gè)對(duì)外提供服務(wù)的vip(該路由器所在局域網(wǎng)內(nèi)其他機(jī)器的默認(rèn)路由為該vip),master會(huì)發(fā)組播,當(dāng)backup收不到vrrp包時(shí)就認(rèn)為master宕掉了,這時(shí)就需要根據(jù)VRRP的優(yōu)先級(jí)來(lái)選舉一個(gè)backup當(dāng)master。這樣的話就可以保證路由器的高可用了。
keepalived主要有三個(gè)模塊,分別是core、check和vrrp。
core模塊為keepalived的核心,負(fù)責(zé)主進(jìn)程的啟動(dòng)、維護(hù)以及全局配置文件的加載和解析。
check負(fù)責(zé)健康檢查,包括常見的各種檢查方式。
vrrp模塊是來(lái)實(shí)現(xiàn)VRRP協(xié)議的。
3、keepalived組成和原理
Keepalived軟件主要是通過(guò)VRRP協(xié)議實(shí)現(xiàn)高可用功能的。
作用:VRRP的目的是為了解決靜態(tài)路由單點(diǎn)故障問(wèn)題,它能夠保證當(dāng)個(gè)別節(jié)點(diǎn)宕機(jī)時(shí),整個(gè)網(wǎng)絡(luò)可以不間斷地運(yùn)行。
Keepalived的功能體系結(jié)構(gòu),大致分兩層:用戶空間(user space)和內(nèi)核空間(kernel space)。
keepalived的配置文件
keepalived只有一個(gè)配置文件
/etc/keepalived/keepalived.conf
里面主要包括以下幾個(gè)配置區(qū)域,分別是
global_defs、
static_ipaddress、
static_routes、
vrrp_script、
vrrp_instance和virtual_server。
環(huán)境準(zhǔn)備
四臺(tái)服務(wù)器
主lvs 192.168.8.11 vip 192.168.8.111
備lvs 192.168.8.12 vip 192.168.8.111
web1 192.168.8.138 vip 192.168.8.111
web2 192.168.8.139 vip 192.168.8.111
主lvs
root@hd1 ~]#yum -y install ipvsadm
root@hd1 ~]#modprobe ip_vs
root@hd1 ~]#cat /proc/net/ip_vs
配置關(guān)閉icmp重定向
echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects
cat /proc/sys/net/ipv4/conf/all/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/ens33/send_redirects
安裝keepalived
[root@hd1 ~]# yum -y install keepalived
配置keepalived的主配置文件
清空配置文件的內(nèi)容
[root@hd1 ~]# > /etc/keepalived/keepalived.conf
[root@hd1 ~]# cat /etc/keepalived/keepalived.conf
! 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_DEVEL1
}
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.8.111
}
}
virtual_server 192.168.8.111 80 {
delay_loop 6
lb_algo rr
lb_kind DR
net_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.8.138 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
real_server 192.168.8.139 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
第二臺(tái)lvs192.168.1.12的配置
安裝工具包
[root@hd2 ~]# yum -y install ipvsadm
[root@hd2 ~]# modprobe ip_vs
[root@hd2 ~]# cat /proc/net/ip_vs
配置關(guān)閉icmp重定向
echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects
cat /proc/sys/net/ipv4/conf/all/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/ens33/send_redirects
安裝keepalived
[root@hd2 ~]# yum -y install keepalived
配置keepalived的配置文件
[root@hd2 ~]# > /etc/keepalived/keepalived.conf
[root@hd2 ~]# cat /etc/keepalived/keepalived.conf
! 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_DEVEL2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90 #優(yōu)先級(jí)要變低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.111
}
}
virtual_server 192.168.8.111 80 {
delay_loop 6
lb_algo rr
lb_kind DR
net_mask 255.255.255.0
persistence_timeout 50 #持續(xù)的超時(shí)時(shí)間50s
protocol TCP
real_server 192.168.8.138 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
real_server 192.168.8.139 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
配置192.168.1.13為web1服務(wù)器
[root@hd3 ~]# yum -y install httpd
[root@hd3 ~]# echo "this is the web1 " >/var/www/html/index.html
[root@hd3 ~]# systemctl start httpd
[root@hd3 ~]# yum -y install net-tools
[root@hd3 ~]#ifconfig lo:0 192.168.8.111 broadcast 192.168.8.111 netmask 255.255.255.255 up
[root@hd3 ~]#route add -host 192.168.8.111 dev lo:0
vi /etc/sysctl.conf
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
7>重啟
sysctl -p
2. 配置192.168.1.14為web2服務(wù)器
[root@hd4 ~]# yum -y install httpd
[root@hd4 ~]# echo "this is the web2 " >/var/www/html/index.html
[root@hd4 ~]# systemctl start httpd
[root@hd4 ~]# yum -y install net-tools
[root@hd4 ~]#ifconfig lo:0 192.168.8.111 broadcast 192.168.8.111 netmask 255.255.255.255 up
[root@hd4 ~]#route add -host 192.168.8.111 dev lo:0
[root@hd4 ~]#vi /etc/sysctl.conf
net.ipv4.conf.ens33.arp_ignore = 1
net.ipv4.conf.ens33.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
重啟
[root@hd4 ~]#sysctl -p
5. 啟動(dòng)兩臺(tái)lvs服務(wù)器 (主lvs先啟動(dòng))
在主lvs192.168.1.11上
[root@hd1 ~]# systemctl start keepalived
在備lvs192.168.1.12上
[root@hd2 ~]# systemctl start keepalived
6.測(cè)試
查看vip地址是否落到了192.168.1.11上
[root@hd1 ~]# ip addr|grep 1.113
inet 192.168.1.113/32 scope global ens33
[root@hd8 ~]# curl 192.168.1.113
this is 192.168.1.13
7.驗(yàn)證keepalived的高可用性
停掉192.168.1.11的keepalived的服務(wù)
[root@hd1 ~]# systemctl stop keepalived(keepalived.server)
查看vip地址現(xiàn)在在哪里?(應(yīng)該在192.168.1.12上)
[root@hd2 ~]# ip addr |grep 1.113
inet 192.168.1.113/32 scope global ens33
通過(guò)客戶端繼續(xù)訪問(wèn)192.168.1.113 還是可以正常訪問(wèn) 后臺(tái)的1.13和1.14的
5、主lvs不可用 可能性
服務(wù)器整機(jī)不可用,常見于服務(wù)器斷網(wǎng),或者斷電關(guān)機(jī)等。
方法一:模擬主服務(wù)器斷電關(guān)閉
#關(guān)閉主服務(wù)器 VIP所在服務(wù)器
shell > poweroff
方法二:模擬主服務(wù)器斷網(wǎng)
#關(guān)閉VIP所在服務(wù)器的網(wǎng)卡 使其不能夠聯(lián)網(wǎng)
shell > service network stop
方法三:停掉主服上keepalived服務(wù)
shell > systemctl stop keepalived
通過(guò)以上實(shí)驗(yàn)檢測(cè),發(fā)現(xiàn)當(dāng)主服務(wù)器整機(jī)不可用時(shí),VIP會(huì)切換到備用服務(wù)器
6、防止腦裂,解決方式
四、實(shí)現(xiàn)服務(wù)HA
默認(rèn)keepalived實(shí)現(xiàn)的是服務(wù)器的高可用,并沒(méi)有實(shí)現(xiàn)基于某個(gè)程序的高可用(nginx、lvs)
但是實(shí)際情況下,往往并不是服務(wù)器整機(jī)不可用,只是對(duì)應(yīng)的服務(wù)或者軟件不可用。
比如說(shuō):lvs提供負(fù)載均衡,lvs down掉了,但是主服務(wù)器依然可用,vip地址還在本地
實(shí)現(xiàn)過(guò)程分析:
VIP實(shí)際是由keepalived進(jìn)行綁定的,所以當(dāng)nginx服務(wù)不可用時(shí),就關(guān)閉當(dāng)前機(jī)器的keepalived即可,釋放VIP。進(jìn)而綁定到其他備用服務(wù)器。
①編寫服務(wù)檢測(cè)腳本,實(shí)現(xiàn)檢測(cè)nginx是否可用,不可用則關(guān)閉當(dāng)前所在主機(jī)的keepalived
②在keepalived配置中調(diào)用檢測(cè)服務(wù)腳本
1、Nginx服務(wù)可用檢測(cè)腳本
主備服務(wù)器都要實(shí)現(xiàn)此腳本
①編寫測(cè)試腳本 賦予執(zhí)行權(quán)限
shell > cd /etc/keepalived
shell > vim check_nginx.sh
腳本內(nèi)容:
#!/bin/bash
nginx_status=`ps -C nginx --no-header | wc -l`
if [ $nginx_status -eq 0 ];then
systemctl stop keepalived
fi
賦予腳本執(zhí)行權(quán)限 方便之后其他軟件調(diào)用執(zhí)行
shell > chmod +x check_nginx.sh
②測(cè)試腳本可用性
啟動(dòng)nginx和keepalived
關(guān)閉nginx 執(zhí)行腳本 查看keepalived是否也關(guān)閉
2、模擬宕機(jī)實(shí)現(xiàn)服務(wù)切換
在多臺(tái)服務(wù)器中配置keepalived定時(shí)觸發(fā)檢測(cè)nginx的腳本模塊
#在vrrp_instance外上面定義
vrrp_script check_nginx {
#調(diào)用腳本地址
script /etc/keepalived/check_nginx.sh
#檢測(cè)間隔時(shí)間
interval 3
}
#在vrrp_instance里調(diào)用
track_script {
#上線定義的名稱
check_nginx
}
3、實(shí)現(xiàn)web服務(wù)器高可用
以上案例已經(jīng)實(shí)現(xiàn)了,服務(wù)不可用VIP切換到可用服務(wù)器。
現(xiàn)在需求用戶的服務(wù)是連續(xù)不間斷的,故用戶需要通過(guò)VIP進(jìn)行訪問(wèn)
①解析域名到VIP
②模擬用戶訪問(wèn)
7、keepalived的配置補(bǔ)充
五、keepalived的配置補(bǔ)充
腦裂(裂腦):vip出現(xiàn)在了多臺(tái)機(jī)器上。網(wǎng)絡(luò)不通暢,禁用了數(shù)據(jù)包,主備服務(wù)器沒(méi)法通訊,造成備服務(wù)器認(rèn)為主服務(wù)器不可用,綁定VIP,主服務(wù)器VIP不會(huì)釋放。
解決方案:
①雙備或者多備模式 BACKUP 通過(guò)priority權(quán)重來(lái)區(qū)分誰(shuí)的優(yōu)先級(jí)更高
②單播(定向廣播)的方式 (一些特定環(huán)境禁用了組播方式)
③時(shí)間不同步 服務(wù)器時(shí)間校時(shí)
1、非搶占模式
①nopreempt
在主備服務(wù)器的配置文件,vrrp_instance段中
②設(shè)置state工作模式為BACKUP
兩個(gè)keepalived節(jié)點(diǎn)都啟動(dòng)后,默認(rèn)都是BACKUP狀態(tài),雙方在發(fā)送組播信息后,會(huì)根據(jù)優(yōu)先級(jí)來(lái)選舉一個(gè)MASTER出來(lái)。由于兩者都配置了nopreempt,所以MASTER從故障中恢復(fù)后,不會(huì)搶占vip。這樣會(huì)避免VIP切換可能造成的服務(wù)延遲。
2、單播模式
一些特定環(huán)境下不允許發(fā)送組播,造成備服務(wù)器無(wú)法收到vrrp包,可能會(huì)造成腦裂現(xiàn)象??梢酝ㄟ^(guò)單播的方式解決。
單播示例配置:注意此語(yǔ)法在keepalived1.2.11版本以上支持
unicast_src_ip 192.168.1.10##(本地IP地址)
unicast_peer {
192.168.1.11##(對(duì)端IP地址)此地址一定不能忘記
}
主服務(wù)器server01配置
#在vrrp_instace段中加入
#本地IP
unicast_src_ip 192.168.1.11
unicast_peer {
#對(duì)象IP 發(fā)送vrrp包給備服務(wù)器
192.168.1.10
}
備服務(wù)器server03配置
#在vrrp_instace段中加入
#本地IP
unicast_src_ip 192.168.1.10
unicast_peer {
#對(duì)象IP 發(fā)送vrrp包給備服務(wù)器
192.168.1.11
}
tcpdump抓vrrp包的方式:
shell > tcpdump vrrp -n -i ens33
keepalived+nginx 高可用配置
所有的請(qǐng)求流量,都要經(jīng)過(guò)負(fù)載均衡服務(wù)器,負(fù)載均衡服務(wù)器壓力很大,防止它宕機(jī),導(dǎo)致后端服務(wù)所有都不可用,需要對(duì)負(fù)載均衡服務(wù)器,做高可用
給負(fù)載均衡服務(wù)器做一臺(tái)備用服務(wù)器,通過(guò)keepalived實(shí)現(xiàn)高可用。
通過(guò)keepalived實(shí)現(xiàn)VIP在負(fù)載均衡服務(wù)器組的切換。
server03 master LB 192.168.1.11
server04 backup LB 192.168.1.14
主負(fù)載均衡的keepalived配置
vrrp_instance VI_1 {
state BACKUP
interface eth0
#虛擬路由ID 新ID 不要之前的沖突
virtual_router_id 52
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#添加新VIP
192.168.1.100
}
track_script {
check_nginx
}
}
備負(fù)載均衡的keepalived配置
vrrp_instance VI_1 {
state BACKUP
interface eth0
#修改route_id
virtual_router_id 52
priority 99
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#unicast_src_ip 192.168.1.12
#unicast_peer {
# 192.168.1.11
#}
virtual_ipaddress {
#新VIP
192.168.1.100
}
track_script {
check_nginx
}
}
nginx的負(fù)載均衡
負(fù)載均衡
負(fù)載均衡:分發(fā)流量、請(qǐng)求到不同的服務(wù)器。使流量平均分配(理想的狀態(tài)的)
作用:服務(wù)器容災(zāi) 流量分發(fā)
主要作用:
①流量分發(fā) 請(qǐng)求平均 降低單例壓力
其他作用:
②安全 隱藏后端真實(shí)服務(wù)
③屏蔽非法請(qǐng)求(七層負(fù)載均衡)
實(shí)現(xiàn)方式分類:
①軟件級(jí)別 性價(jià)比高 可控性強(qiáng)
②硬件級(jí)別 性能好 價(jià)格高 幾萬(wàn)到幾十萬(wàn)不等
硬件是實(shí)現(xiàn)方式:
F5 BIG-IP 四層和七層
七層 Nginx、HAProxy
四層 LVS、HAProxy、Nginx(1.9版本后)
1)二層負(fù)載均衡(mac)
根據(jù)OSI模型分的二層進(jìn)行負(fù)載,一般是用虛擬mac地址方式,外部對(duì)虛擬MAC地址請(qǐng)求,負(fù)載均衡接收后,再分配后端實(shí)際的MAC地址響應(yīng)
2)三層負(fù)載均衡(ip)
一般采用虛擬IP地址方式,外部對(duì)虛擬的ip地址請(qǐng)求,負(fù)載均衡接收后,再分配后端實(shí)際的IP地址響應(yīng)
3)四層負(fù)載均衡(tcp) 網(wǎng)絡(luò)運(yùn)輸層面的負(fù)載均衡
在三層負(fù)載均衡的基礎(chǔ)上,用ip+port接收請(qǐng)求,再轉(zhuǎn)發(fā)到對(duì)應(yīng)的機(jī)器
4)七層負(fù)載均衡(http) 智能型負(fù)載均衡
根據(jù)虛擬的url或IP,主機(jī)接收請(qǐng)求,再轉(zhuǎn)向(反向代理)相應(yīng)的處理服務(wù)器
架構(gòu)分析:
①用戶訪問(wèn)請(qǐng)求Nginx負(fù)載均衡服務(wù)器
②Nginx負(fù)載均衡服務(wù)器再分發(fā)請(qǐng)求到web服務(wù)器
實(shí)際配置負(fù)載均衡,只需修改作為負(fù)載均衡服務(wù)器的Nginx即可。
①在客戶端解析域名到負(fù)載均衡服務(wù)器
②在192.168.1.11上安裝nginx做負(fù)載均衡
[root@localhost ~]#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]#yum -y install epel-release
[root@localhost ~]#yum -y install nginx
shell > cat /etc/nginx/nginx.conf
配置文件示例:
worker_processes 1;
events {
worker_connections 1024;
}
http {
#在http段進(jìn)行配置
#分發(fā)請(qǐng)求到后端服務(wù)器
upstream shop {
#web1 server01
server 192.168.1.12;
#web2 server02
server 192.168.1.13;
}
#修改之前的shop的server段配置
server {
listen 80;
server_name www.a.com;
location / {
#匹配到上面的upstream
proxy_pass http://shop;
#以下兩條配置,實(shí)質(zhì)是設(shè)置了傳輸?shù)膆eader頭信息
#傳輸域名給后端服務(wù)器 進(jìn)行識(shí)別 方便匹配對(duì)應(yīng)server虛擬主機(jī)
proxy_set_header Host $host;
#發(fā)送客戶端IP 給后端服務(wù)器 用來(lái)方便后端服務(wù)器識(shí)別用戶真實(shí)IP
proxy_set_header X-Real-IP $remote_addr;
}
}
#重啟nginx服務(wù)
[root@localhost nginx]# systemctl restart nginx
==方法一:在不同服務(wù)器寫入不同信息==
①分別修改web服務(wù)器的信息
shell11 > echo wo shi 192.168.1.12 >>/usr/share/nginx/html/index.html
shell12 > echo wo shi 192.168.1.13 >>/usr/share/nginx/html/index.html
測(cè)試:
[root@localhost ~]# curl 192.168.1.11
wo shi 1.13
[root@localhost ~]# curl 192.168.1.11
wo shi 1.12
可以停掉其中一臺(tái)web服務(wù)器進(jìn)行測(cè)試
#停掉192.168.1.13
省略15個(gè)字......
#再次訪問(wèn)nginx負(fù)載均衡發(fā)現(xiàn) 1.13故障機(jī)器自動(dòng)被踢出,說(shuō)明nginx負(fù)載均衡默認(rèn)就具備健康檢查功能
[root@localhost ~]# curl 192.168.1.11
wo shi 1.12
[root@localhost ~]# curl 192.168.1.11
wo shi 1.12
方法二:查看后端web服務(wù)器的訪問(wèn)日志,有沒(méi)有記錄真正客戶端的ip地址
shell > cat /var/log/nginx/access.log
nginx遇到的問(wèn)題之負(fù)載均衡后獲取客戶端IP
負(fù)載均衡之后,在后端的web服務(wù)器獲取到的是負(fù)載均衡服務(wù)器的IP,而不能夠獲取到客戶端的真實(shí)IP。
需要進(jìn)行以下特殊配置:
①首先在負(fù)載均衡服務(wù)器中配置,轉(zhuǎn)發(fā)客戶端IP給后端web服務(wù)器
location{
..........
#發(fā)送客戶端IP 給后端服務(wù)器 用來(lái)方便后端服務(wù)器識(shí)別用戶真實(shí)IP
proxy_set_header X-Real-IP $remote_addr;
}
②后端web服務(wù)器需要配置,識(shí)別從負(fù)載均衡服務(wù)器傳輸過(guò)來(lái)的客戶端真實(shí)IP
set_real_ip_from 192.168.1.11;(負(fù)載均衡的ip)
官方網(wǎng)址:http://nginx.org/en/docs/http/ngx_http_realip_module.html
使用ngx_http_realip_module模塊提供的set_real_ip_from語(yǔ)法,默認(rèn)此模塊沒(méi)有安裝,需要編譯時(shí)添加編譯參數(shù)
web服務(wù)器上配置set_real_ip_from 代表從哪兒來(lái)源的IP,需要識(shí)別真實(shí)客戶端IP
示例配置:
#此配置在web服務(wù)器上的nginx
#可配置到http、server、location中,推薦配置到server中
#配置需要識(shí)別的IP來(lái)源 負(fù)載均衡的IP
set_real_ip_from 192.168.1.11;
nginx配置中upstream的server關(guān)鍵字
upstream中的分發(fā)之后的幾個(gè)關(guān)鍵字:
backup 備 其他的沒(méi)有backup標(biāo)識(shí)的都無(wú)響應(yīng),才分發(fā)到backup
down 此條配置,不會(huì)被分發(fā)到
upstream shop {
server 192.168.1.12 ;
server 192.168.1.13 backup;
}
nginx遇到的問(wèn)題之 session一致性問(wèn)題
訪問(wèn)管理后端頁(yè)面,登錄發(fā)現(xiàn)驗(yàn)證碼不通過(guò)
分析原因:
①比如分發(fā)到web1服務(wù)器,生成驗(yàn)證碼,存儲(chǔ)到session中,默認(rèn)在服務(wù)器本地
②再次校驗(yàn)的時(shí)候,請(qǐng)求分發(fā)到web2服務(wù)器了,所有驗(yàn)證碼一直校驗(yàn)不通過(guò)
解決方案思路:
①生成和驗(yàn)證session都請(qǐng)求同一臺(tái)服務(wù)器
②共享session nfs mysql ==內(nèi)存緩存軟件(memcached、redis)==
Nginx的常見負(fù)載均衡算法實(shí)戰(zhàn)
Nginx 官方默認(rèn)3種負(fù)載均衡的算法
①==Round-Robin RR輪詢(默認(rèn))== 一次一個(gè)的來(lái)(理論上的,實(shí)際實(shí)驗(yàn)可能會(huì)有間隔)
②==weight 權(quán)重== 權(quán)重高多分發(fā)一些 服務(wù)器硬件更好的設(shè)置權(quán)重更高一些
③==ip_hash== 同一個(gè)IP,所有的訪問(wèn)都分發(fā)到同一個(gè)web服務(wù)器
Tip:
第三方模塊實(shí)現(xiàn)的調(diào)度算法 需要編譯安裝第三方模塊
④fair 根據(jù)后端服務(wù)器的繁忙程度 將請(qǐng)求發(fā)到非繁忙的后端服務(wù)器
⑤url_hash 如果客戶端訪問(wèn)的url是同一個(gè),將轉(zhuǎn)發(fā)到同一臺(tái)后端服務(wù)器
驗(yàn)證一:驗(yàn)證加權(quán)輪詢算法
示例配置:
upstream shop {
#web1 server01
server 192.168.1.12 weight=5;
#web2 server02
server 192.168.1.13 weight=3;
}
server01 web 1 1 1 1 1 1
server03 web 2 1 1 1
8次中,server01分發(fā)5次,server03分發(fā)3次
驗(yàn)證二:ip一致性算法
示例配置:
upstream shop {
#ip hash 一致性算法配置 設(shè)置此項(xiàng) weight就失效了
ip_hash;
#web1 server01
server 192.168.1.12 weight=5;
#web2 server02
server 192.168.1.13 weight=3;
}
nginx 四層代理,七層代理
nginx兩種反向代理區(qū)別
7層反向代理和4層反向代理
在nginx中,upstream和stream都是指向不同類型的模塊。
upstream模塊用于HTTP協(xié)議的負(fù)載均衡,主要用于將客戶端請(qǐng)求分發(fā)到多個(gè)后端服務(wù)器,從而提高系統(tǒng)的穩(wěn)定性和執(zhí)行效率。
stream模塊用于TCP/UDP協(xié)議的負(fù)載均衡,主要用于將客戶端請(qǐng)求分發(fā)到多個(gè)后端服務(wù)器,從而提高系統(tǒng)的穩(wěn)定性和執(zhí)行效率,也可以用于TCP代理和UDP代理。
因此,upstream和stream的區(qū)別在于它們適用的協(xié)議不同。
upstream適用于HTTP協(xié)議的負(fù)載均衡,stream適用于TCP/UDP協(xié)議的負(fù)載均衡和代理。
nginx做七層反向代理
以下是使用nginx做七層反向代理的步驟:
1. 安裝nginx:在Linux系統(tǒng)中使用包管理器安裝nginx,或者從官網(wǎng)下載源碼后編譯安裝。
2. 配置nginx:修改nginx配置文件,一般在/etc/nginx/nginx.conf(/usr/local/nginx/nginx.conf),增加以下內(nèi)容:
http {
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
其中,
upstream定義了后端服務(wù)器集群,
server定義了監(jiān)聽的端口和域名,
location定義了訪問(wèn)路徑。
3. 重啟nginx:執(zhí)行以下命令重啟nginx服務(wù),使新的配置生效。
# 查看nginx進(jìn)程
ps -ef | grep nginx
# 重啟nginx
/usr/local/nginx/sbin/nginx -s reload
/etc/nginx/sbin/nginx -s reload
測(cè)試反向代理:
訪問(wèn)配置的域名,可以看到nginx反向代理到后端服務(wù)器集群,將請(qǐng)求分發(fā)到多個(gè)后端服務(wù)器(負(fù)載均衡)處理,并返回響應(yīng)。
nginx做四層反向代理
以下是使用nginx做四層反向代理的步驟:
1. 安裝nginx:在Linux系統(tǒng)中使用包管理器安裝nginx,或者從官網(wǎng)下載源碼后編譯安裝。
2. 配置nginx:修改nginx配置文件,一般在/etc/nginx/nginx.conf,增加以下內(nèi)容:
stream {
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
}
server {
listen 80;
proxy_pass backend;
}
}
其中,
stream定義了四層代理,
upstream定義了后端服務(wù)器集群,
server定義了監(jiān)聽的端口和代理地址。
1. 重啟nginx:執(zhí)行以下命令重啟nginx服務(wù),使新的配置生效。
# 查看nginx進(jìn)程
ps -ef | grep nginx
# 重啟nginx
/usr/local/nginx/sbin/nginx -s reload
/etc/nginx/sbin/nginx -s reload
測(cè)試反向代理:
使用TCP客戶端工具(如telnet、netcat、nc等)連接nginx代理地址,
可以看到nginx反向代理到后端服務(wù)器集群,將請(qǐng)求分發(fā)到多個(gè)后端服務(wù)器處理,并返回響應(yīng)。
到了這里,關(guān)于keepalived高可用學(xué)習(xí) keepalived+nginx高可用負(fù)載均衡配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!