?1、簡(jiǎn)述lvs四種集群特點(diǎn)及使用場(chǎng)景
LVS集群模型分為以下四種:DR,NAT.TUN,FULL-NAT
<1>DR原理:
用戶請(qǐng)求LVS到達(dá)director,director將請(qǐng)求的報(bào)文的目標(biāo)MAC地址改成后端的realserver MAC地址,目標(biāo)IP為VIP(不變),源IP為用戶IP地址(保持不變),然后director將報(bào)文發(fā)送到realserver,realserver檢測(cè)到目標(biāo)為自己本地VIP,如果在同一個(gè)網(wǎng)段,然后將請(qǐng)求直接返給用戶答倡。如果用戶跟realserver不在-一個(gè)網(wǎng)段,則通過(guò)網(wǎng)關(guān)返回用戶
(1)Director和各RS都配置有VIP
(2)確保前端路由器將目標(biāo)IP為VIP的請(qǐng)求報(bào)文發(fā)往Director
(3)RS的RIP可以使用私網(wǎng)地址轰传,也可以是公網(wǎng)地址;RIP與DIP在同一IP網(wǎng)絡(luò)苇羡;RIP的網(wǎng)關(guān)不能指向DIP绸吸,以確保響應(yīng)報(bào)文不會(huì)經(jīng)由Director
(4)RS和Director要在同一個(gè)物理網(wǎng)絡(luò)
(5)請(qǐng)求報(bào)文要經(jīng)由Director,但響應(yīng)報(bào)文不經(jīng)由Director设江,而由RS直接發(fā)往Client
(6)不支持端口映射(端口不能修斀踝隆)
(7)RS可使用大多數(shù)OS系統(tǒng)
? <2> TUN原理:
用戶請(qǐng)求LVS到達(dá)director , director通過(guò)IP-TUN加密技術(shù)將請(qǐng)求的報(bào)文的目標(biāo)MAC地址改成后端的realserverMAC地址,目標(biāo)IP為VIP(不變),源IP為用戶IP地址(保持不變),然后director將報(bào)文發(fā)送到realserver, realserver基于IP-TUN解密,然后檢測(cè)到目標(biāo)為自己本地VIP ,如果在同一個(gè)網(wǎng)段,然后將請(qǐng)求直接返給用戶。如果用戶跟realserver不在-一個(gè)網(wǎng)段,則通過(guò)網(wǎng)關(guān)返回用戶叉存。
(1) DIP, VIP, RIP都應(yīng)該是公網(wǎng)地址
(2) RS的網(wǎng)關(guān)一般不能指向DIP
(3) 請(qǐng)求報(bào)文要經(jīng)由Director码俩,但響應(yīng)不經(jīng)由Director
(4) 不支持端口映射
(5) RS的OS須支持隧道功能
<3>NAT原理:
用戶請(qǐng)求LVS到達(dá)director ,director將請(qǐng)求的報(bào)文的目標(biāo)IP地址改成后端的realserver IP地址,同時(shí)將報(bào)文的目標(biāo)端口也改成后端選定的realserver 相應(yīng)端口,最后將報(bào)文發(fā)送到realserver,realserver將數(shù)據(jù)返給director,director再把數(shù)據(jù)發(fā)送給用戶。因?yàn)閮纱握?qǐng)求都經(jīng)過(guò)director,所以訪問(wèn)量大的話,director會(huì)成為瓶頸
? ??(1)RIP和DIP應(yīng)在同一個(gè)IP網(wǎng)絡(luò)歼捏,且應(yīng)使用私網(wǎng)地址稿存;RS的網(wǎng)關(guān)要指向DIP
????(2)請(qǐng)求報(bào)文和響應(yīng)報(bào)文都必須經(jīng)由Director轉(zhuǎn)發(fā),Director易于成為系統(tǒng)瓶頸
????(3)支持端口映射瞳秽,可修改請(qǐng)求報(bào)文的目標(biāo)PORT
????(4)VS必須是Linux系統(tǒng)瓣履,RS可以是任意OS系統(tǒng)
<4>FULLNAT原理:
通過(guò)同時(shí)修改請(qǐng)求報(bào)文的源IP地址和目標(biāo)IP地址進(jìn)行轉(zhuǎn)發(fā)的模式。此類型的模式练俐,默認(rèn)Kernel不支持袖迎。
(1) VIP是公網(wǎng)地址,RIP和DIP是私網(wǎng)地址腺晾,且通常不在同一IP網(wǎng)絡(luò)燕锥;因此,RIP的網(wǎng)關(guān)一般不會(huì)指向DIP
(2) RS收到的請(qǐng)求報(bào)文源地址是DIP悯蝉,因此归形,只需響應(yīng)給DIP;但Director還要將其發(fā)往Client
(3) 請(qǐng)求和響應(yīng)報(bào)文都經(jīng)由Director
(4) 支持端口映射
注意:此類型kernel默認(rèn)不支持
2鼻由、描述LVS-DR工作原理暇榴,并配置實(shí)現(xiàn)。
<1>嗡靡、客戶端的請(qǐng)求會(huì)發(fā)往Director跺撼,此時(shí),客戶端請(qǐng)求報(bào)文的源Ip為CIP讨彼,目標(biāo)Ip為Director的VIP歉井。
<2>、當(dāng)Director接受到客戶端的請(qǐng)求報(bào)文后哈误,Director會(huì)在請(qǐng)求報(bào)文外封裝一個(gè)MAC首部哩至,其源MAC為Director接口的MAC地址躏嚎,目標(biāo)MAC為選定RS的MAC地址;
<3>菩貌、當(dāng)RS收到Director轉(zhuǎn)發(fā)過(guò)來(lái)的請(qǐng)求報(bào)文后卢佣,檢查發(fā)現(xiàn)請(qǐng)求報(bào)文的目標(biāo)Ip為本地環(huán)回接口上配置的VIP,因此會(huì)接受報(bào)文進(jìn)行響應(yīng)處理箭阶。另外由于對(duì)ARP響應(yīng)規(guī)則做了修改虚茶,因此RS不會(huì)把響應(yīng)報(bào)文響應(yīng)給director ,而是響應(yīng)給GW仇参;
<4>嘹叫、客戶端接收響應(yīng)報(bào)文,完成通信诈乒。
DR模型配置:同網(wǎng)段
client端配置ip:
[root@node-1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.1.5
GATEWAY=192.168.1.6
PROFIX=24
NAME=eth0
DEVICE=eth0
ONBOOT=yes
Route配置:
[root@node-1 ~]# echo 1 >/proc/sys/net/ipv4/ip_forward
[root@node-1 ~]# sysctl -p
[root@node-1 ~]# route -n
Kernel IP routing table
Destination? ? Gateway? ? ? ? Genmask? ? ? ? Flags Metric Ref? ? Use Iface
0.0.0.0? ? ? ? 192.168.1.1? ? 0.0.0.0? ? ? ? UG? ? 0? ? ? 0? ? ? ? 0 eth1
192.168.1.0? ? 0.0.0.0? ? ? ? 255.255.255.0? U? ? 0? ? ? 0? ? ? ? 0 eth1
192.168.10.0? ? 0.0.0.0? ? ? ? 255.255.255.0? U? ? 0? ? ? 0? ? ? ? 0 eth0
RS1罩扇,RS2上面安裝httpd服務(wù):
[root@Rs1 ~]# yum install -y httpd
[root@Rs2 ~]# yum install -y httpd
配置網(wǎng)頁(yè)文件頁(yè)面:
[root@Rs1 ~]# echo Rs1 >/var/www/html/index.html
[root@Rs1 ~]# systemctl start httpd
[root@Rs2 ~]# echo Rs2 >/var/www/html/index.html
[root@Rs2 ~]# systemctl start httpd
route主機(jī)上面測(cè)試訪問(wèn)頁(yè)面:
修改Rs1,Rs2網(wǎng)卡信息,網(wǎng)關(guān)指向route
[root@Rs1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.10.6
GATEWAY=192.168.10.3
PROFIX=24
DNS=192.168.10.3
NAME=eth0
DEVICE=eth0
ONBOOT=yes
[root@Rs2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.10.5
GATEWAY=192.168.10.3
PROFIX=24
DNS=192.168.10.3
NAME=eth0
DEVICE=eth0
ONBOOT=yes
LVS服務(wù)器上面修改網(wǎng)卡信息怕磨,網(wǎng)關(guān)指向Route喂饥,配置Vip
[root@node-2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.10.4
GATEWAY=192.168.10.3
PROFIX=24
NAME=eth0
DEVICE=eth0
ONBOOT=yes
[root@node-2 ~]# ip a a 192.168.10.100/24 dev eth0
[root@node-2 ~]# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
? ? link/ether 00:0c:29:27:71:8b brd ff:ff:ff:ff:ff:ff
? ? inet 192.168.10.4/24 brd 192.168.10.255 scope global eth0
? ? ? valid_lft forever preferred_lft forever
? ? inet 192.168.10.100/24 scope global secondary eth0
? ? ? valid_lft forever preferred_lft forever
? ? inet6 fe80::20c:29ff:fe27:718b/64 scope link
? ? ? valid_lft forever preferred_lft forever
Rs1,Rs2上面使用腳本配置vip,關(guān)閉arp響應(yīng):
[root@Rs2 ~]# vim rs.sh
#!/bin/bash
vip=192.168.10.100
mask='255.255.255.255'
dev=lo:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
[root@Rs2 ~]# bash rs.sh start
[root@Rs2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
? ? link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
? ? inet 127.0.0.1/8 scope host lo
? ? ? valid_lft forever preferred_lft forever
? ? inet 192.168.10.100/32 scope global lo:1
? ? ? valid_lft forever preferred_lft forever
? ? inet6 ::1/128 scope host
? ? ? valid_lft forever preferred_lft forever
LVS服務(wù)器上面安裝ipvsadm軟件:
[root@node-2 ~]# yum install -y ipvsadm
配置lvs規(guī)則:
[root@Lvs ~]# ipvsadm -A -t 192.168.10.100:80 -s wrr
[root@Lvs ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.5
[root@Lvs ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.6
[root@Lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
? -> RemoteAddress:Port? ? ? ? ? Forward Weight ActiveConn InActConn
TCP? 192.168.10.100:80 wrr
? -> 192.168.10.5:80? ? ? ? ? ? ? Route? 1? ? ? 0? ? ? ? ? 0? ? ? ?
? -> 192.168.10.6:80? ? ? ? ? ? ? Route? 1? ? ? 0? ? ? ? ? 0? ? ? ?
在client端測(cè)試:
3肠鲫、實(shí)現(xiàn)LVS+Keepalived高可用员帮。
在keepalive-master和keepalive-slave上面安裝keepalive軟件:
[root@Keep-Master ~]# yum install -y keepalived
[root@Keep-Slave ~]# yum install -y keepalived
啟動(dòng)keepalive服務(wù),設(shè)為開(kāi)機(jī)啟動(dòng):
[root@Keep-Master ~]# systemctl start keepalived
[root@Keep-Master ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@Keep-Master ~]#
[root@Keep-Slave ~]# systemctl start keepalived
[root@Keep-Slave ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@Keep-Slave ~]#
安裝ipvsadm軟件用來(lái)檢查ipvs規(guī)則:
[root@Keep-Master ~]# yum install -y ipvsadm
[root@Keep-Slave~]# yum install -y ipvsadm
Web-1和Web-2安裝nginx:
[root@Web-1 ~]# yum install -y nginx
[root@Web-2 ~]# yum install -y nginx
啟動(dòng)nginx服務(wù):修改配置文件导饲,準(zhǔn)備配置頁(yè)面:
[root@Web-1 ~]# systemctl start nginx
[root@Web-1 ~]# systemctl enable nginx
[root@Web-2 ~]# systemctl start nginx
[root@Web-2 ~]# systemctl enable nginx
準(zhǔn)備頁(yè)面文件:
[root@Web-1 ~]# vim /usr/share/nginx/html/index.html
<h1>Web-1</h1>
[root@Web-2 ~]# vim /usr/share/nginx/html/index.html
<h1>Web-2</h1>
測(cè)試訪問(wèn):
[root@Web-2 ~]# curl 192.168.10.6
<h1>Web-2</h1>
[root@Web-2 ~]# curl 192.168.10.5
<h1>Web-1</h1>
在兩臺(tái)RS(Web-1集侯,Web-2)上面編輯vip配置腳本;
[root@Web-1 ~]# cat RS.sh
#!/bin/bash
VIP=192.168.1.100
case "$1" in
start)
? ? ? 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)
? ? ? ifconfig lo:0 down
? ? ? 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
[root@Web-1 ~]# chmod 755 RS.sh
[root@Web-1 ~]# vim RS.sh
[root@Web-2 ~]# bash RS.sh start
RealServer Start OK
檢查VIP配置情況:
[root@Web-1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
? ? link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
? ? inet 127.0.0.1/8 scope host lo
? ? ? valid_lft forever preferred_lft forever
? ? inet 192.168.1.100/32 brd 192.168.1.100 scope global lo:0
? ? ? valid_lft forever preferred_lft forever
? ? inet6 ::1/128 scope host
? ? ? valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
? ? link/ether 00:0c:29:25:d8:b3 brd ff:ff:ff:ff:ff:ff
? ? inet 192.168.10.5/24 brd 192.168.10.255 scope global eth0
? ? ? valid_lft forever preferred_lft forever
? ? inet6 fe80::20c:29ff:fe25:d8b3/64 scope link
? ? ? valid_lft forever preferred_lft forever
[root@Web-1 ~]#
配置Keepalived服務(wù)器:Master
cd /etc/keepalived
#備份默認(rèn)的keepalived配置
mv keepalived.conf keep-back.conf
vim keepalived.conf
global_defs {
vrrp_instance VI_1 {
? ? state MASTER? #指定Keepalived的角色,MASTER為主帜消,BACKUP為備 記得大寫
? ? interface eth0? #網(wǎng)卡id 不同的電腦網(wǎng)卡id會(huì)有區(qū)別 可以使用:ip a查看
? ? virtual_router_id 10? #虛擬路由編號(hào),主備要一致
? ? priority 100? #定義優(yōu)先級(jí)浓体,數(shù)字越大泡挺,優(yōu)先級(jí)越高,主DR必須大于備用DR
? ? advert_int 1? #檢查間隔命浴,默認(rèn)為1s
? ? authentication {? #這里配置的密碼最多為8位娄猫,主備要一致,否則無(wú)法正常通訊
? ? ? ? auth_type PASS
? ? ? ? auth_pass 123456
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.10.100? #定義虛擬IP(VIP)為192.168.1.200生闲,可多設(shè)媳溺,每行一個(gè)
? ? }
}
# 定義對(duì)外提供服務(wù)的LVS的VIP以及port
virtual_server 192.168.10.100 80 {
? ? delay_loop 6 # 設(shè)置健康檢查時(shí)間,單位是秒
? ? lb_algo rr # 設(shè)置負(fù)載調(diào)度的算法為wlc
? ? lb_kind DR # 設(shè)置LVS實(shí)現(xiàn)負(fù)載的機(jī)制碍讯,有NAT悬蔽、TUN、DR三個(gè)模式
? ? nat_mask 255.255.255.0
? ? persistence_timeout 0
? ? protocol TCP
? ? real_server 192.168.10.5 80 {? # 指定real server1的IP地址
? ? ? ? weight 3? # 配置節(jié)點(diǎn)權(quán)值捉兴,數(shù)字越大權(quán)重越高
? ? ? ? TCP_CHECK {
? ? ? ? connect_timeout 10
? ? ? ? nb_get_retry 3
? ? ? ? delay_before_retry 3
? ? ? ? connect_port 80
? ? ? ? }
? ? }
? ? real_server 192.168.10.6 80 {? # 指定real server2的IP地址
? ? ? ? weight 3? # 配置節(jié)點(diǎn)權(quán)值蝎困,數(shù)字越大權(quán)重越高
? ? ? ? TCP_CHECK {
? ? ? ? connect_timeout 10
? ? ? ? nb_get_retry 3
? ? ? ? delay_before_retry 3
? ? ? ? connect_port 80
? ? ? ? }
? ? }
}
配置Keepalive服務(wù)器:Slave
cd /etc/keepalived
#備份默認(rèn)的keepalived配置
mv keepalived.conf keep-back.conf
vim keepalived.conf
global_defs {
vrrp_instance VI_1 {
? ? state BACKUP #指定Keepalived的角色录语,MASTER為主,BACKUP為備 記得大寫
? ? interface eth0? #網(wǎng)卡id 不同的電腦網(wǎng)卡id會(huì)有區(qū)別 可以使用:ip a查看
? ? virtual_router_id 10? #虛擬路由編號(hào)禾乘,主備要一致
? ? priority 90? #定義優(yōu)先級(jí)澎埠,數(shù)字越大,優(yōu)先級(jí)越高始藕,主DR必須大于備用DR
? ? advert_int 1? #檢查間隔蒲稳,默認(rèn)為1s
? ? authentication {? #這里配置的密碼最多為8位,主備要一致伍派,否則無(wú)法正常通訊
? ? ? ? auth_type PASS
? ? ? ? auth_pass 123456
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.10.100? #定義虛擬IP(VIP)為192.168.1.200江耀,可多設(shè),每行一個(gè)
? ? }
}
# 定義對(duì)外提供服務(wù)的LVS的VIP以及port
virtual_server 192.168.10.100 80 {
? ? delay_loop 6 # 設(shè)置健康檢查時(shí)間拙已,單位是秒
? ? lb_algo rr # 設(shè)置負(fù)載調(diào)度的算法為rr
? ? lb_kind DR # 設(shè)置LVS實(shí)現(xiàn)負(fù)載的機(jī)制决记,有NAT、TUN倍踪、DR三個(gè)模式
? ? nat_mask 255.255.255.0
? ? persistence_timeout 0
? ? protocol TCP
? ? real_server 192.168.10.6 80 {? # 指定real server1的IP地址
? ? ? ? weight 3? # 配置節(jié)點(diǎn)權(quán)值系宫,數(shù)字越大權(quán)重越高
? ? ? ? TCP_CHECK {
? ? ? ? connect_timeout 10
? ? ? ? nb_get_retry 3
? ? ? ? delay_before_retry 3
? ? ? ? connect_port 80
? ? ? ? }
? ? }
? ? real_server 192.168.10.6 80 {? # 指定real server2的IP地址
? ? ? ? weight 3? # 配置節(jié)點(diǎn)權(quán)值,數(shù)字越大權(quán)重越高
? ? ? ? TCP_CHECK {
? ? ? ? connect_timeout 10
? ? ? ? nb_get_retry 3
? ? ? ? delay_before_retry 3
? ? ? ? connect_port 80
? ? ? ? }
? ? }
}
使用ipvsadm命令查看
查看vip情況:
客戶機(jī)測(cè)試:
模擬web-1故障: